Repository: pgspider/sqlite_fdw
Branch: master
Commit: ea52a24f63dd
Files: 208
Total size: 7.8 MB
Directory structure:
gitextract_jct4ly9d/
├── .dockerignore
├── .gitattributes
├── .github/
│ └── workflows/
│ └── CI.yml
├── .gitignore
├── GIS.md
├── GitHubActions/
│ ├── README.md
│ ├── build_postgis.sh
│ ├── build_postgres.sh
│ ├── build_sqlite_fdw.sh
│ ├── detect_targets.sh
│ ├── download_postgis.sh
│ ├── env.sh
│ ├── execute_test.sh
│ ├── install_locales.sh
│ └── install_sqlite.sh
├── License
├── META.json
├── Makefile
├── README.md
├── connection.c
├── deparse.c
├── option.c
├── sql/
│ ├── 13.15/
│ │ ├── aggregate.sql
│ │ ├── extra/
│ │ │ ├── aggregates.sql
│ │ │ ├── encodings.sql
│ │ │ ├── insert.sql
│ │ │ ├── join.sql
│ │ │ ├── limit.sql
│ │ │ ├── prepare.sql
│ │ │ ├── select.sql
│ │ │ ├── select_having.sql
│ │ │ ├── sqlite_fdw_post.sql
│ │ │ └── update.sql
│ │ ├── libsqlite.sql
│ │ ├── selectfunc.sql
│ │ ├── sqlite_fdw.sql
│ │ ├── types/
│ │ │ ├── bitstring.sql
│ │ │ ├── bool.sql
│ │ │ ├── float4.sql
│ │ │ ├── float8.sql
│ │ │ ├── int4.sql
│ │ │ ├── int8.sql
│ │ │ ├── json.sql
│ │ │ ├── macaddr.sql
│ │ │ ├── macaddr8.sql
│ │ │ ├── numeric.sql
│ │ │ ├── out_of_range.sql
│ │ │ ├── timestamp.sql
│ │ │ └── uuid.sql
│ │ ├── with_gis_support/
│ │ │ ├── auto_import.sql
│ │ │ ├── postgis.sql
│ │ │ └── type.sql
│ │ └── without_gis_support/
│ │ ├── auto_import.sql
│ │ ├── nogis.sql
│ │ └── type.sql
│ ├── 14.12/
│ │ ├── aggregate.sql
│ │ ├── extra/
│ │ │ ├── aggregates.sql
│ │ │ ├── encodings.sql
│ │ │ ├── insert.sql
│ │ │ ├── join.sql
│ │ │ ├── limit.sql
│ │ │ ├── prepare.sql
│ │ │ ├── select.sql
│ │ │ ├── select_having.sql
│ │ │ ├── sqlite_fdw_post.sql
│ │ │ └── update.sql
│ │ ├── libsqlite.sql
│ │ ├── selectfunc.sql
│ │ ├── sqlite_fdw.sql
│ │ ├── types/
│ │ │ ├── bitstring.sql
│ │ │ ├── bool.sql
│ │ │ ├── float4.sql
│ │ │ ├── float8.sql
│ │ │ ├── int4.sql
│ │ │ ├── int8.sql
│ │ │ ├── json.sql
│ │ │ ├── macaddr.sql
│ │ │ ├── macaddr8.sql
│ │ │ ├── numeric.sql
│ │ │ ├── out_of_range.sql
│ │ │ ├── timestamp.sql
│ │ │ └── uuid.sql
│ │ ├── with_gis_support/
│ │ │ ├── auto_import.sql
│ │ │ ├── postgis.sql
│ │ │ └── type.sql
│ │ └── without_gis_support/
│ │ ├── auto_import.sql
│ │ ├── nogis.sql
│ │ └── type.sql
│ ├── 15.7/
│ │ ├── aggregate.sql
│ │ ├── extra/
│ │ │ ├── aggregates.sql
│ │ │ ├── encodings.sql
│ │ │ ├── insert.sql
│ │ │ ├── join.sql
│ │ │ ├── limit.sql
│ │ │ ├── prepare.sql
│ │ │ ├── select.sql
│ │ │ ├── select_having.sql
│ │ │ ├── sqlite_fdw_post.sql
│ │ │ └── update.sql
│ │ ├── libsqlite.sql
│ │ ├── selectfunc.sql
│ │ ├── sqlite_fdw.sql
│ │ ├── types/
│ │ │ ├── bitstring.sql
│ │ │ ├── bool.sql
│ │ │ ├── float4.sql
│ │ │ ├── float8.sql
│ │ │ ├── int4.sql
│ │ │ ├── int8.sql
│ │ │ ├── json.sql
│ │ │ ├── macaddr.sql
│ │ │ ├── macaddr8.sql
│ │ │ ├── numeric.sql
│ │ │ ├── out_of_range.sql
│ │ │ ├── timestamp.sql
│ │ │ └── uuid.sql
│ │ ├── with_gis_support/
│ │ │ ├── auto_import.sql
│ │ │ ├── postgis.sql
│ │ │ └── type.sql
│ │ └── without_gis_support/
│ │ ├── auto_import.sql
│ │ ├── nogis.sql
│ │ └── type.sql
│ ├── 16.3/
│ │ ├── aggregate.sql
│ │ ├── extra/
│ │ │ ├── aggregates.sql
│ │ │ ├── encodings.sql
│ │ │ ├── insert.sql
│ │ │ ├── join.sql
│ │ │ ├── limit.sql
│ │ │ ├── prepare.sql
│ │ │ ├── select.sql
│ │ │ ├── select_having.sql
│ │ │ ├── sqlite_fdw_post.sql
│ │ │ └── update.sql
│ │ ├── libsqlite.sql
│ │ ├── selectfunc.sql
│ │ ├── sqlite_fdw.sql
│ │ ├── types/
│ │ │ ├── bitstring.sql
│ │ │ ├── bool.sql
│ │ │ ├── float4.sql
│ │ │ ├── float8.sql
│ │ │ ├── int4.sql
│ │ │ ├── int8.sql
│ │ │ ├── json.sql
│ │ │ ├── macaddr.sql
│ │ │ ├── macaddr8.sql
│ │ │ ├── numeric.sql
│ │ │ ├── out_of_range.sql
│ │ │ ├── timestamp.sql
│ │ │ └── uuid.sql
│ │ ├── with_gis_support/
│ │ │ ├── auto_import.sql
│ │ │ ├── postgis.sql
│ │ │ └── type.sql
│ │ └── without_gis_support/
│ │ ├── auto_import.sql
│ │ ├── nogis.sql
│ │ └── type.sql
│ ├── 17.0/
│ │ ├── aggregate.sql
│ │ ├── extra/
│ │ │ ├── aggregates.sql
│ │ │ ├── encodings.sql
│ │ │ ├── insert.sql
│ │ │ ├── join.sql
│ │ │ ├── limit.sql
│ │ │ ├── prepare.sql
│ │ │ ├── select.sql
│ │ │ ├── select_having.sql
│ │ │ ├── sqlite_fdw_post.sql
│ │ │ └── update.sql
│ │ ├── libsqlite.sql
│ │ ├── selectfunc.sql
│ │ ├── sqlite_fdw.sql
│ │ ├── types/
│ │ │ ├── bitstring.sql
│ │ │ ├── bool.sql
│ │ │ ├── float4.sql
│ │ │ ├── float8.sql
│ │ │ ├── int4.sql
│ │ │ ├── int8.sql
│ │ │ ├── json.sql
│ │ │ ├── macaddr.sql
│ │ │ ├── macaddr8.sql
│ │ │ ├── numeric.sql
│ │ │ ├── out_of_range.sql
│ │ │ ├── timestamp.sql
│ │ │ └── uuid.sql
│ │ ├── with_gis_support/
│ │ │ ├── auto_import.sql
│ │ │ ├── postgis.sql
│ │ │ └── type.sql
│ │ └── without_gis_support/
│ │ ├── auto_import.sql
│ │ ├── nogis.sql
│ │ └── type.sql
│ └── init_data/
│ ├── agg.data
│ ├── datetimes.data
│ ├── init.sql
│ ├── init_core.sql
│ ├── init_post.sql
│ ├── init_selectfunc.sql
│ ├── onek.data
│ ├── person.data
│ ├── streets.data
│ ├── student.data
│ └── tenk.data
├── sqlite_data_norm.c
├── sqlite_fdw--1.0--1.1.sql
├── sqlite_fdw--1.0.sql
├── sqlite_fdw.c
├── sqlite_fdw.control
├── sqlite_fdw.h
├── sqlite_fdw.vcxproj
├── sqlite_gis.c
├── sqlite_query.c
└── test.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
*.sh
fdw_rpm_with_pgspider/
fdw_rpm_with_postgres/
================================================
FILE: .gitattributes
================================================
*.c linguist-detectable=true
*.h linguist-detectable=true
expected/* linguist-detectable=false
sql/* linguist-detectable=false
*.md linguist-documentation
================================================
FILE: .github/workflows/CI.yml
================================================
name: SQLite FDW test
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
- main
jobs:
detect-pgversion:
runs-on: ubuntu-22.04
outputs:
pgversion: ${{ steps.detect-pgversion.outputs.targets }}
steps:
- uses: actions/checkout@v4
- name: detect-pgversion
id: detect-pgversion
run: |
targets=`bash GitHubActions/detect_targets.sh`
echo "targets=$targets" >> $GITHUB_OUTPUT
test:
needs: detect-pgversion
env:
SQLITE_VERSION : "3490000"
SQLITE_YEAR: "2025"
POSTGIS_VERSION : "3.4.2"
HTTP_PROXY: ""
HTTPS_PROXY: ""
SQLITE_FOR_TESTING_DIR: "/opt/CI_sqlite"
strategy:
fail-fast: false
matrix:
pg: ${{ fromJSON(needs.detect-pgversion.outputs.pgversion) }}
config: ["default", "postgis"]
name: Test on PostgreSQL ${{ matrix.pg }}, ${{ matrix.config }} mode
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: tar
run: tar zcvf sqlite_fdw.tar.gz ./*
- name: set_proxy
run: bash GitHubActions/env.sh
- name: download PostGIS, ${{ matrix.config }} mode
run: |
if [[ "${{ matrix.config }}" == "postgis" ]]; then
bash GitHubActions/download_postgis.sh ${{ env.POSTGIS_VERSION }}
fi
- name: install locales
run: bash GitHubActions/install_locales.sh
- name: build PostgreSQL ${{ matrix.pg }}
run: bash GitHubActions/build_postgres.sh ${{ matrix.pg }}
- name: install SQLite, ${{ matrix.config }} mode
run: |
if [[ "${{ matrix.config }}" == "default" ]]; then
bash GitHubActions/install_sqlite.sh ${{ env.SQLITE_VERSION }} ${{ env.SQLITE_YEAR }} ${{ matrix.config }} ${{ env.SQLITE_FOR_TESTING_DIR }}
elif [[ "${{ matrix.config }}" == "postgis" ]]; then
bash GitHubActions/install_sqlite.sh ${{ env.SQLITE_VERSION }} ${{ env.SQLITE_YEAR }} ${{ matrix.config }} ${{ env.SQLITE_FOR_TESTING_DIR }} --enable-rtree
fi
- name: build PostGIS ${{ env.POSTGIS_VERSION }} for PostgreSQL ${{ matrix.pg }}, ${{ matrix.config }} mode
run: |
if [[ "${{ matrix.config }}" == "postgis" ]]; then
bash GitHubActions/build_postgis.sh ${{ matrix.pg }} ${{ env.POSTGIS_VERSION }}
fi
- name: build sqlite_fdw, ${{ matrix.config }} mode
run: |
bash GitHubActions/build_sqlite_fdw.sh ${{ matrix.pg }} ${{ matrix.config }} ${{ env.SQLITE_FOR_TESTING_DIR }}
- name: execute sqlite_fdw test
run: bash GitHubActions/execute_test.sh ${{ matrix.pg }} ${{ matrix.config }} ${{ env.SQLITE_FOR_TESTING_DIR }}
- name: download output files (regression.diffs)
if: failure()
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.pg }}-${{ matrix.config }}-test-results
path: |
workdir/postgresql-${{ matrix.pg }}/contrib/sqlite_fdw/regression.diffs
workdir/postgresql-${{ matrix.pg }}/contrib/sqlite_fdw/regression.out
workdir/postgresql-${{ matrix.pg }}/contrib/sqlite_fdw/results
retention-days: 7
================================================
FILE: .gitignore
================================================
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Log files
log/
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
# Visual Studio related
.vs/
x64/
Debug/
Release/
================================================
FILE: GIS.md
================================================
GIS support in SQLite Foreign Data Wrapper for PostgreSQL
=========================================================
+
SQLite FDW for PostgreSQL can connect PostgreSQL with or without [PostGIS](https://www.postgis.net/)
to [SpatiaLite](https://www.gaia-gis.it/fossil/libspatialite/index) SQLite database file.
This description contains only information about GIS support without common SQL and
system descriptions from [common FDW description](README.md).
Notes about compilation environment and PROJ library
----------------------------------------------------
Both SpatiaLite and PostGIS uses [PROJ C++ library](https://github.com/OSGeo/PROJ) from
[Open Source Geospatial Foundation](https://github.com/OSGeo) for reprojecting and some calculations.
Recommended configuration of SQLite FDW with GIS support contains both SpatiaLite and PostGIS.
**It is recommended to install only 1 version of PROJ in a system to avoid integration issue**.
Before compilation you should ensure equal versions of PROJ library required by SpatiaLite and PostGIS on
your system. Otherwise some encapsualted and unwanted memory freeing errors can occur.
If you need different PROJ library versions, you can reference [this PROJ issue](https://github.com/OSGeo/PROJ/issues/4361)
and try to use something like `CFLAGS="$CFLAGS -DPROJ_RENAME_SYMBOLS -O2"` during compilation of
SpatiaLite or PostGIS to link one of this extensions with other PROJ version.
Common conditions of GIS support
--------------------------------
1. SQLite FDW should be compiled with `ENABLE_GIS=1` environment variable value.
2. You must install SpatiaLite header files before compilation.
Linux packages like `libspatialite-dev` or `libspatialite-devel` can contain this files.
3. A column should have data type (domain) name from following list:
* addbandarg
* box2d
* box3d
* geography
* geometry
* geometry_dump
* geomval
* getfaceedges_returntype
* rastbandarg
* raster
* reclassarg
* summarystats
* topoelement
* topoelementarray
* topogeometry
* unionarg
* validatetopology_returntype
Only listed data types have full data transformation support:
* geography
* geometry
All other data types (domains) are treated as PostGIS specific, but unsupported.
You can use SpatiaLite GIS data support _without PostGIS installation_ after such
SQL commands as `CREATE DOMAIN geometry AS bytea;` and `CREATE DOMAIN geography AS bytea;`.
This allows to have in PostgreSQL PostGIS compatible `bytea` data easy
convertable to PostGIS storage format.
PostGIS and SpatiaLite vector data formats
-------------------------------------------
Vector GIS data in PostGIS can be stored in a columns with `geography` or `geometry`
data type. This columns contains a binary data.
[Well-known binary (WKB)](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary)
data storage format is a standard of [Open Geospatial Consortium (OGC)](https://en.wikipedia.org/wiki/Open_Geospatial_Consortium)
and supported by [GEOS library](https://libgeos.org). PostGIS internal GIS data
storage format based on WKB with [SRID](https://en.wikipedia.org/wiki/Spatial_reference_system#Identifiers)
additions. This format is known as [EWKB](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Format_variations) and supported by
[GEOS library](https://libgeos.org) and SpatiaLite input/output functions.
Hexadecimal text representation of EWKB data is a transport form for `geography`
and `geometry` GIS data between PostgreSQL and *SpatiLite input/output functions*.
Hence no PostGIS input/output functions are necessary, but all of this functions
are supported.
EWKB hexadecimal text data transport is faster than
[EWKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry)
but slower than EWKB blob data transport.
SpatiaLite internal storage based on `blob` data [affinity](https://www.sqlite.org/datatype3.html)
and is not a standard of [OGC](https://en.wikipedia.org/wiki/Open_Geospatial_Consortium).
Also this format doesn't supported by [GEOS library](https://libgeos.org).
Limitations
-----------
* In opposition to PostGIS, **SpatiaLite doesn't allow to store any GIS vector data without SRID**.
Hence any well-formed SpatiaLite data can be converted for PostGIS, but
well-formed PostGIS data _without SRID_ cannot be converted for SpatiaLite.
All of SpatiaLite input functions will return `NULL` in this case.
Please use [ST_SetSRID PostGIS function](https://postgis.net/docs/ST_SetSRID.html)
in case of incomplete SRID data to prepare PostGIS data for importing to SpatiaLite
or comparing with SpatiaLite data.
* Only `=` PostgreSQL operator is pushed down to SQLite (SpatiaLite) for vector GIS data such
as `geography` or `geometry`. `<>` PostgreSQL operator is NOT pushed down.
End of description.
================================================
FILE: GitHubActions/README.md
================================================
# CI environment of sqlite_fdw.
Tests will be executed automatically when commited to main/master branch and when a pull request was opened/updated.
It is realized by using GitHub actions.
The CI process is defined in .github/workflows/CI.yml file.
Scripts in this directory (GitHubActions/*.sh) are referred by CI.yml.
The regression test will be executed for multi-versions of PostgreSQL.
Target versions are determined automatically based on directory names in "sql" directory.
If the regression test failed, test result files (result directory, regression.diff amd regression.out) are uploaded as artifacts.
7 days later, artifact files will be deleted.
================================================
FILE: GitHubActions/build_postgis.sh
================================================
#!/bin/bash
################################################################################
#
# This script downloads PostGIS from the official web site into ./workdir
# then builds it.
#
# Usage: ./build_postgis.sh pg_version postgis_version
# pg_version is a PostgreSQL version to be installed like 16.0.
# postgis_version is a PostGIS version to be installed.
#
# Requirements
# - be able to connect to the PostGIS official web site by wget.
#
################################################################################
POSTGRESQL_VERSION=$1
POSTGIS_VERSION=$2
# Install necessary dependencies
sudo apt update
sudo apt install -y build-essential libxml2-dev libgeos-dev libproj-dev libgdal-dev libjson-c-dev libprotobuf-c-dev protobuf-c-compiler
cd ./workdir
# Download and compile PostGIS
cp -vr postgis postgresql-${POSTGRESQL_VERSION}/contrib
cd postgresql-${POSTGRESQL_VERSION}/contrib/postgis
echo " - PostGIS directory"
GEOS_CONFIG_PATH=$(which geos-config)
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
./configure --with-pgconfig=/usr/local/pgsql/bin/pg_config --with-geosconfig=$GEOS_CONFIG_PATH
make
sudo make install
================================================
FILE: GitHubActions/build_postgres.sh
================================================
#!/bin/bash
################################################################################
#
# This script downloads PostgreSQL from the official web site into ./workdir
# then builds it.
#
# Usage: ./build_postgres.sh pg_version [configure_options]
# pg_version is a PostgreSQL version to be installed like 17.0.
# configure_options are a list of option for postgres server.
#
# Requirements
# - be able to connect to the PostgreSQL official web site by curl.
#
################################################################################
POSTGRESQL_VERSION=$1
CONFIGURE_OPTIONS=""
while (( "$#" )); do
CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS $2"
shift
done
mkdir -p ./workdir
cd ./workdir
curl -O https://ftp.postgresql.org/pub/source/v${POSTGRESQL_VERSION}/postgresql-${POSTGRESQL_VERSION}.tar.bz2
tar xjf postgresql-${POSTGRESQL_VERSION}.tar.bz2
cd postgresql-${POSTGRESQL_VERSION}
if [ -z "$CONFIGURE_OPTIONS" ]; then
./configure
else
./configure $CONFIGURE_OPTIONS
fi
make
sudo make install
sudo chown -R $USER /usr/local/pgsql
================================================
FILE: GitHubActions/build_sqlite_fdw.sh
================================================
#!/bin/bash
################################################################################
#
# This script builds sqlite_fdw in PostgreSQL source tree.
#
# Usage: ./build_sqlite_fdw.sh pg_version mode sqlite_for_testing_dir
# pg_version is a PostgreSQL version like 17.0 to be built in.
# mode is flag for sqlite_fdw compiler.
# sqlite_for_testing_dir: path to install directory of SQLite version for testing
#
# Requirements
# - the source code of sqlite_fdw is available by git clone.
# - the source code of PostgreSQL is located in ~/workdir/postgresql-{pg_version}.
# - SQLite development package is installed in a system.
################################################################################
VERSION="$1"
MODE="$2"
mkdir -p ./workdir/postgresql-${VERSION}/contrib/sqlite_fdw
tar zxf ./sqlite_fdw.tar.gz -C ./workdir/postgresql-${VERSION}/contrib/sqlite_fdw/
cd ./workdir/postgresql-${VERSION}/contrib/sqlite_fdw
# show locally compiled sqlite library
ls -la /usr/local/lib
if [ "$MODE" == "postgis" ]; then
make ENABLE_GIS=1 SQLITE_FOR_TESTING_DIR="$3"
else
make SQLITE_FOR_TESTING_DIR="$3"
fi
sudo make install
================================================
FILE: GitHubActions/detect_targets.sh
================================================
#!/bin/bash
################################################################################
#
# This script detects target PostgreSQL versions for sqlite_fdw testing from
# directory names in ./sql directory. Detected versions will be outputed to
# the standard output as an array of string like ["16.3","17.0"].
#
# Usage: ./detect_targets.sh
#
# Requirements
# - there is a directory named "sql" in a curent directory.
#
################################################################################
dirs="./sql/*"
pattern="[0-9]+\.[0-9]+"
targets="["
for pathname in $dirs; do
if [[ "$pathname" =~ $pattern ]]; then
target=`basename $pathname`
if [ "$targets" != "[" ]; then
targets+=","
fi
targets+="\"$target\""
fi
done
targets+="]"
echo "$targets"
================================================
FILE: GitHubActions/download_postgis.sh
================================================
#!/bin/bash
################################################################################
#
# This script downloads PostGIS from the official web site into ./workdir
# then builds it.
#
# Usage: ./download_postgis.sh postgis_version
# postgis_version is a PostGIS version to be installed.
#
# Requirements
# - be able to connect to the PostGIS official web site by wget.
#
################################################################################
POSTGIS_VERSION=$1
mkdir -p ./workdir
cd ./workdir
pgisfile="postgis-${POSTGIS_VERSION}.tar.gz"
if [ ! -f "$pgisfile" ]; then
wget -nv "http://download.osgeo.org/postgis/source/$pgisfile"
tar -xzf "$pgisfile"
mv postgis-${POSTGIS_VERSION} postgis -v
echo "PostGIS source code directory " $(dirname $(readlink -f postgis))
else
echo "PostGIS downloaded"
fi
================================================
FILE: GitHubActions/env.sh
================================================
#!/bin/bash
################################################################################
#
# This script configures apt.conf to set a proxy if an environment variable
# HTTP_PROXY or HTTPS_PROXY is set.
#
# Usage: ./env.sh
#
# Requirements
# - having superuser privileges
#
################################################################################
if [ -z $HTTP_PROXY ] && [ "$HTTP_PROXY" != "" ]; then
echo 'Acquire::http::proxy "$HTTP_PROXY";' | sudo tee /etc/apt/apt.conf
fi
if [ -z $HTTPS_PROXY ] && [ "$HTTPS_PROXY" != "" ]; then
echo 'Acquire::https::proxy "$HTTPS_PROXY";' | sudo tee -a /etc/apt/apt.conf
fi
================================================
FILE: GitHubActions/execute_test.sh
================================================
#!/bin/bash
################################################################################
#
# This script executes a regression test pf sqlite_fdw by calling test.sh in
# sqlite_fdw. If all tests are passed, this script will exit successfully.
# Otherwise, it will exit with failure.
# Usage: ./execute_test.sh pg_version mode sqlite_for_testing_dir
# pg_version is a PostgreSQL version to be tested like 17.0.
# mode is flag for sqlite_fdw compiler.
# sqlite_for_testing_dir: path to install directory of SQLite version for testing
#
# Requiremets
# - the source code of PostgreSQL is located in ./workdir/postgresql-{pg_version}.
# - the source code of sqlite_fdw is loacted in ./workdir/postgresql-{pg_version}/contrib/sqlite_fdw.
# - PostgreSQL and sqlite_fdw were built.
# - this script assumes that tests are passed if this file (created by executing
# the test) contains " ALL {number} tests passed" at the last or the 3rd line
# from the end.
#
################################################################################
VERSION=$1
MODE="$2"
SQLITE_FOR_TESTING_DIR="$3"
cd ./workdir/postgresql-${VERSION}/contrib/sqlite_fdw
if [ "$MODE" == "postgis" ]; then
export ENABLE_GIS=1
# Start postgres server
POSTGRES_HOME=/usr/local/pgsql
${POSTGRES_HOME}/bin/initdb ${POSTGRES_HOME}/databases
${POSTGRES_HOME}/bin/pg_ctl -D ${POSTGRES_HOME}/databases -l logfile start
# Change the testing method
sed -i 's/make check/make installcheck/' test.sh
fi
# Execute test script
chmod +x ./test.sh
./test.sh $MAKEFILE_OPT
last_line=$(tail -n 1 make_check.out)
third_line_from_the_last=$(tail -n 3 make_check.out | head -n 1)
pattern=" All [0-9]+ tests passed.+"
if [[ "$last_line" =~ $pattern ]]; then
echo "last_line"
elif [[ "$third_line_from_the_last" =~ $pattern ]]; then
echo "$third_line_from_the_last"
else
echo "Error : not All the tests passed"
echo "last line : '$last_line'"
echo "thierd_line_from_the_last : '$third_line_from_the_last'"
exit 1
fi
================================================
FILE: GitHubActions/install_locales.sh
================================================
#!/bin/bash
################################################################################
#
# This script installs some locales and language packs used by sqlite_fdw
# tests in Ubuntu.
#
# Usage: ./install_locales.sh
#
# Requirements:
# - having superuser privileges
#
################################################################################
sudo apt-get update
sudo apt-get install locales language-pack-ja
sudo locale-gen ja_JP.EUC-JP
sudo apt-get install language-pack-ko-base language-pack-ko
sudo locale-gen ko_KR.EUC-KR
sudo apt-get install language-pack-bg-base language-pack-bg
sudo locale-gen bg_BG
sudo apt-get install libreadline8 libreadline-dev
================================================
FILE: GitHubActions/install_sqlite.sh
================================================
#!/bin/bash
################################################################################
#
# This sript downloads SQLite source code from the official web site into
# ./workdir then builds and installs it.
#
# Usage: ./install_sqlite.sh version year testing_mode sqlite_for_testing_dir [configure_options]
# version: SQLite version to be installed.
# year: A year of SQLite released. It is used for determining a download URL.
# testing_mode: 'default' or 'postgis' value.
# sqlite_for_testing_dir: path to install directory of the specified SQLite version
# configure_options: are a list of option for sqlite server.
#
# Ex) ./install_sqlite.sh 3420000 2023 postgis /opt/sqlite_for_testing --enable-rtree
#
# Requirements
# - be able to connect to the SQLite official web site by curl.
# - having superuser privileges
#
################################################################################
VERSION="$1"
YEAR="$2"
TESTING_MODE="$3"
SQLITE_FOR_TESTING_DIR="$4"
CONFIGURE_OPTIONS=""
while (( "$#" )); do
CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS $5"
shift
done
echo "SQLite ver $VERSION ($YEAR), mode $TESTING_MODE, install to $SQLITE_FOR_TESTING_DIR with options $CONFIGURE_OPTIONS";
mkdir -p ./workdir
cd ./workdir
vsrc="sqlite-src-${VERSION}"
adr="https://www.sqlite.org/${YEAR}/$vsrc.zip"
echo "SQLite source code archive: $adr"
wget "$adr" -O "$vsrc.zip"
unzip "$vsrc.zip" > /dev/null
cd "$vsrc"
export CFLAGS=-DSQLITE_ENABLE_COLUMN_METADATA
confcom="./configure --enable-fts5 --prefix=$SQLITE_FOR_TESTING_DIR"
if [ ! -z "$CONFIGURE_OPTIONS" ]; then
confcom+="$CONFIGURE_OPTIONS"
fi
echo "SQLite configure call: $confcom"
$confcom
make
echo "----- SQLITE INSTALL directory $SQLITE_FOR_TESTING_DIR -----"
sudo make install
if [ "$TESTING_MODE" == "postgis" ]; then
sudo apt-get install libspatialite-dev -y
fi
================================================
FILE: License
================================================
SQLite Foreign Data Wrapper for PostgreSQL
Copyright (c) 2018, TOSHIBA CORPORATION
Copyright (c) 2011 - 2016, EnterpriseDB Corporation
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written agreement is
hereby granted, provided that the above copyright notice and this paragraph and
the following two paragraphs appear in all copies.
IN NO EVENT SHALL TOSHIBA CORPORATION BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST
PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
TOSHIBA CORPORATION HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
TOSHIBA CORPORATION SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND
TOSHIBA CORPORATION HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
================================================
FILE: META.json
================================================
{
"name": "sqlite_fdw",
"abstract": "Foreign Data Wrapper for SQLite databases",
"description": "PostgreSQL extension which implements a Foreign Data Wrapper (FDW) for SQLite databases.",
"version": "2.5.0",
"maintainer": "pgspider",
"license": "postgresql",
"provides": {
"sqlite_fdw": {
"abstract": "Foreign Data Wrapper for SQLite databases",
"file": "sqlite_fdw.c",
"docfile": "README.md",
"version": "2.5.0"
}
},
"prereqs": {
"runtime": {
"requires": {
"PostgreSQL": "9.6.0"
}
}
},
"resources": {
"bugtracker": {
"web": "http://github.com/pgspider/sqlite_fdw/issues/"
},
"repository": {
"url": "git://github.com/pgspider/sqlite_fdw.git",
"web": "https://github.com/pgspider/sqlite_fdw/",
"type": "git"
}
},
"generated_by": "David E. Wheeler",
"meta-spec": {
"version": "1.0.0",
"url": "http://pgxn.org/meta/spec.txt"
},
"tags": [
"sqlite",
"fdw",
"foreign data wrapper",
"sqlite_fdw"
]
}
================================================
FILE: Makefile
================================================
######################################################################-------------------------------------------------------------------------
#
# SQLite Foreign Data Wrapper for PostgreSQL
#
# Portions Copyright (c) 2018, TOSHIBA CORPORATION
#
# IDENTIFICATION
# Makefile
#
##########################################################################
MODULE_big = sqlite_fdw
OBJS = connection.o option.o deparse.o sqlite_query.o sqlite_fdw.o sqlite_data_norm.o sqlite_gis.o
EXTENSION = sqlite_fdw
DATA = sqlite_fdw--1.0.sql sqlite_fdw--1.0--1.1.sql
ifdef ENABLE_GIS
PG_CFLAGS += -DSQLITE_FDW_GIS_ENABLE
GIS_DEP_TESTS_DIR = with_gis_support
GIS_TEST = postgis
$(info There is PostGIS support for SQLite FDW)
else
GIS_DEP_TESTS_DIR = without_gis_support
GIS_TEST = nogis
$(info There is NO PostGIS support for SQLite FDW)
endif
# Tests for PostgreSQL data types support
DATA_TYPE_TESTS = types/bitstring types/bool types/float4 types/float8 types/int4 types/int8 types/json types/numeric types/macaddr types/macaddr8 types/out_of_range types/timestamp types/uuid
# Tests with different versions with GIS support and without GIS support
GIS_DEP_TESTS = $(GIS_DEP_TESTS_DIR)/type $(GIS_DEP_TESTS_DIR)/auto_import $(GIS_DEP_TESTS_DIR)/$(GIS_TEST)
ifndef REGRESS
# System tests, full default sequence
REGRESS = libsqlite extra/sqlite_fdw_post $(DATA_TYPE_TESTS) extra/join extra/limit extra/aggregates extra/prepare extra/select_having extra/select extra/insert extra/update extra/encodings sqlite_fdw aggregate selectfunc $(GIS_DEP_TESTS)
endif
# Other encodings also are tested. Client encoding should be UTF-8.
REGRESS_OPTS = --encoding=utf8
UNAME = uname
OS := $(shell $(UNAME))
ifeq ($(OS), Darwin)
DLSUFFIX = .dylib
else
DLSUFFIX = .so
endif
ifdef SQLITE_FOR_TESTING_DIR
SHLIB_LINK := -L$(SQLITE_FOR_TESTING_DIR)/lib -lsqlite3
PG_CFLAGS += -I$(SQLITE_FOR_TESTING_DIR)/include -Wl,-rpath,$(SQLITE_FOR_TESTING_DIR)/lib
else
SHLIB_LINK := -lsqlite3
endif
ifdef ENABLE_GIS
override SHLIB_LINK += -lspatialite
endif
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
ifndef MAJORVERSION
MAJORVERSION := $(basename $(VERSION))
endif
ifeq (,$(findstring $(MAJORVERSION), 13 14 15 16 17))
$(error PostgreSQL 13, 14, 15, 16 or 17 is required to compile this extension)
endif
else
subdir = contrib/sqlite_fdw
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
endif
ifdef REGRESS_PREFIX
REGRESS_PREFIX_SUB = $(REGRESS_PREFIX)
else
REGRESS_PREFIX_SUB = $(VERSION)
endif
REGRESS := $(addprefix $(REGRESS_PREFIX_SUB)/,$(REGRESS))
$(shell mkdir -p results/$(REGRESS_PREFIX_SUB)/extra)
$(shell mkdir -p results/$(REGRESS_PREFIX_SUB)/types)
$(shell mkdir -p results/$(REGRESS_PREFIX_SUB)/$(GIS_DEP_TESTS_DIR))
# $(info ENABLE_GIS is $(ENABLE_GIS))
# $(info SHLIB_LINK is $(SHLIB_LINK))
# $(info LD_LIBRARY_PATH is $(LD_LIBRARY_PATH))
# $(info PG_CFLAGS is $(PG_CFLAGS))
# $(info PG_CPPFLAGS is $(PG_CPPFLAGS))
# $(info REGRESS is $(REGRESS))
# $(info DLSUFFIX is $(DLSUFFIX))
ifdef ENABLE_GIS
check: temp-install
temp-install: EXTRA_INSTALL+=contrib/postgis
checkprep: EXTRA_INSTALL+=contrib/postgis
endif
================================================
FILE: README.md
================================================
SQLite Foreign Data Wrapper for PostgreSQL
==========================================
This is a foreign data wrapper (FDW) to connect [PostgreSQL](https://www.postgresql.org/)
to [SQLite](https://sqlite.org/) database file. This FDW works with PostgreSQL 13, 14, 15, 16, 17 and confirmed with SQLite 3.49.0.
+
Also this foreign data wrapper (FDW) can connect PostgreSQL with [PostGIS](https://www.postgis.net/)
to [SpatiaLite](https://www.gaia-gis.it/fossil/libspatialite/index) SQLite database file. This FDW works with PostGIS 2+ and confirmed with SpatiaLite 5.1. See [GIS support description](GIS.md).
+
Contents
--------
1. [Features](#features)
2. [Supported platforms](#supported-platforms)
3. [Installation](#installation)
4. [Usage](#usage)
5. [Functions](#functions)
6. [Identifier case handling](#identifier-case-handling)
7. [Generated columns](#generated-columns)
8. [Character set handling](#character-set-handling)
9. [Examples](#examples)
10. [Limitations](#limitations)
11. [Tests](#tests)
12. [Contributing](#contributing)
13. [Useful links](#useful-links)
Features
--------
### Common features
- Transactions
- Support `INSERT`/`UPDATE`/`DELETE` (both Direct modification and Foreign modification), see [access control](#connection-to-sqlite-database-file-and-access-control) about conditions of succesfully data modification.
- Support `TRUNCATE` by deparsing into `DELETE` statement without `WHERE` clause.
- Allow control over whether foreign servers keep connections open after transaction completion. This is controlled by `keep_connections` and defaults to on.
- Support list cached connections to foreign servers by using function `sqlite_fdw_get_connections()`
- Support discard cached connections to foreign servers by using function `sqlite_fdw_disconnect()`, `sqlite_fdw_disconnect_all()`.
- Support Bulk `INSERT` by using `batch_size` option
- Support `INSERT`/`UPDATE` with generated column
- Support `ON CONFLICT DO NOTHING`
- Support mixed SQLite [data affinity](https://www.sqlite.org/datatype3.html) input and filtering (`SELECT`/`WHERE` usage) for such data types as
- `timestamp`: `text` and `int`,
- `uuid`: `text`(32..39) and `blob`(16),
- `bool`: `text`(1..5) and `int`,
- `double precision`, `float` and `numeric`: `real` values and special values with `text` affinity (`+Infinity`, `-Infinity`, `NaN`),
- `macaddr`: `text`(12..17) or `blob`(6) or `integer`,
- `macaddr8`: `text`(16..23) or `blob`(8) or `integer`,
- `json`: `text`(default) or `blob` as SQLite `jsonb` object.
- Support mixed SQLite [data affinity](https://www.sqlite.org/datatype3.html) output (`INSERT`/`UPDATE`) for such data types as
- `timestamp`: `text`(default) or `int`,
- `uuid`: `text`(36) or `blob`(16)(default),
- `macaddr`: `text`(17) or `blob`(6) or `integer`(default),
- `macaddr8`: `text`(23) or `blob`(8) or `integer`(default).
- Full support for `+Infinity` (means ∞) and `-Infinity` (means -∞) special values for IEEE 754-2008 numbers in `double precision`, `float` and `numeric` columns including such conditions as ` n < '+Infinity'` or ` m > '-Infinity'`.
- Bidirectional data transformation for `geometry` and `geography` data types for SpatiaLite ↔ PostGIS. [EWKB](https://libgeos.org/specifications/wkb/#extended-wkb) data transport is used. See [GIS support description](GIS.md).
### Pushing down
- `WHERE` clauses are pushdowned
- Aggregate function are pushdowned
- `ORDER BY` is pushdowned
- Joins (left/right/inner/cross/semi) are pushdowned
- `CASE` expressions are pushdowned.
- `LIMIT` and `OFFSET` are pushdowned when all tables in the query are foreign tables belongs to the same PostgreSQL `FOREIGN SERVER` object.
- Support `GROUP BY`, `HAVING` push-down.
- `mod()` is pushdowned. In PostgreSQL this function gives [argument-dependend data type](https://www.postgresql.org/docs/current/functions-math.html), but result from SQLite always [have `real` affinity](https://www.sqlite.org/lang_mathfunc.html#mod).
- `=` operator for GIS data objects is pushed down.
- Operators `->` and `->>` for `json` and `jsonb` are pushed down in `WHERE` clause.
- `upper`, `lower` and other character case functions are **not** pushed down because they does not work with UNICODE character in SQLite.
- `WITH TIES` option is **not** pushed down.
- Bit string `#` (XOR) operator is **not** pushed down because there is no equal SQLite operator.
- Operations with `macaddr` or `macaddr8` data are **not** pushed down.
- GIS data oparators are **not** pushdowned except for `=`.
### Notes about pushing down
- For push-down case, the number after floating point may be different from the result of PostgreSQL.
### Notes about features
- SQLite evaluates division by zero as `NULL`. It is different from PostgreSQL, which will display `Division by zero` error.
- The data type of column of foreign table should match with data type of column in SQLite to avoid wrong result. For example, if the column of SQLite is `float` (which will be stored as `float8`), the column of foreign table should be `float8`, too. If the column of foreign table is `float4`, it may cause wrong result when `SELECT`.
- For `key` option, user needs to specify the primary key column of SQLite table corresponding with the `key` option. If not, wrong result may occur when `UPDATE` or `DELETE`.
- When `sum` function result value is out of range, `sqlite_fdw` will display `Infinity` value. It is different from PostgreSQL, which gives `ERROR: value out of range: overflow` error.
- For `numeric` data type, `sqlite_fdw` use `sqlite3_column_double` to get value, while SQLite shell uses `sqlite3_column_text` to get value. Those 2 APIs may return different numeric value. Therefore, for `numeric` data type, the value returned from `sqlite_fdw` may different from the value returned from SQLite shell.
- `sqlite_fdw` can return implementation-dependent order for column if the column is not specified in `ORDER BY` clause.
- When the column type is `varchar array`, if the string is shorter than the declared length, values of type character will be space-padded; values of type `character varying` will simply store the shorter string.
- [String literals for `boolean`](https://www.postgresql.org/docs/current/datatype-boolean.html) (`t`, `f`, `y`, `n`, `yes`, `no`, `on`, `off` etc. case insensitive) can be readed and filtred but cannot writed, because SQLite documentation recommends only `int` affinity values (`0` or `1`) for boolean data and usually text boolean data belongs to legacy datasets.
- Directry for SQLite foreign table you can use SQLite specific extractor operand for `->` or `->>` like `$.a.d[1]` in `WHERE` clause, but PostgreSQL will calculate result of equal expression in `SELECT` clause as `NULL`.
- If you will use unsupported by `sqlite_fdw` older SQLite versions from your OS, please note SQLite JSON processnig behaviour was unstable between 3.45.0 and 3.48.0 especially for negative array indexes. Please note this for explaining any unexpected results after `->` or `->>` operators or failed tests on your OS.
Also see [Limitations](#limitations)
Supported platforms
-------------------
`sqlite_fdw` was developed on Linux and should run on any
reasonably POSIX-compliant system.
Installation
------------
### Package installation
For some Linux distributives internal packages with `sqlite_fdw` are avalilable.
- [sqlite_fdw_14 rpm](https://pkgs.org/download/sqlite_fdw_14(x86-64)) for CentOS 9, RHEL 9, Rocky Linux 9, AlmaLinux 9. Also there is other versions.
- [sqlite_fdw git package](https://aur.archlinux.org/packages/sqlite_fdw) for Arch Linux.
### Source installation
Prerequisites:
* `gcc`
* `make`
* `postgresql-server-dev`, especially `postgres.h`
* `libsqlite3-dev`, especially `sqlite.h`
* `libspatialite-dev` only for `geometry` and `geography` data types support (SpatiaLite ↔ PostGIS) or for full tests
#### 1. Install SQLite & Postgres Development Libraries
For Debian or Ubuntu:
`apt-get install libsqlite3-dev`
`apt-get install postgresql-server-dev-XX`, where XX matches your postgres version, i.e. `apt-get install postgresql-server-dev-15`
`apt-get install libspatialite-dev` - for SpatiaLite ↔ PostGIS transformations
Instead of system `libsqlite3-dev` from OS repository you can also [download SQLite source code][1] and [build separate SQLite version][2] with FTS5 for full-text search. The directory of this not OS SQLite library can be pointed as prefix in a command like `./configure --enable-fts5 --prefix=$SQLITE_FOR_TESTING_DIR` before `make` and `make install`.
#### 2. Build and install sqlite_fdw
`sqlite_fdw` does not require to be compiled with PostGIS and `libspatialite-dev`. They are used only for full tests which includes test for GIS support.
Before building please add a directory of `pg_config` to PATH or ensure `pg_config` program is accessible from command line only by the name.
Build and install without GIS support
```sh
make USE_PGXS=1
make install USE_PGXS=1
```
Build and install without GIS support against separate compiled and installed SQLite version placed at given path.
Example for `/opt/testing/other/SQLite/3.49.0`.
```sh
make USE_PGXS=1 SQLITE_FOR_TESTING_DIR=/opt/testing/other/SQLite/3.49.0
make install USE_PGXS=1 SQLITE_FOR_TESTING_DIR=/opt/testing/other/SQLite/3.49.0
```
Build and install with GIS support
```sh
make USE_PGXS=1 ENABLE_GIS=1
make install USE_PGXS=1 ENABLE_GIS=1
```
Also you can build against separate SQLite version and with GIS support using obvious combination of variables.
If you want to build `sqlite_fdw` in a source tree of PostgreSQL, use
```sh
make
make install
```
You also can add `ENABLE_GIS=1` for GIS support or for testing if you have got
compiled PostGIS in `contrib/postgis` directory. Please refer [PostGIS installation script](GitHubActions/build_postgis.sh) for Debian/Ubuntu configuration details.
Usage
-----
### CREATE SERVER options
`sqlite_fdw` accepts the following options via the `CREATE SERVER` command:
- **database** as *string*, **required**, no default
SQLite database file address.
- **updatable** as *boolean*, optional, default *true*
This option can allow or disallow data modification on foreign server for all foreign objects by default. Please note, this option can be overwritten on table level or have no effect because of some filesystem restrictions, see [connection to SQLite database file and access control](#connection-to-sqlite-database-file-and-access-control). This is only recommentadion of PostgreSQL foreign server owner user not to modify data in foreign server tables. For strong restriction see the next option `force_readonly`.
- **force_readonly** as *boolean*, optional, default *false*
This option is useful if you need grant user permission to create a foreign tables on the foreign server and revoke user permission to modify any table data on this foreign server. This option with `true` value can disallow any write operations on foreign server table data through SQLite file readonly access mode. This option driven only by foreign server owner role can not be overwritten by any `updatable` option value. This is a strong restriction given by PostgreSQL foreign server owner user not to modify data in any foreign server tables. Also see [Connection to SQLite database file and access control](#connection-to-sqlite-database-file-and-access-control).
- **truncatable** as *boolean*, optional, default *false*
Allows foreign tables to be truncated using the `TRUNCATE` command.
- **keep_connections** as *boolean*, optional, default *true*
Allows to keep connections to SQLite while there is no SQL operations between PostgreSQL and SQLite.
- **batch_size** as *integer*, optional, default *1*
Specifies the number of rows which should be inserted in a single `INSERT` operation. This setting can be overridden for individual tables.
### CREATE USER MAPPING options
There is no user or password conceptions in SQLite, hence `sqlite_fdw` no need any `CREATE USER MAPPING` command. About access model and possible data modifications problems see about [connection to SQLite database file and access control](#connection-to-sqlite-database-file-and-access-control).
### CREATE FOREIGN TABLE options
`sqlite_fdw` accepts the following table-level options via the
`CREATE FOREIGN TABLE` command:
- **table** as *string*, optional, no default
SQLite table name. Use if not equal to name of foreign table in PostgreSQL. Also see about [identifier case handling](#identifier-case-handling).
- **truncatable** as *boolean*, optional, default from the same `CREATE SERVER` option
See `CREATE SERVER` options section for details.
- **batch_size** as *integer*, optional, default from the same `CREATE SERVER` option
See `CREATE SERVER` options section for details.
- **updatable** as *boolean*, optional, default *true*
This option can allow or disallow data modification on separate foreign table. Please note, this option can have no effect if there is foreign server option `force_readonly` = `true` or depends on filesystem context, see about [connection to SQLite database file and access control](#connection-to-sqlite-database-file-and-access-control).
`sqlite_fdw` accepts the following column-level options via the
`CREATE FOREIGN TABLE` command:
- **column_name** as *string*, optional, no default
This option gives the column name to use for the column on the remote server. Also see about [identifier case handling](#identifier-case-handling).
- **column_type** as *string*, optional, no default
Set preferred SQLite affinity for some PostgreSQL data types can be stored in different ways
in SQLite (mixed affinity case). Updated and inserted values will have this affinity. Default preferred SQLite affinity for `timestamp` and `uuid` PostgreSQL data types is `text`.
- Use `INT` value for SQLite column (epoch Unix Time) to be treated/visualized as `timestamp` in PostgreSQL.
- Use `BLOB` value for SQLite column to be treated/visualized as `uuid`.
- **key** as *boolean*, optional, default *false*
Indicates a column as a part of primary key or unique key of SQLite table.
### Datatypes
This table represents `sqlite_fdw` behaviour if in PostgreSQL foreign table column some [affinity](https://www.sqlite.org/datatype3.html) of SQLite data is detected. Some details about data values support see in [limitations](#limitations).
* **∅** - no support (runtime error)
* **✔** - 1↔1, PostgreSQL datatype is equal to SQLite affinity
* **✔-** - PostgreSQL datatype is equal to SQLite affinity, but possible out of range error
* **V** - transparent transformation
* **V+** - transparent transformation if possible
* **i** - ISO:SQL transformation for some special constants
* **?** - not described/not tested
* **T** - cast to text in SQLite utf-8 encoding, then to **PostgreSQL text with current encoding of database** and then transformation for `text` affinity if applicable
SQLite `NULL` affinity always can be transparent converted for a nullable column in PostgreSQL.
**SQLite data processing dependend on affinity**
| PostgreSQL | INT | REAL | BLOB | TEXT | TEXT but
empty|nearest
affinity|
|-------------:|:------------:|:------------:|:------------:|:------------:|:------------:|-------------:|
| bool | V | ∅ | T | i | ∅ | INT |
| bit(n) | V
(n<=64) | ∅ | ∅ | ∅ | ∅ | INT |
| bytea | ∅ | ∅ | ✔ | V | ? | BLOB |
| char(n) | ? | ? | T | ✔- | V | TEXT |
| date | V | V | T | V+ | `NULL` | ? |
| float4 | V+ | ✔ | ∅ | i | `NULL` | REAL |
| float8 | V+ | ✔ | ∅ | i | `NULL` | REAL |
|[geometry](GIS.md)| ∅ | ∅ | V+ | ∅ | ∅ | BLOB |
|[geography](GIS.md)|∅ | ∅ | V+ | ∅ | ∅ | BLOB |
| int2 | ✔- | ? | ∅ | ∅ | `NULL` | INT |
| int4 | ✔- | ? | ∅ | ∅ | `NULL` | INT |
| int8 | ✔ | ? | ∅ | ∅ | `NULL` | INT |
| json | ∅ | ∅ | V+ | V+ | ∅ | TEXT |
| jsonb | ∅ | ∅ | V+ | V+ | ∅ | BLOB |
| macaddr | ✔- | ∅ | V
(Len=6b)| V+ | ? | INT |
| macaddr8 | ✔ | ∅ | V
(Len=8b)| V+ | ? | INT |
| name | ? | ? | T | ✔- | `NULL` | TEXT |
| numeric | V | V | T | i | `NULL` | REAL |
| text | ? | ? | T | ✔ | V | TEXT |
| time | V | V | T | V+ | `NULL` | ? |
| timestamp | V | V | T | V+ | `NULL` | ? |
|timestamp + tz| V | V | T | V+ | `NULL` | ? |
| uuid | ∅ | ∅ |V+
(Len=16b)| V+ | ∅ | TEXT, BLOB |
| varchar(n) | ? | ? | T | ✔- | V | TEXT |
| varbit(n) | V
(n<=64) | ∅ | ∅ | ∅ | ∅ | INT |
### IMPORT FOREIGN SCHEMA options
`sqlite_fdw` supports [IMPORT FOREIGN SCHEMA](https://www.postgresql.org/docs/current/sql-importforeignschema.html)
(PostgreSQL 9.5+) and accepts following options via the `IMPORT FOREIGN SCHEMA` command:
- **import_default** as *boolean*, optional, default *false*
Allow borrowing default values from SQLite table DDL.
- **import_not_null** as *boolean*, optional, default *true*
Allow borrowing `NULL`/`NOT NULL` constraints from SQLite table DDL.
#### Datatype translation rules for `IMPORT FOREIGN SCHEMA`
| SQLite | PostgreSQL |
|-------------:|:----------------:|
| int | bigint |
| char | text |
| clob | text |
| text | text |
| blob | bytea |
| real | double precision |
| floa | double precision |
| doub | double precision |
| datetime | timestamp |
| time | time |
| date | date |
| uuid | uuid |
| macaddr | macaddr |
| macaddr8 | macaddr8 |
| [geometry](GIS.md) | geometry |
| [geography](GIS.md) | geography |
| json | json |
| jsonb | jsonb |
**Note:** In case of `sqlite_fdw` compiling without GIS support, GIS data
types will be converted to `bytea`.
### TRUNCATE support
`sqlite_fdw` implements the foreign data wrapper `TRUNCATE` API, available
from PostgreSQL 14.
As SQLite does not provide a `TRUNCATE` command, it is simulated with a
simple unqualified `DELETE` operation.
Actually, `TRUNCATE ... CASCADE` can be simulated if we create child table of SQLite with foreign keys and `ON DELETE CASCADE`, and then executing `TRUNCATE` (which will be deparsed to `DELETE`).
Following restrictions apply:
- `TRUNCATE ... RESTART IDENTITY` is not supported
- SQLite tables with foreign key references can cause errors during truncating
### Connection to SQLite database file and access control
In OS `sqlite_fdw` works as executed code with permissions of user of PostgreSQL server. Usually it is `postgres` OS user.
#### Data read access
For succesfully connection to SQLite database file you must have at least existed and correct SQLite file readable for OS user of PostgreSQL server process. This means all directories by path to the file must be also readable (listable) for OS user of PostgreSQL server process. There are no other conditions for PostreSQL database superuser to read all of SQLite data if there are also `sqlite_fdw` extension in the database and `FOREIGN SERVER` for SQLite database file.
#### Data change access
Data modification access in `sqlite_fdw` drived by both operating system and PostgreSQL.
OS restrictions can disallow any SQLite data modifications. Hence any PostgreSQL `FOREIGN SERVER` or `FOREIGN TABLE` options or `GRANT`s can be absolutely not effective. In this case SQLite data modification operations allowed by PostgreSQL can cause error message from SQLite like `attempt to write a readonly database` with result code `8`.
Full list of OS-leveled conditions of data modification access to SQLite database file
- Existed SQLite file is not corrupted by SQLite engine conditions.
- All path elements of the file are readable (listable) for OS user of PostgreSQL server process.
- The file and a directory of the file placed on readwrite filesystem. For example `sqashfs` is always read-only, remote `sshfs` can be read-only, a disk partition can be mounted in read-only mode etc.
- The file is writable for OS user of PostgreSQL server process.
- The directory of the file is writable for OS user of PostgreSQL server process because SQLite creates some temporary transaction files.
Full list of PostgreSQL-leveled conditions of data modification access to SQLite database file
- The `FOREIGN SERVER` of the SQLite file have no `force_readonly` = `true` option value.
- You have `USAGE` right `GRANT` for the `FOREIGN SERVER`.
- The `FOREIGN TABLE` of SQLite table have no `updatable` = `false` option value.
- If the `FOREIGN TABLE` have no `updatable` option, ensure `FOREIGN SERVER` have no `updatable` = `false` option value.
Generally for `sqlite_fdw` access management `FOREIGN SERVER` owner can be like _remote access manager_ for other FDWs.
_Remote access manager_ can block any data modififcations in remote database for _remote user_ of a FDW. In this case SQLite have no user or separate access conceptions, hence `FOREIGN SERVER` owner combines _remote access manager_ role with internal PostgreSQL roles such as `FOREIGN SERVER` access management.
Functions
---------
As well as the standard `sqlite_fdw_handler()` and `sqlite_fdw_validator()`
functions, `sqlite_fdw` provides the following user-callable utility functions:
- SETOF record **sqlite_fdw_get_connections**(server_name text, valid bool)
- bool **sqlite_fdw_disconnect**(text)
Closes connection from PostgreSQL to SQLite in the current session.
- bool **sqlite_fdw_disconnect_all()**
- **sqlite_fdw_version()**;
Returns standard "version integer" as `major version * 10000 + minor version * 100 + bugfix`.
```
sqlite_fdw_version
--------------------
20500
```
Identifier case handling
------------------------
PostgreSQL folds identifiers to lower case by default, SQLite is case insensitive by default
only for uppercase and lowercase ASCII base latin letters. It's important
to be aware of potential issues with table and column names.
Following SQL isn't correct for SQLite: `Error: duplicate column name: a`, but is correct for PostgreSQL
```sql
CREATE TABLE T (
"A" INTEGER,
"a" NUMERIC
);
```
Following SQLs is correct for both SQLite and PostgreSQL because there is no column
with names composed from ASCII base latin letters *only*.
```sql
CREATE TABLE T_кир (
"А" INTEGER,
"а" NUMERIC
);
CREATE TABLE T_ελλ (
"Α" INTEGER,
"α" NUMERIC
);
CREATE TABLE T_dia (
"Ä" INTEGER,
"ä" NUMERIC
);
```
For SQLite there is no difference between
```sql
SELECT * FROM t; -- №1
SELECT * FROM T; -- №2
SELECT * FROM "t"; -- №3
SELECT * FROM "T"; -- №4
```
For PostgreSQL the query with comment `№4` is independend query to table `T`, not to table `t` as other queries.
Please note this table name composed from ASCII base latin letters *only*. This is not applicable for other
alphabet systems or mixed names. This is because `toLower` operation in PostgreSQL is Unicode operation but
ASCII only operation in SQLite, hence other characters will not be changed.
```sql
SELECT * FROM т; -- №5
SELECT * FROM Т; -- №6
SELECT * FROM "т"; -- №7
SELECT * FROM "Т"; -- №8
```
In this case for PostgreSQL the query with comment `№8` is independend query to table `Т`, not to table `т`
as other queries. But for SQLite the queries with comments `№6` and `№8` belongs to table `Т`, and the queries with
comments `№5` and `№7` belongs to table `т`.
If there is
```sql
CREATE TABLE T (
A INTEGER,
b REAL
);
```
in SQLite, both `a` and `A` , `b` and `B` columns will have the same real datasource in SQLite in follow foreign table:
```sql
CREATE FOREIGN TABLE "SQLite test" (
"A" int4 NULL,
"B" float8 NULL,
"a" int8 NULL,
"b" numeric NULL
)
SERVER sqlite_server
OPTIONS (table 'T');
```
Generated columns
-----------------
SQLite provides support for [generated columns](https://www.sqlite.org/gencol.html).
Behaviour of `sqlite_fdw` with this columns _isn't yet described_.
Note that while `sqlite_fdw` will `INSERT` or `UPDATE` the generated column value
in SQLite, there is nothing to stop the value being modified within SQLite,
and hence no guarantee that in subsequent `SELECT` operations the column will
still contain the expected generated value. This limitation also applies to
`postgres_fdw`.
For more details on generated columns see:
- [Generated Columns](https://www.postgresql.org/docs/current/ddl-generated-columns.html)
- [CREATE FOREIGN TABLE](https://www.postgresql.org/docs/current/sql-createforeigntable.html)
Character set handling
----------------------
There is [no character set metadata](https://www.sqlite.org/search?s=d&q=character+set)
stored in SQLite, only [`PRAGMA encoding;`](https://www.sqlite.org/pragma.html#pragma_encoding) with UTF-only values (`UTF-8`, `UTF-16`, `UTF-16le`, `UTF-16be`). [SQLite text output function](https://www.sqlite.org/c3ref/column_blob.html) guarantees UTF-8 encoding.
When `sqlite_fdw` connects to a SQLite, all strings are interpreted acording the PostgreSQL database's server encoding.
It's not a problem if your PostgreSQL database encoding belongs to Unicode family. Otherewise interpretation transformation problems can occur. Some unproper for PostgreSQL database encoding characters will cause error like `character with byte sequence 0x** in encoding "UTF8" has no equivalent in encoding "**"`.
Character case functions such as `upper`, `lower` and other are not pushed down because they does not work with Unicode character in SQLite.
`Sqlite_fdw` tested with PostgreSQL database encodings `EUC_JP`, `EUC_KR`, `ISO_8859_5`, `ISO_8859_6`, `ISO_8859_7`, `ISO_8859_8`, `LATIN1`, `LATIN2`, `LATIN3`, `LATIN4`, `LATIN5`, `LATIN6`, `LATIN7`, `LATIN8`, `LATIN9`, `LATIN9`, `LATIN10`, `WIN1250`, `WIN1251`, `WIN1252`, `WIN1253`, `WIN1254`, `WIN1255`, `WIN1256`, `WIN1257` and it's synomyms. Some other encodings also can be supported, but not tested.
Examples
--------
### Install the extension:
Once for a database you need, as PostgreSQL superuser.
```sql
CREATE EXTENSION sqlite_fdw;
```
### Create a foreign server with appropriate configuration:
Once for a foreign datasource you need, as PostgreSQL superuser. Please specify SQLite database path using `database` option.
```sql
CREATE SERVER sqlite_server
FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (
database '/path/to/database'
);
```
### Grant usage on foreign server to normal user in PostgreSQL:
Once for a normal user (non-superuser) in PostgreSQL, as PostgreSQL superuser. It is a good idea to use a superuser only where really necessary, so let's allow a normal user to use the foreign server (this is not required for the example to work, but it's secirity recomedation).
```sql
GRANT USAGE ON FOREIGN SERVER sqlite_server TO pguser;
```
Where `pguser` is a sample user for works with foreign server (and foreign tables).
### User mapping
There is no user or password conceptions in SQLite, hence `sqlite_fdw` no need any `CREATE USER MAPPING` command. About access problems see in [CREATE USER MAPPING options](#create-user-mapping-options).
### Create foreign table
All `CREATE FOREIGN TABLE` SQL commands can be executed as a normal PostgreSQL user if there were correct `GRANT USAGE ON FOREIGN SERVER`. No need PostgreSQL supersuer for secirity reasons but also works with PostgreSQL supersuer.
Please specify `table` option if SQLite table name is different from foreign table name.
```sql
CREATE FOREIGN TABLE t1 (
a integer,
b text
)
SERVER sqlite_server
OPTIONS (
table 't1_sqlite'
);
```
If you want to update tables, please add `OPTIONS (key 'true')` to a primary key or unique key like the following:
```sql
CREATE FOREIGN TABLE t1(
a integer OPTIONS (key 'true'),
b text
)
SERVER sqlite_server
OPTIONS (
table 't1_sqlite'
);
```
If you need to convert INT SQLite column (epoch Unix Time) to be treated/visualized as `TIMESTAMP` in PostgreSQL, please add `OPTIONS (column_type 'INT')` when defining FOREIGN table at PostgreSQL like the following:
```sql
CREATE FOREIGN TABLE t1(
a integer,
b text,
c timestamp without time zone OPTIONS (column_type 'INT')
)
SERVER sqlite_server
OPTIONS (
table 't1_sqlite'
);
```
As above, but with aliased column names:
```sql
CREATE FOREIGN TABLE t1(
a integer,
b text OPTIONS (column_name 'test_id'),
c timestamp without time zone OPTIONS (column_type 'INT', column_name 'unixtime')
)
SERVER sqlite_server
OPTIONS (
table 't1_sqlite'
);
```
### Import a SQLite database as schema to PostgreSQL:
```sql
IMPORT FOREIGN SCHEMA someschema
FROM SERVER sqlite_server
INTO public;
```
Note: `someschema` has no particular meaning and can be set to an arbitrary value.
### Access foreign table
For the table from previous examples
```sql
SELECT * FROM t1;
```
Limitations
-----------
### SQL commands
- `COPY` command for foreign tables is not supported
- `IMPORT` of generated column is not supported
- `INSERT` into a partitioned table which has foreign partitions is not supported. Error `Not support partition insert` will display.
- `TRUNCATE` in `sqlite_fdw` always delete data of both parent and child tables (no matter user inputs `TRUNCATE table CASCADE` or `TRUNCATE table RESTRICT`) if there are foreign-keys references with `ON DELETE CASCADE` clause.
- `RETURNING` is not supported.
### Mixed affinity support
SQLite `text` affinity values which is different for SQLite unique checks can be equal for PostgreSQL because `sqlite_fdw` unifyes semantics of values, not storage form. For example `1`(integer), `Y`(text) and `tRuE`(text) SQLite values is different in SQLite but equal in PostgreSQL as `true` values of `boolean` column. This is also applicable for a data with `text` affinity in `uuid`, `timestamp`, `double precision`, `float` and `numeric` columns of foreign tables. **Please be carefully if you want to use mixed affinity column as PostgreSQL foreign table primary key**.
### Arrays
Array support is experimental. Please be careful.
- `sqlite_fdw` only supports `ARRAY` const, for example, `ANY (ARRAY[1, 2, 3])` or `ANY ('{1, 2 ,3}')`.
- `sqlite_fdw` does not support `ARRAY` expression, for example, `ANY (ARRAY[c1, 1, c1+0])`.
- For `ANY(ARRAY)` clause, `sqlite_fdw` deparses it using `IN` operator.
### Numbers (range and precision)
- For `sum` function of SQLite, output of `sum(bigint)` is `integer` value. If input values are big, the overflow error may occurs on SQLite because it overflow within the range of signed 64bit. For PostgreSQL, it can calculate as over the precision of `bigint`, so overflow does not occur.
- SQLite promises to preserve the 15 most significant digits of a floating point value. The big value which exceed 15 most significant digits may become different value after inserted.
- SQLite does not support `numeric` type as PostgreSQL. Therefore, it does not allow to store numbers with too high precision and scale. Error out of range occurs.
- SQLite does not support `NaN` special value for IEEE 754-2008 numbers. Please use this special value very cerefully because there is no such conception in SQLite at all and `NaN` value treated in SQLite as `NULL`.
- SQLite support `+Infinity` and `-Infinity` special values for IEEE 754-2008 numbers in SQL expressions with numeric context. This values can be readed with both `text` and `real` affiniy, but can be writed to SQLite only with `real` affinity (as signed out of range value `9.0e999`).
### Boolean values
- `sqlite_fdw` boolean values support exists only for `bool` columns in foreign table. SQLite documentation recommends to store boolean as value with `integer` [affinity](https://www.sqlite.org/datatype3.html). `NULL` isn't converted, 1 converted to `true`, all other `NOT NULL` values converted to `false`. During `SELECT ... WHERE condition_column` condition converted only to `condition_column`.
- `sqlite_fdw` don't provides limited support of boolean values if `bool` column in foreign table mapped to SQLite `text` [affinity](https://www.sqlite.org/datatype3.html).
### UUID values
- `sqlite_fdw` UUID values support exists only for `uuid` columns in foreign table. SQLite documentation recommends to store UUID as value with both `blob` and `text` [affinity](https://www.sqlite.org/datatype3.html). `sqlite_fdw` can pushdown both reading and filtering both `text` and `blob` values.
- Expected affinity of UUID value in SQLite table determined by `column_type` option of the column
for `INSERT` and `UPDATE` commands. PostgreSQL supports both `blob` and `text` [affinity](https://www.sqlite.org/datatype3.html).
### bit and varbit support
- `sqlite_fdw` PostgreSQL `bit`/`varbit` values support based on `int` SQLite data affinity, because there is no per bit operations for SQLite `blob` affinity data. Maximum SQLite `int` affinity value is 8 bytes length, hence maximum `bit`/`varbit` values length is 64 bits.
- `sqlite_fdw` doesn't pushdown `#` (XOR) operator because there is no equal SQLite operator.
### MAC address support
- `sqlite_fdw` PostgreSQL `macaddr`/`macaddr8` values support based on `int` SQLite data affinity, because there is no per bit operations for SQLite `blob` affinity data. For `macaddr` out of range error is possible because this type is 6 bytes length, but SQLite `int` can store value up to 8 bytes.
- `sqlite_fdw` doesn't pushdown any operations with MAC adresses because there is 3 possible affinities for it in SQLite: `integer`, `blob` and `text`.
### JSON support and operators
- Operators `->` and `->>` for `json` and `jsonb` are pushed down. This means if you deal with a foreign table only, you can use SQLite syntax of `->` and `->>` operators which is more rich than PostgreSQL syntax. In PostgreSQL this operators means only 1-leveled extraction after one call, but possible multilevel extraction in one call of the operator in SQLite. You can extract `'{"a": 2, "c": [4, 5, {"f": 7}]}' ->'c' -> 2` with result `{"f":7}` both for PostgreSQL and SQLite tables, but `'{"a": 2, "c": [4, 5, {"f": 7}]}' ->'$.c[2]'` possible only in SQLite and for a foreign table.
- For PostgreSQL numeric argument of `->` and `->>` operators means only coordinate inside of array. In SQLite transformable to number text argument of this operators also can extract array element. PostgreSQL differs `json -> (2::text)` and `json -> 2`, but SQLite not: `json -> '2'`.
- Please note you can turn off processing of normalizing possible SQLite `json` values with `text` affinity for a column with formal SQLite `json` data type as option `column_type` = `text`. This can increase `SELECT` or `ORDER` speed, because there will be no normalize function wrapping, but in this case any query will have unsuccessfully result in case of any value with `blob` affiniy including any possible SQLite `jsonb` value.
```sql
-- a query with normalization - standard ISO:SQL behaviour
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
QUERY PLAN
-------------------------------------------------------------
Foreign Scan on public."type_JSON" j
Output: i, j, (j -> 'c'::text)
SQLite query: SELECT `i`, json(`j`) FROM main."type_JSON"
(3 rows)
-- turn off normalization
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN j OPTIONS (ADD column_type 'text');
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
QUERY PLAN
-------------------------------------------------------
Foreign Scan on public."type_JSON" j
Output: i, j, (j -> 'c'::text)
SQLite query: SELECT `i`, `j` FROM main."type_JSON"
(3 rows)
```
Tests
-----
Test directory have structure as following:
```
+---sql
| +---13.15
| | filename1.sql
| | filename2.sql
| |
| +---14.12
| | filename1.sql
| | filename2.sql
| |
.................
| \---17.0
| filename1.sql
| filename2.sql
|
\---expected
| +---13.15
| | filename1.out
| | filename2.out
| |
| +---14.12
| | filename1.out
| | filename2.out
| |
.................
| \---17.0
filename1.out
filename2.out
```
The test cases for each version are based on the test of corresponding version of PostgreSQL.
You can execute test by test.sh directly.
The version of PostgreSQL is detected automatically by $(VERSION) variable in Makefile.
The corresponding sql and expected directory will be used to compare the result. For example, for Postgres 15.0, you can execute "test.sh" directly, and the sql/15.0 and expected/15.0 will be used to compare automatically.
Please don't forget a command like `export SQLITE_FOR_TESTING_DIR=` with the same path as in SQLite's `./configure --prefix` berfore testing if you want to test not against your OS SQLite version, but against separate downloaded, compiled and installed SQLite version.
Test data directory is `/tmp/sqlite_fdw_test`. If you have `/tmp` mounted as `tmpfs` the tests will be up to 800% faster.
Contributing
------------
Opening issues and pull requests on GitHub are welcome.
For pull request, please make sure these items below for testing:
- Create test cases (if needed) for the latest version of PostgreSQL supported by `sqlite_fdw`. All error testcases should have a comment about test purpose.
- Execute test cases and update expectations for the latest version of PostgreSQL
- Test creation and execution for other PostgreSQL versions are welcome but not required.
Preferred code style see in PostgreSQL source codes. For example
```C
type
funct_name (type arg ...)
{
t1 var1 = value1;
t2 var2 = value2;
for (;;)
{
}
if ()
{
}
}
```
Useful links
------------
### Source
- https://github.com/pgspider/sqlite_fdw
- https://pgxn.org/dist/sqlite_fdw/
### General FDW Documentation
- https://www.postgresql.org/docs/current/ddl-foreign-data.html
- https://www.postgresql.org/docs/current/sql-createforeigndatawrapper.html
- https://www.postgresql.org/docs/current/sql-createforeigntable.html
- https://www.postgresql.org/docs/current/sql-importforeignschema.html
- https://www.postgresql.org/docs/current/fdwhandler.html
- https://www.postgresql.org/docs/current/postgres-fdw.html
### Other FDWs
- https://wiki.postgresql.org/wiki/Fdw
- https://pgxn.org/tag/fdw/
License
-------
* Copyright © 2018, TOSHIBA CORPORATION
* Copyright © 2011 - 2016, EnterpriseDB Corporation
Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.
See the [`License`][3] file for full details.
[1]: https://www.sqlite.org/download.html
[2]: https://www.sqlite.org/howtocompile.html
[3]: License
================================================
FILE: connection.c
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* Portions Copyright (c) 2018, TOSHIBA CORPORATION
*
* IDENTIFICATION
* connection.c
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "sqlite_fdw.h"
#include "access/xact.h"
#include "commands/defrem.h"
#if (PG_VERSION_NUM >= 140000 && PG_VERSION_NUM < 150000)
#include "miscadmin.h"
#endif
#include "optimizer/cost.h"
#include "utils/builtins.h"
#include "utils/inval.h"
#include "utils/syscache.h"
/*
* Connection cache hash table entry
*
* The lookup key in this hash table is the foreign server OID
*/
typedef Oid ConnCacheKey;
typedef struct ConnCacheEntry
{
ConnCacheKey key; /* hash key (must be first) */
sqlite3 *conn; /* connection to foreign server, or NULL */
/* Remaining fields are invalid when conn is NULL: */
int xact_depth; /* 0 = no xact open, 1 = main xact open, 2 =
* one level of subxact open, etc */
bool keep_connections; /* setting value of keep_connections
* server option */
bool truncatable; /* check table can truncate or not */
bool readonly; /* option force_readonly, readonly SQLite file mode */
bool invalidated; /* true if reconnect is pending */
Oid serverid; /* foreign server OID used to get server name */
List *stmtList; /* list stmt associated with conn */
uint32 server_hashvalue; /* hash value of foreign server OID */
} ConnCacheEntry;
/*
* Connection cache (initialized on first use)
*/
static HTAB *ConnectionHash = NULL;
/* tracks whether any work is needed in callback functions */
static volatile bool xact_got_connection = false;
PG_FUNCTION_INFO_V1(sqlite_fdw_get_connections);
PG_FUNCTION_INFO_V1(sqlite_fdw_disconnect);
PG_FUNCTION_INFO_V1(sqlite_fdw_disconnect_all);
static sqlite3 *sqlite_open_db(const char *dbpath, int flags);
static void sqlite_make_new_connection(ConnCacheEntry *entry, ForeignServer *server);
void sqlite_do_sql_command(sqlite3 * conn, const char *sql, int level, List **busy_connection);
static void sqlite_begin_remote_xact(ConnCacheEntry *entry);
static void sqlitefdw_xact_callback(XactEvent event, void *arg);
static void sqlitefdw_reset_xact_state(ConnCacheEntry *entry, bool toplevel);
static void sqlitefdw_subxact_callback(SubXactEvent event,
SubTransactionId mySubid,
SubTransactionId parentSubid,
void *arg);
static void sqlitefdw_inval_callback(Datum arg, int cacheid, uint32 hashvalue);
static void sqlitefdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel, List **busy_connection);
#if PG_VERSION_NUM >= 140000
static bool sqlite_disconnect_cached_connections(Oid serverid);
#endif
static void sqlite_finalize_list_stmt(List **list);
static List *sqlite_append_stmt_to_list(List *list, sqlite3_stmt * stmt);
typedef struct BusyHandlerArg
{
sqlite3 *conn;
const char *sql;
int level;
} BusyHandlerArg;
/*
* sqlite_get_connection:
* Get a connection which can be used to execute queries on
* the remote Sqlite server with the user's authorization. A new connection
* is established if we don't already have a suitable one.
*/
sqlite3 *
sqlite_get_connection(ForeignServer *server, bool truncatable)
{
bool found;
ConnCacheEntry *entry;
ConnCacheKey key;
/* First time through, initialize connection cache hashtable */
if (ConnectionHash == NULL)
{
HASHCTL ctl;
MemSet(&ctl, 0, sizeof(ctl));
ctl.keysize = sizeof(ConnCacheKey);
ctl.entrysize = sizeof(ConnCacheEntry);
/* allocate ConnectionHash in the cache context */
ctl.hcxt = CacheMemoryContext;
ConnectionHash = hash_create("sqlite_fdw connections", 8,
&ctl,
#if (PG_VERSION_NUM >= 140000)
HASH_ELEM | HASH_BLOBS);
#else
HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
#endif
/*
* Register some callback functions that manage connection cleanup.
* This should be done just once in each backend.
*/
RegisterXactCallback(sqlitefdw_xact_callback, NULL);
RegisterSubXactCallback(sqlitefdw_subxact_callback, NULL);
CacheRegisterSyscacheCallback(FOREIGNSERVEROID,
sqlitefdw_inval_callback, (Datum) 0);
}
/* Set flag that we did GetConnection during the current transaction */
xact_got_connection = true;
key = server->serverid;
/*
* Find or create cached entry for requested connection.
*/
entry = hash_search(ConnectionHash, &key, HASH_ENTER, &found);
if (!found)
{
/* If can not find any cached entry => initialize new hashtable entry */
entry->conn = NULL;
}
/*
* If the connection needs to be remade due to invalidation, disconnect as
* soon as we're out of all transactions.
*/
if (entry->conn != NULL && entry->invalidated && entry->xact_depth == 0)
{
int rc = sqlite3_close(entry->conn);
elog(DEBUG1, "closing connection %p for option changes to take effect. sqlite3_close=%d",
entry->conn, rc);
entry->conn = NULL;
}
/*
* If cache entry doesn't have a connection, we have to establish a new
* connection. (If sqlite_open_db has an error, the cache entry will
* remain in a valid empty state, ie conn == NULL.)
*/
if (entry->conn == NULL)
sqlite_make_new_connection(entry, server);
entry->truncatable = truncatable;
/*
* SQLite FDW support TRUNCATE command by executing DELETE statement
* without WHERE clause. In order to delete records in parent and child
* table subsequently, SQLite FDW executes "PRAGMA foreign_keys = ON"
* before executing DELETE statement. But "PRAGMA foreign_keys = ON"
* command does not have any affect when using within transaction.
* Therefore, do not create transaction when executing TRUNCATE.
*/
if (!entry->truncatable)
/*
* Start a new transaction or subtransaction if needed.
*/
sqlite_begin_remote_xact(entry);
return entry->conn;
}
/*
* Open remote sqlite database using specified database path
* and flags of opened file descriptor mode.
*/
static sqlite3 *
sqlite_open_db(const char *dbpath, int flags)
{
sqlite3 *conn = NULL;
int rc;
char *err;
const char *zVfs = NULL;
rc = sqlite3_open_v2(dbpath, &conn, flags, zVfs);
if (rc != SQLITE_OK)
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION),
errmsg("Failed to open SQLite DB, file '%s', result code %d", dbpath, rc)));
/* make 'LIKE' of SQLite case sensitive like PostgreSQL */
rc = sqlite3_exec(conn, "pragma case_sensitive_like=1",
NULL, NULL, &err);
if (rc != SQLITE_OK)
{
char *perr = pstrdup(err);
sqlite3_free(err);
sqlite3_close(conn);
conn = NULL;
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION),
errmsg("Failed to open SQLite DB, file '%s', SQLite error '%s', result code %d", dbpath, perr, rc)));
}
/* add included inner SQLite functions from separate c file
* for using in data unifying during deparsing
*/
sqlite_fdw_data_norm_functs_init(conn);
return conn;
}
/*
* Reset all transient state fields in the cached connection entry and
* establish new connection to the remote server.
*/
static void
sqlite_make_new_connection(ConnCacheEntry *entry, ForeignServer *server)
{
const char *dbpath = NULL;
ListCell *lc;
int flags = 0;
Assert(entry->conn == NULL);
entry->serverid = server->serverid;
entry->xact_depth = 0;
entry->invalidated = false;
entry->stmtList = NULL;
entry->keep_connections = true;
entry->readonly = false;
entry->server_hashvalue =
GetSysCacheHashValue1(FOREIGNSERVEROID,
ObjectIdGetDatum(server->serverid));
foreach(lc, server->options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "database") == 0)
dbpath = defGetString(def);
else if (strcmp(def->defname, "keep_connections") == 0)
entry->keep_connections = defGetBoolean(def);
else if (strcmp(def->defname, "force_readonly") == 0)
entry->readonly = defGetBoolean(def);
}
flags = flags | (entry->readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE);
/* Try to make the connection */
entry->conn = sqlite_open_db(dbpath, flags);
}
/*
* cleanup_connection:
* Delete all the cache entries on backend exists.
*/
void
sqlite_cleanup_connection(void)
{
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
int rc;
if (ConnectionHash == NULL)
return;
hash_seq_init(&scan, ConnectionHash);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
if (entry->conn == NULL)
continue;
sqlite_finalize_list_stmt(&entry->stmtList);
elog(DEBUG1, "disconnecting sqlite_fdw connection %p", entry->conn);
rc = sqlite3_close(entry->conn);
entry->conn = NULL;
if (rc != SQLITE_OK)
{
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION),
errmsg("Failed to close SQLite DB"),
errhint("SQLite error '%s', SQLite result code %d", sqlite3_errmsg(entry->conn), rc)
));
}
}
}
/*
* Convenience subroutine to issue a non-data-returning SQL command to remote
*/
void
sqlite_do_sql_command(sqlite3 * conn, const char *sql, int level, List **busy_connection)
{
char *err = NULL;
int rc;
elog(DEBUG3, "sqlite_fdw do_sql_command %s", sql);
rc = sqlite3_exec(conn, sql, NULL, NULL, &err);
if (busy_connection && rc == SQLITE_BUSY)
{
/* Busy case will be handled later, not here */
BusyHandlerArg *arg = palloc0(sizeof(BusyHandlerArg));
arg->conn = conn;
arg->sql = sql;
arg->level = level;
*busy_connection = lappend(*busy_connection, arg);
return;
}
if (rc != SQLITE_OK)
{
char *perr = NULL;
if (err)
{
perr = pstrdup(err);
sqlite3_free(err);
if (perr)
{
ereport(level,
(errcode(ERRCODE_FDW_ERROR),
errmsg("SQLite failed to execute a query"),
errcontext("SQL query: %s", sql),
errhint("SQLite error '%s'", perr)));
pfree(perr);
}
}
else
ereport(level,
(errcode(ERRCODE_FDW_ERROR),
errmsg("SQLite failed to execute a query"),
errcontext("SQL query: %s", sql)
));
}
}
/*
* Start remote transaction or subtransaction, if needed.
*/
static void
sqlite_begin_remote_xact(ConnCacheEntry *entry)
{
int curlevel = GetCurrentTransactionNestLevel();
/* Start main transaction if we haven't yet */
if (entry->xact_depth <= 0)
{
const char *sql;
elog(DEBUG3, "starting remote transaction on connection %p",
entry->conn);
sql = "BEGIN";
sqlite_do_sql_command(entry->conn, sql, ERROR, NULL);
entry->xact_depth = 1;
}
/*
* If we're in a subtransaction, stack up savepoints to match our level.
* This ensures we can rollback just the desired effects when a
* subtransaction aborts.
*/
while (entry->xact_depth < curlevel)
{
char sql[64];
snprintf(sql, sizeof(sql), "SAVEPOINT s%d", entry->xact_depth + 1);
sqlite_do_sql_command(entry->conn, sql, ERROR, NULL);
entry->xact_depth++;
}
}
/*
* Report an SQLite execution error.
*/
void
sqlitefdw_report_error(int elevel, sqlite3_stmt * stmt, sqlite3 * conn,
const char *sql, int rc)
{
const char *message = sqlite3_errmsg(conn);
int erc = sqlite3_extended_errcode(conn);
int sqlstate = ERRCODE_FDW_ERROR;
/* copy sql before callling another SQLite API */
if (message)
message = pstrdup(message);
if (!sql && stmt)
{
sql = sqlite3_sql(stmt);
if (sql)
sql = pstrdup(sqlite3_sql(stmt));
}
ereport(ERROR,
(errcode(sqlstate),
errmsg("Failed to execute remote SQL"),
errcontext("SQL query: %s", sql ? sql : ""),
errhint("SQLite error '%s', SQLite primary result code %d, extended result code %d", message ? message : "", rc, erc)
));
}
/*
* sqlitefdw_xact_callback --- cleanup at main-transaction end.
*/
static void
sqlitefdw_xact_callback(XactEvent event, void *arg)
{
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
ListCell *lc;
List *busy_connection = NIL;
/* Quick exit if no connections were touched in this transaction. */
if (!xact_got_connection)
return;
elog(DEBUG1, "sqlite_fdw xact_callback %d", event);
/*
* Scan all connection cache entries to find open remote transactions, and
* close them.
*/
hash_seq_init(&scan, ConnectionHash);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
/* Ignore cache entry if no open connection right now */
if (entry->conn == NULL)
continue;
/* If it has an open remote transaction, try to close it */
if (entry->xact_depth > 0)
{
elog(DEBUG3, "closing remote transaction on connection %p",
entry->conn);
switch (event)
{
case XACT_EVENT_PARALLEL_PRE_COMMIT:
case XACT_EVENT_PRE_COMMIT:
/* Commit all remote transactions during pre-commit */
if (!sqlite3_get_autocommit(entry->conn))
sqlite_do_sql_command(entry->conn, "COMMIT", ERROR, &busy_connection);
/* Finalize all prepared statements */
sqlite_finalize_list_stmt(&entry->stmtList);
break;
case XACT_EVENT_PRE_PREPARE:
/*
* We disallow remote transactions that modified anything,
* since it's not very reasonable to hold them open until
* the prepared transaction is committed. For the moment,
* throw error unconditionally; later we might allow
* read-only cases. Note that the error will cause us to
* come right back here with event == XACT_EVENT_ABORT, so
* we'll clean up the connection state at that point.
*/
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot prepare a transaction that modified remote tables")));
break;
case XACT_EVENT_PARALLEL_COMMIT:
case XACT_EVENT_COMMIT:
case XACT_EVENT_PREPARE:
/* Pre-commit should have closed the open transaction */
elog(ERROR, "missed cleaning up connection during pre-commit");
break;
case XACT_EVENT_PARALLEL_ABORT:
case XACT_EVENT_ABORT:
{
sqlitefdw_abort_cleanup(entry, true, &busy_connection);
break;
}
}
}
/* Reset state to show we're out of a transaction */
sqlitefdw_reset_xact_state(entry, true);
}
/* Execute again the query after server is available */
foreach(lc, busy_connection)
{
BusyHandlerArg *arg = lfirst(lc);
/*
* If there is still error, we can not do anything more, just raise it.
* requireBusyHandler is set to false, and NULL busy_connection list.
*/
sqlite_do_sql_command(arg->conn, arg->sql, arg->level, NULL);
}
list_free(busy_connection);
/*
* Regardless of the event type, we can now mark ourselves as out of the
* transaction. (Note: if we are here during PRE_COMMIT or PRE_PREPARE,
* this saves a useless scan of the hashtable during COMMIT or PREPARE.)
*/
xact_got_connection = false;
}
/*
* sqlitefdw_reset_xact_state --- Reset state to show we're out of a (sub)transaction
*/
static void
sqlitefdw_reset_xact_state(ConnCacheEntry *entry, bool toplevel) {
if (toplevel) {
/* Reset state to show we're out of a transaction */
entry->xact_depth = 0;
/*
* If the connection isn't in a good idle state, it is marked as
* invalid or keep_connections option of its server is disabled, then
* discard it to recover. Next GetConnection will open a new
* connection.
*/
if (entry->invalidated ||
!entry->keep_connections)
{
elog(DEBUG3, "discarding sqlite_fdw connection %p", entry->conn);
sqlite3_close(entry->conn);
entry->conn = NULL;
}
} else {
/* Reset state to show we're out of a subtransaction */
entry->xact_depth--;
}
}
/*
* sqlitefdw_subxact_callback --- cleanup at subtransaction end.
*/
static void
sqlitefdw_subxact_callback(SubXactEvent event, SubTransactionId mySubid,
SubTransactionId parentSubid, void *arg)
{
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
int curlevel;
ListCell *lc;
List *busy_connection = NIL;
/* Nothing to do at subxact start, nor after commit. */
if (!(event == SUBXACT_EVENT_PRE_COMMIT_SUB ||
event == SUBXACT_EVENT_ABORT_SUB))
return;
/* Quick exit if no connections were touched in this transaction. */
if (!xact_got_connection)
return;
/*
* Scan all connection cache entries to find open remote subtransactions
* of the current level, and close them.
*/
curlevel = GetCurrentTransactionNestLevel();
hash_seq_init(&scan, ConnectionHash);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
char sql[100];
/*
* We only care about connections with open remote subtransactions of
* the current level.
*/
if (entry->conn == NULL || entry->xact_depth < curlevel)
continue;
if (entry->truncatable)
continue;
if (entry->xact_depth > curlevel)
elog(ERROR, "missed cleaning up remote subtransaction at level %d",
entry->xact_depth);
if (event == SUBXACT_EVENT_PRE_COMMIT_SUB)
{
/* Commit all remote subtransactions during pre-commit */
snprintf(sql, sizeof(sql), "RELEASE SAVEPOINT s%d", curlevel);
sqlite_do_sql_command(entry->conn, sql, ERROR, &busy_connection);
}
else if (in_error_recursion_trouble())
{
/*
* Don't try to clean up the connection if we're already in error
* recursion trouble.
*/
}
else
{
/* Rollback all remote subtransactions during abort */
sqlitefdw_abort_cleanup(entry, false, &busy_connection);
}
/* OK, we're outta that level of subtransaction */
sqlitefdw_reset_xact_state(entry, false);
}
/* Execute again the query after server is available */
foreach(lc, busy_connection)
{
BusyHandlerArg *arg = lfirst(lc);
/*
* If there is still error, we can not do anything more, just raise it.
* requireBusyHandler is set to false, and NULL busy_connection list.
*/
sqlite_do_sql_command(arg->conn, arg->sql, arg->level, NULL);
}
list_free(busy_connection);
}
/*
* Connection invalidation callback function
*
* After a change to a pg_foreign_server or pg_user_mapping catalog entry,
* mark connections depending on that entry as needing to be remade.
* We can't immediately destroy them, since they might be in the midst of
* a transaction, but we'll remake them at the next opportunity.
*
* Although most cache invalidation callbacks blow away all the related stuff
* regardless of the given hashvalue, connections are expensive enough that
* it's worth trying to avoid that.
*
* NB: We could avoid unnecessary disconnection more strictly by examining
* individual option values, but it seems too much effort for the gain.
*/
static void
sqlitefdw_inval_callback(Datum arg, int cacheid, uint32 hashvalue)
{
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
Assert(cacheid == FOREIGNSERVEROID);
/* ConnectionHash must exist already, if we're registered */
hash_seq_init(&scan, ConnectionHash);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
/* Ignore invalid entries */
if (entry->conn == NULL)
continue;
/* hashvalue == 0 means a cache reset, must clear all state */
if (hashvalue == 0 ||
(cacheid == FOREIGNSERVEROID &&
entry->server_hashvalue == hashvalue))
{
/*
* Close the connection immediately if it's not used yet in this
* transaction. Otherwise mark it as invalid so that
* sqlitefdw_xact_callback() can close it at the end of this
* transaction.
*/
if (entry->xact_depth == 0)
{
elog(DEBUG3, "discarding sqlite_fdw connection %p", entry->conn);
sqlite3_close(entry->conn);
entry->conn = NULL;
}
else
entry->invalidated = true;
}
}
}
/*
* List active foreign server connections.
*
* This function takes no input parameter and returns setof record made of
* following values:
* - server_name - server name of active connection. In case the foreign server
* is dropped but still the connection is active, then the server name will
* be NULL in output.
* - valid - true/false representing whether the connection is valid or not.
* Note that the connections can get invalidated in sqlitefdw_inval_callback.
*
* No records are returned when there are no cached connections at all.
*/
Datum
sqlite_fdw_get_connections(PG_FUNCTION_ARGS)
{
#if PG_VERSION_NUM < 140000
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Function %s does not support in Postgres version %s", __func__, PG_VERSION)
));
#else
#define SQLITE_FDW_GET_CONNECTIONS_COLS 2
ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
#if PG_VERSION_NUM < 150000
TupleDesc tupdesc;
Tuplestorestate *tupstore;
MemoryContext per_query_ctx;
MemoryContext oldcontext;
#endif
#if PG_VERSION_NUM >= 160000
InitMaterializedSRF(fcinfo, 0);
#elif PG_VERSION_NUM >= 150000
SetSingleFuncCall(fcinfo, 0);
#else
/* check to see if caller supports us returning a tuplestore */
if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo))
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("set-valued function called in context that cannot accept a set")));
if (!(rsinfo->allowedModes & SFRM_Materialize))
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("materialize mode required, but it is not allowed in this context")));
/* Build a tuple descriptor for our result type */
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
elog(ERROR, "return type must be a row type");
/* Build tuplestore to hold the result rows */
per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
oldcontext = MemoryContextSwitchTo(per_query_ctx);
tupstore = tuplestore_begin_heap(true, false, work_mem);
rsinfo->returnMode = SFRM_Materialize;
rsinfo->setResult = tupstore;
rsinfo->setDesc = tupdesc;
MemoryContextSwitchTo(oldcontext);
#endif
/* If cache doesn't exist, we return no records */
if (!ConnectionHash)
{
#if PG_VERSION_NUM < 150000
/* clean up and return the tuplestore */
tuplestore_donestoring(tupstore);
#endif
PG_RETURN_VOID();
}
hash_seq_init(&scan, ConnectionHash);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
ForeignServer *server;
Datum values[SQLITE_FDW_GET_CONNECTIONS_COLS] = {0};
bool nulls[SQLITE_FDW_GET_CONNECTIONS_COLS] = {0};
/* We only look for open remote connections */
if (!entry->conn)
continue;
server = GetForeignServerExtended(entry->serverid, FSV_MISSING_OK);
/*
* The foreign server may have been dropped in current explicit
* transaction. It is not possible to drop the server from another
* session when the connection associated with it is in use in the
* current transaction, if tried so, the drop query in another session
* blocks until the current transaction finishes.
*
* Even though the server is dropped in the current transaction, the
* cache can still have associated active connection entry, say we
* call such connections dangling. Since we can not fetch the server
* name from system catalogs for dangling connections, instead we show
* NULL value for server name in output.
*
* We could have done better by storing the server name in the cache
* entry instead of server oid so that it could be used in the output.
* But the server name in each cache entry requires 64 bytes of
* memory, which is huge, when there are many cached connections and
* the use case i.e. dropping the foreign server within the explicit
* current transaction seems rare. So, we chose to show NULL value for
* server name in output.
*
* Such dangling connections get closed either in next use or at the
* end of current explicit transaction in sqlitefdw_xact_callback.
*/
if (!server)
{
/*
* If the server has been dropped in the current explicit
* transaction, then this entry would have been invalidated in
* sqlitefdw_inval_callback at the end of drop server command.
* Note that this connection would not have been closed in
* sqlitefdw_inval_callback because it is still being used in the
* current explicit transaction. So, assert that here.
*/
Assert(entry->conn && entry->xact_depth > 0 && entry->invalidated);
/* Show null, if no server name was found */
nulls[0] = true;
}
else
values[0] = CStringGetTextDatum(server->servername);
values[1] = BoolGetDatum(!entry->invalidated);
#if PG_VERSION_NUM >= 150000
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
#else
tuplestore_putvalues(tupstore, tupdesc, values, nulls);
#endif
}
#if PG_VERSION_NUM < 150000
/* clean up and return the tuplestore */
tuplestore_donestoring(tupstore);
#endif
PG_RETURN_VOID();
#endif
}
/*
* Disconnect the specified cached connections.
*
* This function discards the open connections that are established by
* sqlite_fdw from the local session to the foreign server with
* the given name. Note that there can be multiple connections to
* the given server using different user mappings. If the connections
* are used in the current local transaction, they are not disconnected
* and warning messages are reported. This function returns true
* if it disconnects at least one connection, otherwise false. If no
* foreign server with the given name is found, an error is reported.
*/
Datum
sqlite_fdw_disconnect(PG_FUNCTION_ARGS)
{
#if PG_VERSION_NUM < 140000
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Function %s does not support in Postgres version %s", __func__, PG_VERSION)
));
#else
ForeignServer *server;
char *servername;
servername = text_to_cstring(PG_GETARG_TEXT_PP(0));
server = GetForeignServerByName(servername, false);
PG_RETURN_BOOL(sqlite_disconnect_cached_connections(server->serverid));
#endif
}
/*
* Disconnect all the cached connections.
*
* This function discards all the open connections that are established by
* sqlite_fdw from the local session to the foreign servers.
* If the connections are used in the current local transaction, they are
* not disconnected and warning messages are reported. This function
* returns true if it disconnects at least one connection, otherwise false.
*/
Datum
sqlite_fdw_disconnect_all(PG_FUNCTION_ARGS)
{
#if PG_VERSION_NUM < 140000
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Function %s does not support in Postgres version %s", __func__, PG_VERSION)
));
#else
PG_RETURN_BOOL(sqlite_disconnect_cached_connections(InvalidOid));
#endif
}
/*
* Abort remote transaction or subtransaction.
*
* "toplevel" should be set to true if toplevel (main) transaction is
* rollbacked, false otherwise.
*/
static void
sqlitefdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel, List **busy_connection)
{
if (toplevel)
{
elog(DEBUG3, "abort transaction");
/* Finalize all prepared statements */
sqlite_finalize_list_stmt(&entry->stmtList);
/*
* rollback if in transaction because SQLite may
* already rollback
*/
if (!sqlite3_get_autocommit(entry->conn))
sqlite_do_sql_command(entry->conn, "ROLLBACK", WARNING, busy_connection);
}
else
{
char sql[100];
int curlevel = GetCurrentTransactionNestLevel();
snprintf(sql,
sizeof(sql),
"ROLLBACK TO SAVEPOINT s%d; RELEASE SAVEPOINT s%d",
curlevel,
curlevel
);
if (!sqlite3_get_autocommit(entry->conn))
sqlite_do_sql_command(entry->conn, sql, ERROR, busy_connection);
}
}
#if PG_VERSION_NUM >= 140000
/*
* Workhorse to disconnect cached connections.
*
* This function scans all the connection cache entries and disconnects
* the open connections whose foreign server OID matches with
* the specified one. If InvalidOid is specified, it disconnects all
* the cached connections.
*
* This function emits a warning for each connection that's used in
* the current transaction and doesn't close it. It returns true if
* it disconnects at least one connection, otherwise false.
*
* Note that this function disconnects even the connections that are
* established by other users in the same local session using different
* user mappings. This leads even non-superuser to be able to close
* the connections established by superusers in the same local session.
*
* XXX As of now we don't see any security risk doing this. But we should
* set some restrictions on that, for example, prevent non-superuser
* from closing the connections established by superusers even
* in the same session?
*/
static bool
sqlite_disconnect_cached_connections(Oid serverid)
{
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
bool all = !OidIsValid(serverid);
bool result = false;
/*
* Connection cache hashtable has not been initialized yet in this
* session, so return false.
*/
if (!ConnectionHash)
return false;
hash_seq_init(&scan, ConnectionHash);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
/* Ignore cache entry if no open connection right now. */
if (!entry->conn)
continue;
if (all || entry->serverid == serverid)
{
/*
* Emit a warning because the connection to close is used in the
* current transaction and cannot be disconnected right now.
*/
if (entry->xact_depth > 0)
{
ForeignServer *server;
server = GetForeignServerExtended(entry->serverid,
FSV_MISSING_OK);
if (!server)
{
/*
* If the foreign server was dropped while its connection
* was used in the current transaction, the connection
* must have been marked as invalid by
* sqlitefdw_inval_callback at the end of DROP SERVER
* command.
*/
Assert(entry->invalidated);
ereport(WARNING,
(errmsg("cannot close dropped server connection because it is still in use")));
}
else
ereport(WARNING,
(errmsg("cannot close connection for server \"%s\" because it is still in use",
server->servername)));
}
else
{
elog(DEBUG3, "discarding sqlite_fdw connection %p", entry->conn);
sqlite_finalize_list_stmt(&entry->stmtList);
sqlite3_close(entry->conn);
entry->conn = NULL;
result = true;
}
}
}
return result;
}
#endif
/*
* cache sqlite3 statement to finalize at the end of transaction
*/
void
sqlite_cache_stmt(ForeignServer *server, sqlite3_stmt * *stmt)
{
bool found;
ConnCacheEntry *entry;
ConnCacheKey key = server->serverid;
/*
* Find cached entry for requested connection.
*/
entry = hash_search(ConnectionHash, &key, HASH_ENTER, &found);
/* We must always have found the entry */
Assert(found);
entry->stmtList = sqlite_append_stmt_to_list(entry->stmtList, *stmt);
}
/*
* finalize all sqlite statement
*/
static void
sqlite_finalize_list_stmt(List **list)
{
ListCell *lc;
foreach(lc, *list)
{
sqlite3_stmt *stmt = (sqlite3_stmt *) lfirst(lc);
elog(DEBUG1, "sqlite_fdw: finalize %s", sqlite3_sql(stmt));
sqlite3_finalize(stmt);
}
list_free(*list);
*list = NULL;
}
/*
* append sqlite3 stmt to the head of linked list
*/
static List *
sqlite_append_stmt_to_list(List *list, sqlite3_stmt * stmt)
{
/*
* CurrentMemoryContext is released before cleanup transaction (when the
* list is called), so, use TopMemoryContext instead.
*/
MemoryContext oldcontext = MemoryContextSwitchTo(TopMemoryContext);
list = lappend(list, stmt);
MemoryContextSwitchTo(oldcontext);
return list;
}
================================================
FILE: deparse.c
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* Portions Copyright (c) 2018, TOSHIBA CORPORATION
*
* IDENTIFICATION
* deparse.c
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "sqlite_fdw.h"
#include "catalog/pg_aggregate.h"
#include "catalog/pg_collation.h"
#include "catalog/pg_namespace.h"
#include "catalog/pg_operator.h"
#include "catalog/pg_proc.h"
#if PG_VERSION_NUM >= 160000
#include "catalog/pg_ts_config.h"
#endif
#include "catalog/pg_ts_dict.h"
#if (PG_VERSION_NUM < 130000)
#include "catalog/pg_type.h"
#endif
#include "commands/defrem.h"
#include "mb/pg_wchar.h"
#include "nodes/makefuncs.h"
#include "nodes/nodeFuncs.h"
#include "optimizer/tlist.h"
#include "parser/parsetree.h"
#include "parser/parse_type.h"
#include "utils/builtins.h"
#include "utils/lsyscache.h"
#include "utils/syscache.h"
#include "utils/typcache.h"
/*
* Global context for sqlite_foreign_expr_walker's search of an expression tree.
*/
typedef struct foreign_glob_cxt
{
PlannerInfo *root; /* global planner state */
RelOptInfo *foreignrel; /* the foreign relation we are planning for */
Relids relids; /* relids of base relations in the underlying
* scan */
} foreign_glob_cxt;
/*
* Local (per-tree-level) context for sqlite_foreign_expr_walker's search.
* This is concerned with identifying collations used in the expression.
*/
typedef enum
{
FDW_COLLATE_NONE, /* expression is of a noncollatable type */
FDW_COLLATE_SAFE, /* collation derives from a foreign Var */
FDW_COLLATE_UNSAFE, /* collation derives from something else */
} FDWCollateState;
typedef struct foreign_loc_cxt
{
Oid collation; /* OID of current collation, if any */
FDWCollateState state; /* state of current collation choice */
} foreign_loc_cxt;
/*
* Context for sqlite_deparse_expr
*/
typedef struct deparse_expr_cxt
{
PlannerInfo *root; /* global planner state */
RelOptInfo *foreignrel; /* the foreign relation we are planning for */
RelOptInfo *scanrel; /* the underlying scan relation. Same as
* foreignrel, when that represents a join or
* a base relation. */
StringInfo buf; /* output buffer to append to */
List **params_list; /* exprs that will become remote Params */
Expr *complementarynode; /* variable where we can store, only if
* needed, a complementary node to obtain
* info for processing actual node.
* Created mostly for
* sqlite_deparse_op_expr to have both
* nodes accesible during each node
* deparse. */
} deparse_expr_cxt;
#define QUOTE '"'
#define REL_ALIAS_PREFIX "r"
/* Handy macro to add relation name qualification */
#define ADD_REL_QUALIFIER(buf, varno) \
appendStringInfo((buf), "%s%d.", REL_ALIAS_PREFIX, (varno))
#define SUBQUERY_REL_ALIAS_PREFIX "s"
#define SUBQUERY_COL_ALIAS_PREFIX "c"
/*
* Functions to determine whether an expression can be evaluated safely on
* remote server.
*/
static bool sqlite_foreign_expr_walker(Node *node,
foreign_glob_cxt *glob_cxt,
foreign_loc_cxt *outer_cxt,
foreign_loc_cxt *case_arg_cxt);
/*
* Functions to construct string representation of a node tree.
*/
static void sqlite_deparse_expr(Expr *node, deparse_expr_cxt *context);
static void sqlite_deparse_var(Var *node, deparse_expr_cxt *context);
static void sqlite_deparse_const(Const *node, deparse_expr_cxt *context, int showtype);
static void sqlite_deparse_param(Param *node, deparse_expr_cxt *context);
static void sqlite_deparse_func_expr(FuncExpr *node, deparse_expr_cxt *context);
static void sqlite_deparse_op_expr(OpExpr *node, deparse_expr_cxt *context);
static void sqlite_deparse_operator_name(StringInfo buf, Form_pg_operator opform);
static void sqlite_deparse_scalar_array_op_expr(ScalarArrayOpExpr *node,
deparse_expr_cxt *context);
static void sqlite_deparse_relabel_type(RelabelType *node, deparse_expr_cxt *context);
static void sqlite_deparse_bool_expr(BoolExpr *node, deparse_expr_cxt *context);
static void sqlite_deparse_null_test(NullTest *node, deparse_expr_cxt *context);
static void sqlite_deparse_case_expr(CaseExpr *node, deparse_expr_cxt *context);
static void sqlite_deparse_array_expr(ArrayExpr *node, deparse_expr_cxt *context);
static void sqlite_print_remote_param(int paramindex, Oid paramtype, int32 paramtypmod,
deparse_expr_cxt *context);
static void sqlite_print_remote_placeholder(Oid paramtype, int32 paramtypmod,
deparse_expr_cxt *context);
static void sqlite_deparse_relation(StringInfo buf, Relation rel);
static void sqlite_deparse_target_list(StringInfo buf, PlannerInfo *root, Index rtindex, Relation rel,
Bitmapset *attrs_used, bool qualify_col, List **retrieved_attrs, bool is_concat, bool check_null);
static void sqlite_deparse_column_ref(StringInfo buf, int varno, int varattno, PlannerInfo *root, bool qualify_col, bool dml_context);
static void sqlite_deparse_select(List *tlist, bool is_subquery, List **retrieved_attrs, deparse_expr_cxt *context);
static void sqlite_deparse_subquery_target_list(deparse_expr_cxt *context);
static void sqlite_deparse_case_expr(CaseExpr *node, deparse_expr_cxt *context);
static void sqlite_deparse_null_if_expr(NullIfExpr *node, deparse_expr_cxt *context);
static void sqlite_deparse_coalesce_expr(CoalesceExpr *node, deparse_expr_cxt *context);
static void sqlite_deparse_from_expr_for_rel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel,
bool use_alias, Index ignore_rel, List **ignore_conds,
#if PG_VERSION_NUM >= 170000
List **additional_conds,
#endif
List **params_list);
#if PG_VERSION_NUM >= 170000
static void sqlite_append_where_clause(List *exprs, List *additional_conds,
deparse_expr_cxt *context);
#endif
static void sqlite_deparse_range_tbl_ref(StringInfo buf, PlannerInfo *root,
RelOptInfo *foreignrel, bool make_subquery,
Index ignore_rel, List **ignore_conds,
#if PG_VERSION_NUM >= 170000
List **additional_conds,
#endif
List **params_list);
static void sqlite_deparse_from_expr(List *quals, deparse_expr_cxt *context);
static void sqlite_deparse_aggref(Aggref *node, deparse_expr_cxt *context);
static void sqlite_append_limit_clause(deparse_expr_cxt *context);
static void sqlite_append_conditions(List *exprs, deparse_expr_cxt *context);
static void sqlite_append_group_by_clause(List *tlist, deparse_expr_cxt *context);
static void sqlite_append_agg_order_by(List *orderList, List *targetList,
deparse_expr_cxt *context);
static void sqlite_append_order_by_clause(List *pathkeys, bool has_final_sort, deparse_expr_cxt *context);
static void sqlite_append_order_by_suffix(Oid sortop, Oid sortcoltype, bool nulls_first,
deparse_expr_cxt *context);
static void sqlite_append_function_name(Oid funcid, deparse_expr_cxt *context);
const char *sqlite_get_jointype_name(JoinType jointype);
static Node *sqlite_deparse_sort_group_clause(Index ref, List *tlist, bool force_colno,
deparse_expr_cxt *context);
static void sqlite_deparse_explicit_target_list(List *tlist, List **retrieved_attrs,
deparse_expr_cxt *context);
/*
* Helper functions
*/
static bool sqlite_is_subquery_var(Var *node, RelOptInfo *foreignrel,
int *relno, int *colno);
static void sqlite_get_relation_column_alias_ids(Var *node, RelOptInfo *foreignrel,
int *relno, int *colno);
static char *sqlite_quote_identifier(const char *s, char q);
static bool sqlite_contain_immutable_functions_walker(Node *node, void *context);
static bool sqlite_deparsable_data_type(Param *p);
static int preferred_sqlite_affinity (Oid relid, int varattno);
/*
* Append remote name of specified foreign table to buf.
* Use value of table_name FDW option (if any) instead of relation's name.
* Similarly, schema_name FDW option overrides schema name.
*/
static void
sqlite_deparse_relation(StringInfo buf, Relation rel)
{
ForeignTable *table;
const char *relname = NULL;
ListCell *lc = NULL;
/* obtain additional catalog information. */
table = GetForeignTable(RelationGetRelid(rel));
/*
* Use value of FDW options if any, instead of the name of object itself.
*/
foreach(lc, table->options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "table") == 0)
relname = defGetString(def);
}
if (relname == NULL)
relname = RelationGetRelationName(rel);
/* always use main database for SQLite */
appendStringInfo(buf, "%s.%s", "main", sqlite_quote_identifier(relname, QUOTE));
}
static char *
sqlite_quote_identifier(const char *s, char q)
{
char *result = palloc(strlen(s) * 2 + 3);
char *r = result;
*r++ = q;
while (*s)
{
if (*s == q)
*r++ = *s;
*r++ = *s;
s++;
}
*r++ = q;
*r++ = '\0';
return result;
}
/*
* Returns true if given expr is safe to evaluate on the foreign server.
*/
bool
sqlite_is_foreign_expr(PlannerInfo *root,
RelOptInfo *baserel,
Expr *expr)
{
foreign_glob_cxt glob_cxt;
foreign_loc_cxt loc_cxt;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) (baserel->fdw_private);
/*
* Check that the expression consists of nodes that are safe to execute
* remotely.
*/
glob_cxt.root = root;
glob_cxt.foreignrel = baserel;
/*
* For an upper relation, use relids from its underneath scan relation,
* because the upperrel's own relids currently aren't set to anything
* meaningful by the core code. For other relation, use their own relids.
*/
if (IS_UPPER_REL(baserel))
glob_cxt.relids = fpinfo->outerrel->relids;
else
glob_cxt.relids = baserel->relids;
loc_cxt.collation = InvalidOid;
loc_cxt.state = FDW_COLLATE_NONE;
if (!sqlite_foreign_expr_walker((Node *) expr, &glob_cxt, &loc_cxt, NULL))
return false;
/*
* If the expression has a valid collation that does not arise from a
* foreign var, the expression can not be sent over.
*/
if (loc_cxt.state == FDW_COLLATE_UNSAFE)
return false;
/*
* An expression which includes any mutable functions can't be sent over
* because its result is not stable. For example, sending now() remote
* side could cause confusion from clock offsets. Future versions might
* be able to make this choice with more granularity. (We check this last
* because it requires a lot of expensive catalog lookups.)
*/
if (contain_mutable_functions((Node *) expr))
return false;
/* OK to evaluate on the remote server */
return true;
}
/*
* Returns true if given expr is something we'd have to send the value of
* to the foreign server.
*
* This should return true when the expression is a shippable node that
* deparseExpr would add to context->params_list. Note that we don't care
* if the expression *contains* such a node, only whether one appears at top
* level. We need this to detect cases where setrefs.c would recognize a
* false match between an fdw_exprs item (which came from the params_list)
* and an entry in fdw_scan_tlist (which we're considering putting the given
* expression into).
*/
bool
sqlite_is_foreign_param(PlannerInfo *root,
RelOptInfo *baserel,
Expr *expr)
{
if (expr == NULL)
return false;
switch (nodeTag(expr))
{
case T_Var:
{
/* It would have to be sent unless it's a foreign Var */
Var *var = (Var *) expr;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) (baserel->fdw_private);
Relids relids;
if (IS_UPPER_REL(baserel))
relids = fpinfo->outerrel->relids;
else
relids = baserel->relids;
if (bms_is_member(var->varno, relids) && var->varlevelsup == 0)
return false; /* foreign Var, so not a param */
else
return true; /* it'd have to be a param */
break;
}
case T_Param:
/* Params always have to be sent to the foreign server */
return true;
default:
break;
}
return false;
}
/*
* sqlite_deparsable_data_type:
*
* Checks if values of the data type with given Oid can be deparsed
* to SQLite data type.
*/
static bool
sqlite_deparsable_data_type(Param *p)
{
Oid type = p->paramtype;
switch (type)
{
case INT2OID:
case INT4OID:
case INT8OID:
case OIDOID:
case FLOAT4OID:
case FLOAT8OID:
case NUMERICOID:
case VARCHAROID:
case TEXTOID:
case TIMEOID:
case TIMESTAMPOID:
case TIMESTAMPTZOID:
case UUIDOID:
case MACADDROID:
case MACADDR8OID:
case JSONOID:
case JSONBOID:
return true;
}
#ifdef SQLITE_FDW_GIS_ENABLE
/* PostGIS data types can be supported only by name */
if (listed_datatype_oid(type, p->paramtypmod, postGisSQLiteCompatibleTypes))
{
return true;
}
#endif
return false;
}
/*
* Returns true if it's safe to push down the sort expression described by
* 'pathkey' to the foreign server.
*/
bool
sqlite_is_foreign_pathkey(PlannerInfo *root,
RelOptInfo *baserel,
PathKey *pathkey)
{
EquivalenceClass *pathkey_ec = pathkey->pk_eclass;
EquivalenceMember *em;
/*
* is_foreign_expr would detect volatile expressions as well, but checking
* ec_has_volatile here saves some cycles.
*/
if (pathkey_ec->ec_has_volatile)
return false;
/* can't push down the sort if the pathkey's opfamily is not built-in */
if (!sqlite_is_builtin(pathkey->pk_opfamily))
return false;
/* Find a suitable EC member */
em = sqlite_find_em_for_rel(root, pathkey_ec, baserel);
if (em)
{
Oid oprid;
TypeCacheEntry *typentry;
oprid = get_opfamily_member(pathkey->pk_opfamily,
em->em_datatype,
em->em_datatype,
pathkey->pk_strategy);
if (!OidIsValid(oprid))
elog(ERROR, "missing operator %d(%u,%u) in opfamily %u",
pathkey->pk_strategy, em->em_datatype, em->em_datatype,
pathkey->pk_opfamily);
/* See whether operator is default < or > for sort expr's datatype. */
typentry = lookup_type_cache(exprType((Node *) em->em_expr),
TYPECACHE_LT_OPR | TYPECACHE_GT_OPR);
/* SQLite does not support USING, so do not push down it */
if (oprid != typentry->lt_opr && oprid != typentry->gt_opr)
return false;
}
else
return false;
return true;
}
/*
* Check if expression is safe to execute remotely, and return true if so.
*
* In addition, *outer_cxt is updated with collation information.
*
* We must check that the expression contains only node types we can deparse,
* that all types/functions/operators are safe to send (which we approximate
* as being built-in), and that all collations used in the expression derive
* from Vars of the foreign table. Because of the latter, the logic is
* pretty close to assign_collations_walker() in parse_collate.c, though we
* can assume here that the given expression is valid.
*/
static bool
sqlite_foreign_expr_walker(Node *node,
foreign_glob_cxt *glob_cxt,
foreign_loc_cxt *outer_cxt,
foreign_loc_cxt *case_arg_cxt)
{
bool check_type = true;
foreign_loc_cxt inner_cxt;
Oid collation = InvalidOid;
FDWCollateState state = FDW_COLLATE_NONE;
HeapTuple tuple;
/* Need do nothing for empty subexpressions */
if (node == NULL)
return true;
/* Set up inner_cxt for possible recursion to child nodes */
inner_cxt.collation = InvalidOid;
inner_cxt.state = FDW_COLLATE_NONE;
switch (nodeTag(node))
{
case T_Var:
{
Var *var = (Var *) node;
elog(DEBUG2, "sqlite_fdw : %s T_Var", __func__);
/*
* If the Var is from the foreign table, we consider its
* collation (if any) safe to use. If it is from another
* table, we treat its collation the same way as we would a
* Param's collation, ie it's not safe for it to have a
* non-default collation.
*/
if (bms_is_member(var->varno, glob_cxt->relids) &&
var->varlevelsup == 0)
{
/* Var belongs to foreign table */
/*
* System columns (e.g. oid, ctid) should not be sent to
* the remote, since we don't make any effort to ensure
* that local and remote values match (tableoid, in
* particular, almost certainly doesn't match).
*/
if (var->varattno < 0)
return false;
/* Else check the collation */
collation = var->varcollid;
state = OidIsValid(collation) ? FDW_COLLATE_SAFE : FDW_COLLATE_NONE;
}
else
{
/* Var belongs to some other table */
collation = var->varcollid;
if (collation == InvalidOid ||
collation == DEFAULT_COLLATION_OID)
{
/*
* It's noncollatable, or it's safe to combine with a
* collatable foreign Var, so set state to NONE.
*/
state = FDW_COLLATE_NONE;
}
else
{
/*
* Do not fail right away, since the Var might appear
* in a collation-insensitive context.
*/
state = FDW_COLLATE_UNSAFE;
}
}
}
break;
case T_Const:
{
Const *c = (Const *) node;
elog(DEBUG2, "sqlite_fdw : %s T_Const", __func__);
/* SQLite cannot handle interval type */
if (c->consttype == INTERVALOID)
return false;
/*
* If the constant has nondefault collation, either it's of a
* non-builtin type, or it reflects folding of a CollateExpr;
* either way, it's unsafe to send to the remote.
*/
if (c->constcollid != InvalidOid &&
c->constcollid != DEFAULT_COLLATION_OID)
return false;
/* Otherwise, we can consider that it doesn't set collation */
collation = InvalidOid;
state = FDW_COLLATE_NONE;
}
break;
case T_CaseTestExpr:
{
CaseTestExpr *c = (CaseTestExpr *) node;
elog(DEBUG2, "sqlite_fdw : %s T_CaseTestExpr", __func__);
/* Punt if we seem not to be inside a CASE arg WHEN. */
if (!case_arg_cxt)
return false;
/*
* Otherwise, any nondefault collation attached to the
* CaseTestExpr node must be derived from foreign Var(s) in
* the CASE arg.
*/
collation = c->collation;
if (collation == InvalidOid)
state = FDW_COLLATE_NONE;
else if (case_arg_cxt->state == FDW_COLLATE_SAFE &&
collation == case_arg_cxt->collation)
state = FDW_COLLATE_SAFE;
else if (collation == DEFAULT_COLLATION_OID)
state = FDW_COLLATE_NONE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_Param:
{
Param *p = (Param *) node;
elog(DEBUG2, "sqlite_fdw : %s T_Param", __func__);
/*
* If it's a MULTIEXPR Param, punt. We can't tell from here
* whether the referenced sublink/subplan contains any remote
* Vars; if it does, handling that is too complicated to
* consider supporting at present. Fortunately, MULTIEXPR
* Params are not reduced to plain PARAM_EXEC until the end of
* planning, so we can easily detect this case. (Normal
* PARAM_EXEC Params are safe to ship because their values
* come from somewhere else in the plan tree; but a MULTIEXPR
* references a sub-select elsewhere in the same targetlist,
* so we'd be on the hook to evaluate it somehow if we wanted
* to handle such cases as direct foreign updates.)
*/
if (p->paramkind == PARAM_MULTIEXPR)
return false;
if (!sqlite_deparsable_data_type(p))
return false;
/*
* Collation rule is same as for Consts and non-foreign Vars.
*/
collation = p->paramcollid;
if (collation == InvalidOid ||
collation == DEFAULT_COLLATION_OID)
state = FDW_COLLATE_NONE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_FuncExpr:
{
FuncExpr *func = (FuncExpr *) node;
char *opername = NULL;
Oid schema;
elog(DEBUG2, "sqlite_fdw : %s T_FuncExpr", __func__);
/* get function name and schema */
tuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(func->funcid));
if (!HeapTupleIsValid(tuple))
{
elog(ERROR, "cache lookup failed for function %u", func->funcid);
}
opername = pstrdup(((Form_pg_proc) GETSTRUCT(tuple))->proname.data);
schema = ((Form_pg_proc) GETSTRUCT(tuple))->pronamespace;
ReleaseSysCache(tuple);
/* ignore functions in other than the pg_catalog schema */
if (schema != PG_CATALOG_NAMESPACE)
return false;
/*
* These function can be passed to SQLite. In case of nest
* functions, for example, (round(abs(c1), 0) = 1, the
* postgres core will transform to
* (round((abs(t1.c1))::numeric, 0) = '1'::numeric), so
* "::numberic" is kind of function format
* COERCE_IMPLICIT_CAST we must check.
*
* In SQLite, lower/upper function does not support UNICODE
* character, so we don't push down these functions.
*
*/
if (!(func->funcformat == COERCE_IMPLICIT_CAST
|| strcmp(opername, "abs") == 0
|| strcmp(opername, "btrim") == 0
|| strcmp(opername, "length") == 0
|| strcmp(opername, "ltrim") == 0
|| strcmp(opername, "replace") == 0
|| strcmp(opername, "round") == 0
|| strcmp(opername, "rtrim") == 0
|| strcmp(opername, "substr") == 0
|| strcmp(opername, "mod") == 0 ))
{
return false;
}
if (!sqlite_foreign_expr_walker((Node *) func->args,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/*
* If function's input collation is not derived from a foreign
* Var, it can't be sent to remote.
*/
if (func->inputcollid == InvalidOid)
/* OK, inputs are all noncollatable */ ;
else if (inner_cxt.state != FDW_COLLATE_SAFE ||
func->inputcollid != inner_cxt.collation)
return false;
/*
* Detect whether node is introducing a collation not derived
* from a foreign Var. (If so, we just mark it unsafe for now
* rather than immediately returning false, since the parent
* node might not care.)
*/
collation = func->funccollid;
if (collation == InvalidOid)
state = FDW_COLLATE_NONE;
else if (inner_cxt.state == FDW_COLLATE_SAFE &&
collation == inner_cxt.collation)
state = FDW_COLLATE_SAFE;
else if (collation == DEFAULT_COLLATION_OID)
state = FDW_COLLATE_NONE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_OpExpr:
case T_NullIfExpr:
{
char *cur_opname = NULL;
OpExpr *oe = (OpExpr *) node;
Form_pg_operator form;
Oid oprleft = InvalidOid;
Oid oprright = InvalidOid;
bool non_builtin_pushable_opr = false;
elog(DEBUG2, "sqlite_fdw : %s T_OpExpr|T_NullIfExpr", __func__);
tuple = SearchSysCache1(OPEROID, ObjectIdGetDatum(oe->opno));
if (!HeapTupleIsValid(tuple))
elog(ERROR, "cache lookup failed for operator %u", oe->opno);
form = (Form_pg_operator) GETSTRUCT(tuple);
/* opname is not a SQL identifier, so we should not quote it. */
cur_opname = pstrdup(NameStr(form->oprname));
oprleft = form->oprleft;
oprright = form->oprright;
ReleaseSysCache(tuple);
/*
* Similarly, only built-in or PostGIS = operators can be
* sent to remote. (If the operator is remote executable,
* surely its underlying function is too.)
*/
if (!sqlite_is_builtin(oe->opno))
{
/*
* Predicate of non built-in operators possible
* can be pushed down. For example, some PostGIS oparators.
*/
if ((strcmp(cur_opname, "=") == 0))
non_builtin_pushable_opr = true; /* Set it to true for later check */
else
return false;
}
/*
* Factorial (!) and Bitwise XOR (^), (#)
* cannot be pushed down to SQLite
* Full list see in https://www.postgresql.org/docs/current/functions-bitstring.html
* ILIKE cannot be pushed down to SQLite
* Full list see in https://www.postgresql.org/docs/current/functions-matching.html
*/
if (strcmp(cur_opname, "!") == 0
|| strcmp(cur_opname, "^") == 0
|| strcmp(cur_opname, "#") == 0
|| strcmp(cur_opname, "~~*") == 0
|| strcmp(cur_opname, "!~~*") == 0
/* JSON/JSONB operators with array or
* other JSON/JSONB or
* jsonpath as right operand
* https://www.postgresql.org/docs/current/functions-json.html
*/
|| ((oprleft == JSONOID || oprleft == JSONBOID)
&& (strcmp(cur_opname, "#>") == 0
|| strcmp(cur_opname, "#>>") == 0
|| strcmp(cur_opname, "@>") == 0
|| strcmp(cur_opname, "<@") == 0
|| strcmp(cur_opname, "?|") == 0
|| strcmp(cur_opname, "?&") == 0
|| strcmp(cur_opname, "@?") == 0
|| strcmp(cur_opname, "@@") == 0
|| strcmp(cur_opname, "||") == 0
|| strcmp(cur_opname, "?") == 0
|| strcmp(cur_opname, "-") == 0
|| strcmp(cur_opname, "#-") == 0
|| strcmp(cur_opname, "#-?") == 0
)))
{
return false;
}
if (non_builtin_pushable_opr)
{
/* If left operand is not PostGIS supported data type, do not push down */
if (sqlite_is_builtin(oprleft) || (!listed_datatype_oid(oprleft, -1, postGisSQLiteCompatibleTypes)))
return false;
/* If right operand is not PostGIS supported data type, do not push down */
if (sqlite_is_builtin(oprright) || (!listed_datatype_oid(oprright, -1, postGisSQLiteCompatibleTypes)))
return false;
/* Log operator for potential pushing down */
elog(DEBUG2, "sqlite_fdw : %s pushable PostGIS operator", cur_opname);
}
/*
* Recurse to input subexpressions.
*/
if (!sqlite_foreign_expr_walker((Node *) oe->args,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/*
* If operator's input collation is not derived from a foreign
* Var, it can't be sent to remote.
*/
if (oe->inputcollid == InvalidOid)
/* OK, inputs are all noncollatable */ ;
else if ((inner_cxt.state != FDW_COLLATE_SAFE ||
oe->inputcollid != inner_cxt.collation) &&
oprleft != JSONOID &&
oprleft != JSONBOID)
{
elog(DEBUG2, "sqlite_fdw : %s collate problems, do not push\n input coll %d, cxt coll %d, operator %d %s %d, ctxst %d", __func__, oe->inputcollid, inner_cxt.collation, oprleft, cur_opname, oprright, inner_cxt.state);
return false;
}
/* Result-collation handling is same as for functions */
collation = oe->opcollid;
if (collation == InvalidOid)
state = FDW_COLLATE_NONE;
else if (inner_cxt.state == FDW_COLLATE_SAFE &&
collation == inner_cxt.collation)
state = FDW_COLLATE_SAFE;
else if (collation == DEFAULT_COLLATION_OID)
state = FDW_COLLATE_SAFE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_ScalarArrayOpExpr:
{
ScalarArrayOpExpr *oe = (ScalarArrayOpExpr *) node;
elog(DEBUG2, "sqlite_fdw : %s T_ScalarArrayOpExpr", __func__);
/*
* Again, only built-in operators can be sent to remote.
*/
if (!sqlite_is_builtin(oe->opno))
return false;
/*
* Recurse to input subexpressions.
*/
if (!sqlite_foreign_expr_walker((Node *) oe->args,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/*
* If operator's input collation is not derived from a foreign
* Var, it can't be sent to remote.
*/
if (oe->inputcollid == InvalidOid)
/* OK, inputs are all noncollatable */ ;
else if (inner_cxt.state != FDW_COLLATE_SAFE ||
oe->inputcollid != inner_cxt.collation)
return false;
/* Output is always boolean and so noncollatable. */
collation = InvalidOid;
state = FDW_COLLATE_NONE;
}
break;
case T_RelabelType:
{
RelabelType *r = (RelabelType *) node;
elog(DEBUG2, "sqlite_fdw : %s T_RelabelType", __func__);
/*
* Recurse to input subexpression.
*/
if (!sqlite_foreign_expr_walker((Node *) r->arg,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/*
* RelabelType must not introduce a collation not derived from
* an input foreign Var.
*/
collation = r->resultcollid;
if (collation == InvalidOid)
state = FDW_COLLATE_NONE;
else if (inner_cxt.state == FDW_COLLATE_SAFE &&
collation == inner_cxt.collation)
state = FDW_COLLATE_SAFE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_BoolExpr:
{
BoolExpr *b = (BoolExpr *) node;
elog(DEBUG2, "sqlite_fdw : %s T_BoolExpr", __func__);
/*
* Recurse to input subexpressions.
*/
if (!sqlite_foreign_expr_walker((Node *) b->args,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/* Output is always boolean and so noncollatable. */
collation = InvalidOid;
state = FDW_COLLATE_NONE;
}
break;
case T_NullTest:
{
NullTest *nt = (NullTest *) node;
elog(DEBUG2, "sqlite_fdw : %s T_NullTest", __func__);
/*
* Recurse to input subexpressions.
*/
if (!sqlite_foreign_expr_walker((Node *) nt->arg,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/* Output is always boolean and so noncollatable. */
collation = InvalidOid;
state = FDW_COLLATE_NONE;
}
break;
case T_List:
{
List *l = (List *) node;
ListCell *lc;
elog(DEBUG2, "sqlite_fdw : %s T_List", __func__);
/*
* Recurse to component subexpressions.
*/
foreach(lc, l)
{
if (!sqlite_foreign_expr_walker((Node *) lfirst(lc),
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
}
/*
* When processing a list, collation state just bubbles up
* from the list elements.
*/
collation = inner_cxt.collation;
state = inner_cxt.state;
/* Don't apply exprType() to the list. */
check_type = false;
}
break;
case T_CoalesceExpr:
{
CoalesceExpr *coalesce = (CoalesceExpr *) node;
ListCell *lc;
elog(DEBUG2, "sqlite_fdw : %s T_CoalesceExpr", __func__);
if (list_length(coalesce->args) < 2)
return false;
/* Recurse to each argument */
foreach(lc, coalesce->args)
{
if (!sqlite_foreign_expr_walker((Node *) lfirst(lc),
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
}
}
break;
case T_CaseExpr:
{
CaseExpr *ce = (CaseExpr *) node;
foreign_loc_cxt arg_cxt;
foreign_loc_cxt tmp_cxt;
ListCell *lc;
elog(DEBUG2, "sqlite_fdw : %s T_CaseExpr", __func__);
/*
* Recurse to CASE's arg expression, if any. Its collation
* has to be saved aside for use while examining CaseTestExprs
* within the WHEN expressions.
*/
arg_cxt.collation = InvalidOid;
arg_cxt.state = FDW_COLLATE_NONE;
if (ce->arg)
{
if (!sqlite_foreign_expr_walker((Node *) ce->arg,
glob_cxt, &arg_cxt, case_arg_cxt))
return false;
}
/* Examine the CaseWhen subexpressions. */
foreach(lc, ce->args)
{
CaseWhen *cw = lfirst_node(CaseWhen, lc);
if (ce->arg)
{
/*
* In a CASE-with-arg, the parser should have produced
* WHEN clauses of the form "CaseTestExpr = RHS",
* possibly with an implicit coercion inserted above
* the CaseTestExpr. However in an expression that's
* been through the optimizer, the WHEN clause could
* be almost anything (since the equality operator
* could have been expanded into an inline function).
* In such cases forbid pushdown, because
* deparseCaseExpr can't handle it.
*/
Node *whenExpr = (Node *) cw->expr;
List *opArgs;
if (!IsA(whenExpr, OpExpr))
return false;
opArgs = ((OpExpr *) whenExpr)->args;
if (list_length(opArgs) != 2 ||
!IsA(strip_implicit_coercions(linitial(opArgs)),
CaseTestExpr))
return false;
}
/*
* Recurse to WHEN expression, passing down the arg info.
* Its collation doesn't affect the result (really, it
* should be boolean and thus not have a collation).
*/
tmp_cxt.collation = InvalidOid;
tmp_cxt.state = FDW_COLLATE_NONE;
if (!sqlite_foreign_expr_walker((Node *) cw->expr,
glob_cxt, &tmp_cxt, &arg_cxt))
return false;
/* Recurse to THEN expression. */
if (!sqlite_foreign_expr_walker((Node *) cw->result,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
}
/* Recurse to ELSE expression. */
if (!sqlite_foreign_expr_walker((Node *) ce->defresult,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/*
* Detect whether node is introducing a collation not derived
* from a foreign Var. (If so, we just mark it unsafe for now
* rather than immediately returning false, since the parent
* node might not care.) This is the same as for function
* nodes, except that the input collation is derived from only
* the THEN and ELSE subexpressions.
*/
collation = ce->casecollid;
if (collation == InvalidOid)
state = FDW_COLLATE_NONE;
else if (inner_cxt.state == FDW_COLLATE_SAFE &&
collation == inner_cxt.collation)
state = FDW_COLLATE_SAFE;
else if (collation == DEFAULT_COLLATION_OID)
state = FDW_COLLATE_NONE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_Aggref:
{
Aggref *agg = (Aggref *) node;
ListCell *lc;
char *opername = NULL;
Oid schema;
elog(DEBUG2, "sqlite_fdw : %s T_Aggref", __func__);
/* get function name and schema */
tuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(agg->aggfnoid));
if (!HeapTupleIsValid(tuple))
{
elog(ERROR, "cache lookup failed for function %u", agg->aggfnoid);
}
opername = pstrdup(((Form_pg_proc) GETSTRUCT(tuple))->proname.data);
schema = ((Form_pg_proc) GETSTRUCT(tuple))->pronamespace;
ReleaseSysCache(tuple);
/* ignore functions in other than the pg_catalog schema */
if (schema != PG_CATALOG_NAMESPACE)
return false;
/* these function can be passed to SQLite */
if (!(strcmp(opername, "sum") == 0
|| strcmp(opername, "avg") == 0
|| strcmp(opername, "max") == 0
|| strcmp(opername, "min") == 0
|| strcmp(opername, "count") == 0))
{
return false;
}
/* Not safe to pushdown when not in grouping context */
if (!IS_UPPER_REL(glob_cxt->foreignrel))
return false;
/* Only non-split aggregates are pushable. */
if (agg->aggsplit != AGGSPLIT_SIMPLE)
return false;
/*
* Recurse to input args. aggdirectargs, aggorder and
* aggdistinct are all present in args, so no need to check
* their shippability explicitly.
*/
foreach(lc, agg->args)
{
Node *n = (Node *) lfirst(lc);
/* If TargetEntry, extract the expression from it */
if (IsA(n, TargetEntry))
{
TargetEntry *tle = (TargetEntry *) n;
n = (Node *) tle->expr;
}
if (!sqlite_foreign_expr_walker(n, glob_cxt, &inner_cxt, case_arg_cxt))
return false;
}
if (agg->aggorder || agg->aggfilter)
{
return false;
}
/*
* If aggregate's input collation is not derived from a
* foreign Var, it can't be sent to remote.
*/
if (agg->inputcollid == InvalidOid)
/* OK, inputs are all noncollatable */ ;
else if (inner_cxt.state != FDW_COLLATE_SAFE ||
agg->inputcollid != inner_cxt.collation)
return false;
/*
* Detect whether node is introducing a collation not derived
* from a foreign Var. (If so, we just mark it unsafe for now
* rather than immediately returning false, since the parent
* node might not care.)
*/
collation = agg->aggcollid;
if (collation == InvalidOid)
state = FDW_COLLATE_NONE;
else if (inner_cxt.state == FDW_COLLATE_SAFE &&
collation == inner_cxt.collation)
state = FDW_COLLATE_SAFE;
else if (collation == DEFAULT_COLLATION_OID)
state = FDW_COLLATE_NONE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_ArrayExpr:
{
ArrayExpr *a = (ArrayExpr *) node;
elog(DEBUG2, "sqlite_fdw : %s T_ArrayExpr", __func__);
/*
* Recurse to input subexpressions.
*/
if (!sqlite_foreign_expr_walker((Node *) a->elements,
glob_cxt, &inner_cxt, case_arg_cxt))
return false;
/*
* ArrayExpr must not introduce a collation not derived from
* an input foreign Var (same logic as for a function).
*/
collation = a->array_collid;
if (collation == InvalidOid)
state = FDW_COLLATE_NONE;
else if (inner_cxt.state == FDW_COLLATE_SAFE &&
collation == inner_cxt.collation)
state = FDW_COLLATE_SAFE;
else if (collation == DEFAULT_COLLATION_OID)
state = FDW_COLLATE_NONE;
else
state = FDW_COLLATE_UNSAFE;
}
break;
case T_DistinctExpr:
{
/* IS DISTINCT FROM */
elog(DEBUG2, "sqlite_fdw : %s T_DistinctExpr", __func__);
return false;
}
default:
{
elog(DEBUG1, "sqlite_fdw : %s other", __func__);
/*
* If it's anything else, assume it's unsafe. This list can be
* expanded later, but don't forget to add deparse support below.
*/
return false;
}
}
/*
* If result type of given expression is not built-in or PostGIS, it can't be sent to
* remote because it might have incompatible semantics on remote side.
*/
if (check_type)
{
Oid typeOid = exprType(node);
if (!(sqlite_is_builtin(typeOid) || listed_datatype_oid(typeOid, -1, postGisSQLiteCompatibleTypes)))
return false;
}
/*
* Now, merge my collation information into my parent's state.
*/
if (state > outer_cxt->state)
{
/* Override previous parent state */
outer_cxt->collation = collation;
outer_cxt->state = state;
}
else if (state == outer_cxt->state)
{
/* Merge, or detect error if there's a collation conflict */
switch (state)
{
case FDW_COLLATE_NONE:
/* Nothing + nothing is still nothing */
break;
case FDW_COLLATE_SAFE:
if (collation != outer_cxt->collation)
{
/*
* Non-default collation always beats default.
*/
if (outer_cxt->collation == DEFAULT_COLLATION_OID)
{
/* Override previous parent state */
outer_cxt->collation = collation;
}
else if (collation != DEFAULT_COLLATION_OID)
{
/*
* Conflict; show state as indeterminate. We don't
* want to "return false" right away, since parent
* node might not care about collation.
*/
outer_cxt->state = FDW_COLLATE_UNSAFE;
}
}
break;
case FDW_COLLATE_UNSAFE:
/* We're still conflicted ... */
break;
}
}
/* It looks OK */
elog(DEBUG2, "sqlite_fdw : %s, pushed down", __func__);
return true;
}
/*
* Build the targetlist for given relation to be deparsed as SELECT clause.
*
* The output targetlist contains the columns that need to be fetched from the
* foreign server for the given relation. If foreignrel is an upper relation,
* then the output targetlist can also contains expressions to be evaluated on
* foreign server.
*/
List *
sqlite_build_tlist_to_deparse(RelOptInfo *foreignrel)
{
List *tlist = NIL;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
ListCell *lc;
/*
* For an upper relation, we have already built the target list while
* checking shippability, so just return that.
*/
if (IS_UPPER_REL(foreignrel))
return fpinfo->grouped_tlist;
/*
* We require columns specified in foreignrel->reltarget->exprs and those
* required for evaluating the local conditions.
*/
tlist = add_to_flat_tlist(tlist,
pull_var_clause((Node *) foreignrel->reltarget->exprs,
PVC_RECURSE_PLACEHOLDERS));
foreach(lc, fpinfo->local_conds)
{
RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
tlist = add_to_flat_tlist(tlist,
pull_var_clause((Node *) rinfo->clause,
PVC_RECURSE_PLACEHOLDERS));
}
return tlist;
}
/*
* Deparse SELECT statement for given relation into buf.
*
* tlist contains the list of desired columns to be fetched from foreign server.
* For a base relation fpinfo->attrs_used is used to construct SELECT clause,
* hence the tlist is ignored for a base relation.
*
* remote_conds is the list of conditions to be deparsed into the WHERE clause
* (or, in the case of upper relations, into the HAVING clause).
*
* If params_list is not NULL, it receives a list of Params and other-relation
* Vars used in the clauses; these values must be transmitted to the remote
* server as parameter values.
*
* If params_list is NULL, we're generating the query for EXPLAIN purposes,
* so Params and other-relation Vars should be replaced by dummy values.
*
* pathkeys is the list of pathkeys to order the result by.
*
* List of columns selected is returned in retrieved_attrs.
*/
void
sqlite_deparse_select_stmt_for_rel(StringInfo buf, PlannerInfo *root, RelOptInfo *rel,
List *tlist, List *remote_conds, List *pathkeys,
bool has_final_sort, bool has_limit, bool is_subquery,
List **retrieved_attrs,
List **params_list)
{
deparse_expr_cxt context;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) rel->fdw_private;
List *quals;
/*
* We handle relations for foreign tables, joins between those and upper
* relations.
*/
Assert(IS_JOIN_REL(rel) ||
IS_SIMPLE_REL(rel) ||
IS_OTHER_REL(rel) ||
IS_UPPER_REL(rel));
/* Fill portions of context common to upper, join and base relation */
context.buf = buf;
context.root = root;
context.foreignrel = rel;
context.scanrel = IS_UPPER_REL(rel) ?
fpinfo->outerrel : rel;
context.params_list = params_list;
/* Construct SELECT clause */
sqlite_deparse_select(tlist, is_subquery, retrieved_attrs, &context);
/*
* For upper relations, the WHERE clause is built from the remote
* conditions of the underlying scan relation; otherwise, we can use the
* supplied list of remote conditions directly.
*/
if (IS_UPPER_REL(rel))
{
SqliteFdwRelationInfo *ofpinfo;
ofpinfo = (SqliteFdwRelationInfo *) fpinfo->outerrel->fdw_private;
quals = ofpinfo->remote_conds;
}
else
quals = remote_conds;
/* Construct FROM and WHERE clauses */
sqlite_deparse_from_expr(quals, &context);
if (IS_UPPER_REL(rel))
{
/* Append GROUP BY clause */
sqlite_append_group_by_clause(tlist, &context);
/* Append HAVING clause */
if (remote_conds)
{
appendStringInfo(buf, " HAVING ");
sqlite_append_conditions(remote_conds, &context);
}
}
/* Add ORDER BY clause if we found any useful pathkeys */
if (pathkeys)
sqlite_append_order_by_clause(pathkeys, has_final_sort, &context);
/* Add LIMIT clause if necessary */
if (has_limit)
sqlite_append_limit_clause(&context);
}
/*
* Deparese SELECT statment
*/
static void
sqlite_deparse_select(List *tlist, bool is_subquery, List **retrieved_attrs, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
PlannerInfo *root = context->root;
RelOptInfo *foreignrel = context->foreignrel;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
/*
* Construct SELECT list
*/
appendStringInfoString(buf, "SELECT ");
if (is_subquery)
{
/*
* For a relation that is deparsed as a subquery, emit expressions
* specified in the relation's reltarget. Note that since this is for
* the subquery, no need to care about *retrieved_attrs.
*/
sqlite_deparse_subquery_target_list(context);
}
else if (IS_JOIN_REL(foreignrel) ||
fpinfo->is_tlist_func_pushdown == true ||
IS_UPPER_REL(foreignrel))
{
/*
* For a join or upper relation the input tlist gives the list of
* columns required to be fetched from the foreign server.
*/
sqlite_deparse_explicit_target_list(tlist, retrieved_attrs, context);
}
else
{
/*
* For a base relation fpinfo->attrs_used gives the list of columns
* required to be fetched from the foreign server.
*/
RangeTblEntry *rte = planner_rt_fetch(foreignrel->relid, root);
/*
* Core code already has some lock on each rel being planned, so we
* can use NoLock here.
*/
Relation rel = table_open(rte->relid, NoLock);
sqlite_deparse_target_list(buf, root, foreignrel->relid, rel, fpinfo->attrs_used, false, retrieved_attrs, false, false);
table_close(rel, NoLock);
}
}
/*
* Construct a FROM clause and, if needed, a WHERE clause, and append those to
* "buf".
*
* quals is the list of clauses to be included in the WHERE clause.
*/
static void
sqlite_deparse_from_expr(List *quals, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
RelOptInfo *scanrel = context->scanrel;
#if PG_VERSION_NUM >= 170000
List *additional_conds = NIL;
#endif
/* For upper relations, scanrel must be either a joinrel or a baserel */
Assert(!IS_UPPER_REL(context->foreignrel) ||
IS_JOIN_REL(scanrel) ||
IS_SIMPLE_REL(scanrel));
/* Construct FROM clause */
appendStringInfoString(buf, " FROM ");
sqlite_deparse_from_expr_for_rel(buf, context->root, scanrel,
(bms_num_members(scanrel->relids) == BMS_MULTIPLE),
(Index) 0, NULL,
#if PG_VERSION_NUM >= 170000
&additional_conds,
#endif
context->params_list);
#if PG_VERSION_NUM >= 170000
sqlite_append_where_clause(quals, additional_conds, context);
if (additional_conds != NIL)
list_free_deep(additional_conds);
#else
/* Construct WHERE clause */
if (quals != NIL)
{
appendStringInfo(buf, " WHERE ");
sqlite_append_conditions(quals, context);
}
#endif
}
/*
* Deparse conditions from the provided list and append them to buf.
*
* The conditions in the list are assumed to be ANDed. This function is used to
* deparse WHERE clauses, JOIN .. ON clauses and HAVING clauses.
*/
static void
sqlite_append_conditions(List *exprs, deparse_expr_cxt *context)
{
int nestlevel;
ListCell *lc;
bool is_first = true;
StringInfo buf = context->buf;
/* Make sure any constants in the exprs are printed portably */
nestlevel = sqlite_set_transmission_modes();
foreach(lc, exprs)
{
Expr *expr = (Expr *) lfirst(lc);
/* Extract clause from RestrictInfo, if required */
if (IsA(expr, RestrictInfo))
expr = ((RestrictInfo *) expr)->clause;
/* Connect expressions with "AND" and parenthesize each condition. */
if (!is_first)
appendStringInfoString(buf, " AND ");
appendStringInfoChar(buf, '(');
sqlite_deparse_expr(expr, context);
appendStringInfoChar(buf, ')');
is_first = false;
}
sqlite_reset_transmission_modes(nestlevel);
}
/* Output join name for given join type */
const char *
sqlite_get_jointype_name(JoinType jointype)
{
switch (jointype)
{
case JOIN_INNER:
return "INNER";
case JOIN_LEFT:
return "LEFT";
case JOIN_RIGHT:
return "RIGHT";
case JOIN_FULL:
return "FULL";
#if PG_VERSION_NUM >= 170000
case JOIN_SEMI:
return "SEMI";
#endif
default:
/* Shouldn't come here, but protect from buggy code. */
elog(ERROR, "unsupported join type %d", jointype);
}
/* Keep compiler happy */
return NULL;
}
/*
* Deparse given targetlist and append it to context->buf.
*
* tlist is list of TargetEntry's which in turn contain Var nodes.
*
* retrieved_attrs is the list of continuously increasing integers starting
* from 1. It has same number of entries as tlist.
*/
static void
sqlite_deparse_explicit_target_list(List *tlist, List **retrieved_attrs,
deparse_expr_cxt *context)
{
ListCell *lc;
StringInfo buf = context->buf;
int i = 0;
*retrieved_attrs = NIL;
foreach(lc, tlist)
{
TargetEntry *tle = lfirst_node(TargetEntry, lc);
if (i > 0)
appendStringInfoString(buf, ", ");
sqlite_deparse_expr((Expr *) tle->expr, context);
*retrieved_attrs = lappend_int(*retrieved_attrs, i + 1);
i++;
}
if (i == 0)
appendStringInfoString(buf, "NULL");
}
/*
* Emit expressions specified in the given relation's reltarget.
*
* This is used for deparsing the given relation as a subquery.
*/
static void
sqlite_deparse_subquery_target_list(deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
RelOptInfo *foreignrel = context->foreignrel;
bool first;
ListCell *lc;
int col = 1;
/* Should only be called in these cases. */
Assert(IS_SIMPLE_REL(foreignrel) || IS_JOIN_REL(foreignrel));
first = true;
foreach(lc, foreignrel->reltarget->exprs)
{
Node *node = (Node *) lfirst(lc);
if (!first)
appendStringInfoString(buf, ", ");
first = false;
sqlite_deparse_expr((Expr *) node, context);
appendStringInfo(buf, " AS %s%d", SUBQUERY_COL_ALIAS_PREFIX, col);
col++;
}
/* Don't generate bad syntax if no expressions */
if (first)
appendStringInfoString(buf, "NULL");
}
/*
* Construct FROM clause for given relation
*
* The function constructs ... JOIN ... ON ... for join relation. For a base
* relation it just returns schema-qualified tablename, with the appropriate
* alias if so requested.
*
* 'ignore_rel' is either zero or the RT index of a target relation. In the
* latter case the function constructs FROM clause of UPDATE or USING clause
* of DELETE; it deparses the join relation as if the relation never contained
* the target relation, and creates a List of conditions to be deparsed into
* the top-level WHERE clause, which is returned to *ignore_conds.
*
* 'additional_conds' is a pointer to a list of strings to be appended to
* the WHERE clause, coming from lower-level SEMI-JOINs.
*/
static void
sqlite_deparse_from_expr_for_rel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel,
bool use_alias, Index ignore_rel, List **ignore_conds,
#if PG_VERSION_NUM >= 170000
List **additional_conds,
#endif
List **params_list)
{
if (IS_JOIN_REL(foreignrel))
{
StringInfoData join_sql_o;
StringInfoData join_sql_i;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
RelOptInfo *outerrel = fpinfo->outerrel;
RelOptInfo *innerrel = fpinfo->innerrel;
bool outerrel_is_target = false;
bool innerrel_is_target = false;
#if PG_VERSION_NUM >= 170000
List *additional_conds_i = NIL;
List *additional_conds_o = NIL;
#endif
if (ignore_rel > 0 && bms_is_member(ignore_rel, foreignrel->relids))
{
/*
* If this is an inner join, add joinclauses to *ignore_conds and
* set it to empty so that those can be deparsed into the WHERE
* clause. Note that since the target relation can never be
* within the nullable side of an outer join, those could safely
* be pulled up into the WHERE clause (see foreign_join_ok()).
* Note also that since the target relation is only inner-joined
* to any other relation in the query, all conditions in the join
* tree mentioning the target relation could be deparsed into the
* WHERE clause by doing this recursively.
*/
if (fpinfo->jointype == JOIN_INNER)
{
*ignore_conds = list_concat(*ignore_conds,
fpinfo->joinclauses);
fpinfo->joinclauses = NIL;
}
/*
* Check if either of the input relations is the target relation.
*/
if (outerrel->relid == ignore_rel)
outerrel_is_target = true;
else if (innerrel->relid == ignore_rel)
innerrel_is_target = true;
}
/* Deparse outer relation if not the target relation. */
if (!outerrel_is_target)
{
initStringInfo(&join_sql_o);
sqlite_deparse_range_tbl_ref(&join_sql_o, root, outerrel,
fpinfo->make_outerrel_subquery,
ignore_rel, ignore_conds,
#if PG_VERSION_NUM >= 170000
&additional_conds_o,
#endif
params_list);
/*
* If inner relation is the target relation, skip deparsing it.
* Note that since the join of the target relation with any other
* relation in the query is an inner join and can never be within
* the nullable side of an outer join, the join could be
* interchanged with higher-level joins (cf. identity 1 on outer
* join reordering shown in src/backend/optimizer/README), which
* means it's safe to skip the target-relation deparsing here.
*/
if (innerrel_is_target)
{
Assert(fpinfo->jointype == JOIN_INNER);
Assert(fpinfo->joinclauses == NIL);
appendBinaryStringInfo(buf, join_sql_o.data, join_sql_o.len);
#if PG_VERSION_NUM >= 170000
/* Pass EXISTS conditions to upper level */
if (additional_conds_o != NIL)
{
Assert(*additional_conds == NIL);
*additional_conds = additional_conds_o;
}
#endif
return;
}
}
/* Deparse inner relation if not the target relation. */
if (!innerrel_is_target)
{
initStringInfo(&join_sql_i);
sqlite_deparse_range_tbl_ref(&join_sql_i, root, innerrel,
fpinfo->make_innerrel_subquery,
ignore_rel, ignore_conds,
#if PG_VERSION_NUM >= 170000
&additional_conds_i,
#endif
params_list);
#if PG_VERSION_NUM >= 170000
/*
* SEMI-JOIN is deparsed as the EXISTS subquery. It references
* outer and inner relations, so it should be evaluated as the
* condition in the upper-level WHERE clause. We deparse the
* condition and pass it to upper level callers as an
* additional_conds list. Upper level callers are responsible for
* inserting conditions from the list where appropriate.
*/
if (fpinfo->jointype == JOIN_SEMI)
{
deparse_expr_cxt context;
StringInfoData str;
/* Construct deparsed condition from this SEMI-JOIN */
initStringInfo(&str);
appendStringInfo(&str, "EXISTS (SELECT NULL FROM %s",
join_sql_i.data);
context.buf = &str;
context.foreignrel = foreignrel;
context.scanrel = foreignrel;
context.root = root;
context.params_list = params_list;
/*
* Append SEMI-JOIN clauses and EXISTS conditions from lower
* levels to the current EXISTS subquery
*/
sqlite_append_where_clause(fpinfo->joinclauses, additional_conds_i, &context);
/*
* EXISTS conditions, coming from lower join levels, have just
* been processed.
*/
if (additional_conds_i != NIL)
{
list_free_deep(additional_conds_i);
additional_conds_i = NIL;
}
/* Close parentheses for EXISTS subquery */
appendStringInfoChar(&str, ')');
*additional_conds = lappend(*additional_conds, str.data);
}
#endif
/*
* If outer relation is the target relation, skip deparsing it.
* See the above note about safety.
*/
if (outerrel_is_target)
{
Assert(fpinfo->jointype == JOIN_INNER);
Assert(fpinfo->joinclauses == NIL);
appendBinaryStringInfo(buf, join_sql_i.data, join_sql_i.len);
#if PG_VERSION_NUM >= 170000
/* Pass EXISTS conditions to the upper call */
if (additional_conds_i != NIL)
{
Assert(*additional_conds == NIL);
*additional_conds = additional_conds_i;
}
#endif
return;
}
}
/* Neither of the relations is the target relation. */
Assert(!outerrel_is_target && !innerrel_is_target);
#if PG_VERSION_NUM >= 170000
/*
* For semijoin FROM clause is deparsed as an outer relation. An inner
* relation and join clauses are converted to EXISTS condition and
* passed to the upper level.
*/
if (fpinfo->jointype == JOIN_SEMI)
{
appendBinaryStringInfo(buf, join_sql_o.data, join_sql_o.len);
}
else
{
#endif
/*
* For a join relation FROM clause, entry is deparsed as
*
* ((outer relation) (inner relation) ON
* (joinclauses))
*/
appendStringInfo(buf, "(%s %s JOIN %s ON ", join_sql_o.data,
sqlite_get_jointype_name(fpinfo->jointype), join_sql_i.data);
/* Append join clause; (TRUE) if no join clause */
if (fpinfo->joinclauses)
{
deparse_expr_cxt context;
context.buf = buf;
context.foreignrel = foreignrel;
context.scanrel = foreignrel;
context.root = root;
context.params_list = params_list;
appendStringInfo(buf, "(");
sqlite_append_conditions(fpinfo->joinclauses, &context);
appendStringInfo(buf, ")");
}
else
appendStringInfoString(buf, "(TRUE)");
/* End the FROM clause entry. */
appendStringInfo(buf, ")");
#if PG_VERSION_NUM >= 170000
}
/*
* Construct additional_conds to be passed to the upper caller from
* current level additional_conds and additional_conds, coming from
* inner and outer rels.
*/
if (additional_conds_o != NIL)
{
*additional_conds = list_concat(*additional_conds,
additional_conds_o);
list_free(additional_conds_o);
}
if (additional_conds_i != NIL)
{
*additional_conds = list_concat(*additional_conds,
additional_conds_i);
list_free(additional_conds_i);
}
#endif
}
else
{
RangeTblEntry *rte = planner_rt_fetch(foreignrel->relid, root);
/*
* Core code already has some lock on each rel being planned, so we
* can use NoLock here.
*/
Relation rel = table_open(rte->relid, NoLock);
sqlite_deparse_relation(buf, rel);
/*
* Add a unique alias to avoid any conflict in relation names due to
* pulled up subqueries in the query being built for a pushed down
* join.
*/
if (use_alias)
appendStringInfo(buf, " %s%d", REL_ALIAS_PREFIX, foreignrel->relid);
table_close(rel, NoLock);
}
}
/*
* Append FROM clause entry for the given relation into buf.
* Conditions from lower-level SEMI-JOINs are appended to additional_conds
* and should be added to upper level WHERE clause.
*/
static void
sqlite_deparse_range_tbl_ref(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel,
bool make_subquery, Index ignore_rel, List **ignore_conds,
#if PG_VERSION_NUM >= 170000
List **additional_conds,
#endif
List **params_list)
{
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
/* Should only be called in these cases. */
Assert(IS_SIMPLE_REL(foreignrel) || IS_JOIN_REL(foreignrel));
Assert(fpinfo->local_conds == NIL);
/* If make_subquery is true, deparse the relation as a subquery. */
if (make_subquery)
{
List *retrieved_attrs;
/*
* The given relation shouldn't contain the target relation, because
* this should only happen for input relations for a full join, and
* such relations can never contain an UPDATE/DELETE target.
*/
Assert(ignore_rel == 0 ||
!bms_is_member(ignore_rel, foreignrel->relids));
/* Deparse the subquery representing the relation. */
appendStringInfoChar(buf, '(');
sqlite_deparse_select_stmt_for_rel(buf, root, foreignrel, NIL,
fpinfo->remote_conds, NIL,
false, false, true,
&retrieved_attrs, params_list);
appendStringInfoChar(buf, ')');
/* Append the relation alias. */
appendStringInfo(buf, " %s%d", SUBQUERY_REL_ALIAS_PREFIX,
fpinfo->relation_index);
}
else
sqlite_deparse_from_expr_for_rel(buf, root, foreignrel, true, ignore_rel,
ignore_conds,
#if PG_VERSION_NUM >= 170000
additional_conds,
#endif
params_list);
}
/*
* deparse remote INSERT statement
*
* The statement text is appended to buf, and we also create an integer List
* of the columns being retrieved by RETURNING (if any), which is returned
* to *retrieved_attrs.
*/
void
sqlite_deparse_insert(StringInfo buf, PlannerInfo *root,
Index rtindex, Relation rel,
List *targetAttrs, bool doNothing,
int *values_end_len)
{
#if PG_VERSION_NUM >= 140000
TupleDesc tupdesc = RelationGetDescr(rel);
bool all_columns_generated = true;
#endif
AttrNumber pindex;
bool first;
ListCell *lc;
appendStringInfo(buf, "INSERT %sINTO ", doNothing ? "OR IGNORE " : "");
sqlite_deparse_relation(buf, rel);
#if PG_VERSION_NUM >= 140000
/*
* Check all columns in table that they are all generated column or not.
* If true, we will skip all columns and just add 'DEFAULT VALUES'. If
* not, we still push down other columns which are not generated column.
*/
if (targetAttrs)
{
foreach(lc, targetAttrs)
{
int attnum = linitial_int(targetAttrs);
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
if (!attr->attgenerated)
{
all_columns_generated = false;
break;
}
}
}
#endif
#if (PG_VERSION_NUM >= 140000)
if (targetAttrs && !all_columns_generated)
#else
if (targetAttrs)
#endif
{
appendStringInfoChar(buf, '(');
first = true;
foreach(lc, targetAttrs)
{
int attnum = lfirst_int(lc);
#if PG_VERSION_NUM >= 140000
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
if (!attr->attgenerated)
{
#endif
if (!first)
appendStringInfoString(buf, ", ");
first = false;
sqlite_deparse_column_ref(buf, rtindex, attnum, root, false, true);
#if PG_VERSION_NUM >= 140000
}
#endif
}
appendStringInfoString(buf, ") VALUES (");
pindex = 1;
first = true;
foreach(lc, targetAttrs)
{
#if PG_VERSION_NUM >= 140000
int attnum = lfirst_int(lc);
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
if (!attr->attgenerated)
{
#endif
if (!first)
appendStringInfoString(buf, ", ");
first = false;
appendStringInfo(buf, "?");
pindex++;
#if PG_VERSION_NUM >= 140000
}
#endif
}
appendStringInfoChar(buf, ')');
}
else
appendStringInfoString(buf, " DEFAULT VALUES");
*values_end_len = buf->len;
}
#if PG_VERSION_NUM >= 140000
/*
* rebuild remote INSERT statement
*
* Provided a number of rows in a batch, builds INSERT statement with the
* right number of parameters.
*/
void
sqlite_rebuild_insert(StringInfo buf, Relation rel, char *orig_query,
List *target_attrs, int values_end_len, int num_params,
int num_rows)
{
TupleDesc tupdesc = RelationGetDescr(rel);
int i;
bool first;
ListCell *lc;
/* Make sure the values_end_len is sensible */
Assert((values_end_len > 0) && (values_end_len <= strlen(orig_query)));
/* Copy up to the end of the first record from the original query */
appendBinaryStringInfo(buf, orig_query, values_end_len);
/*
* Add records to VALUES clause (we already have parameters for the first
* row, so start at the right offset).
*/
for (i = 0; i < num_rows; i++)
{
appendStringInfoString(buf, ", (");
first = true;
foreach(lc, target_attrs)
{
int attnum = lfirst_int(lc);
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
if (!attr->attgenerated)
{
if (!first)
appendStringInfoString(buf, ", ");
first = false;
appendStringInfo(buf, "?");
}
}
appendStringInfoChar(buf, ')');
}
/* Copy stuff after VALUES clause from the original query */
appendStringInfoString(buf, orig_query + values_end_len);
}
#endif
void
sqlite_deparse_analyze(StringInfo sql, char *dbname, char *relname)
{
appendStringInfo(sql, "SELECT");
appendStringInfo(sql, " round(((data_length + index_length)), 2)");
appendStringInfo(sql, " FROM information_schema.TABLES");
appendStringInfo(sql, " WHERE table_schema = '%s' AND table_name = '%s'", dbname, relname);
}
/*
* Emit a target list that retrieves the columns specified in attrs_used.
* This is used for both SELECT and RETURNING targetlists.
*/
static void
sqlite_deparse_target_list(StringInfo buf,
PlannerInfo *root,
Index rtindex,
Relation rel,
Bitmapset *attrs_used,
bool qualify_col,
List **retrieved_attrs,
bool is_concat,
bool check_null)
{
TupleDesc tupdesc = RelationGetDescr(rel);
bool have_wholerow;
bool first;
int i;
/* If there's a whole-row reference, we'll need all the columns. */
have_wholerow = bms_is_member(0 - FirstLowInvalidHeapAttributeNumber,
attrs_used);
first = true;
*retrieved_attrs = NIL;
for (i = 1; i <= tupdesc->natts; i++)
{
Form_pg_attribute attr = TupleDescAttr(tupdesc, i - 1);
/* Ignore dropped attributes. */
if (attr->attisdropped)
continue;
if (have_wholerow ||
bms_is_member(i - FirstLowInvalidHeapAttributeNumber,
attrs_used))
{
if (!first)
{
if (is_concat)
appendStringInfoString(buf, ", '') || \",\" || COALESCE(");
else if (check_null)
appendStringInfoString(buf, "OR ( ");
else
appendStringInfoString(buf, ", ");
}
else if (is_concat)
appendStringInfoString(buf, "COALESCE(");
else if (check_null)
appendStringInfoString(buf, "( ");
first = false;
sqlite_deparse_column_ref(buf, rtindex, i, root, qualify_col, false);
if (check_null)
appendStringInfoString(buf, " IS NOT NULL) ");
*retrieved_attrs = lappend_int(*retrieved_attrs, i);
}
}
/* Don't generate bad syntax if no undropped columns */
if (first)
appendStringInfoString(buf, "NULL");
else if (is_concat)
appendStringInfoString(buf, ", '')");
}
#if PG_VERSION_NUM >= 170000
/*
* Append WHERE clause, containing conditions from exprs and additional_conds,
* to context->buf.
*/
void
sqlite_append_where_clause(List *exprs, List *additional_conds, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
bool need_and = false;
ListCell *lc;
if (exprs != NIL || additional_conds != NIL)
appendStringInfoString(buf, " WHERE ");
/*
* If there are some filters, append them.
*/
if (exprs != NIL)
{
sqlite_append_conditions(exprs, context);
need_and = true;
}
/*
* If there are some EXISTS conditions, coming from SEMI-JOINS, append
* them.
*/
foreach(lc, additional_conds)
{
if (need_and)
appendStringInfoString(buf, " AND ");
appendStringInfoString(buf, (char *) lfirst(lc));
need_and = true;
}
}
#endif
#if PG_VERSION_NUM >= 140000
/*
* TRUNCATE in SQLite is supported by use DELETE FROM without WHERE condition.
*/
void
sqlite_deparse_truncate(StringInfo buf,
List *rels)
{
ListCell *cell;
Relation rel;
appendStringInfoString(buf, "PRAGMA foreign_keys = ON;");
foreach(cell, rels)
{
appendStringInfoString(buf, "DELETE FROM ");
rel = lfirst(cell);
sqlite_deparse_relation(buf, rel);
appendStringInfoChar(buf, ';');
}
}
#endif
/*
* Construct name to use for given column, and emit it into buf.
* If it has a column_name FDW option, use that instead of attribute name.
*/
static void
sqlite_deparse_column_ref(StringInfo buf, int varno, int varattno, PlannerInfo *root, bool qualify_col, bool dml_context)
{
RangeTblEntry *rte;
/* Get RangeTblEntry from array in PlannerInfo. */
rte = planner_rt_fetch(varno, root);
if (varattno == 0)
{
/* Whole row reference */
Relation rel;
Bitmapset *attrs_used;
/* Required only to be passed down to deparseTargetList(). */
List *retrieved_attrs;
/*
* The lock on the relation will be held by upper callers, so it's
* fine to open it with no lock here.
*/
rel = table_open(rte->relid, NoLock);
/*
* The local name of the foreign table can not be recognized by the
* foreign server and the table it references on foreign server might
* have different column ordering or different columns than those
* declared locally. Hence we have to deparse whole-row reference as
* ROW(columns referenced locally). Construct this by deparsing a
* "whole row" attribute.
*/
attrs_used = bms_add_member(NULL,
0 - FirstLowInvalidHeapAttributeNumber);
/*
* In case the whole-row reference is under an outer join then it has
* to go NULL whenever the rest of the row goes NULL. Deparsing a join
* query would always involve multiple relations, thus qualify_col
* would be true.
*/
appendStringInfoString(buf, "CASE WHEN ");
sqlite_deparse_target_list(buf, root, varno, rel, attrs_used, qualify_col,
&retrieved_attrs, false, true);
appendStringInfoString(buf, "THEN ");
appendStringInfoString(buf, "(\"(\" || ");
sqlite_deparse_target_list(buf, root, varno, rel, attrs_used, qualify_col,
&retrieved_attrs, true, false);
appendStringInfoString(buf, "|| \")\")");
appendStringInfoString(buf, " END");
table_close(rel, NoLock);
bms_free(attrs_used);
}
else
{
char *colname = NULL;
List *options;
ListCell *lc;
Oid pg_atttyp = InvalidOid;
bool no_unification = false;
char *coltype = NULL;
int colaff = SQLITE_NULL;
/* varno must not be any of OUTER_VAR, INNER_VAR and INDEX_VAR. */
Assert(!IS_SPECIAL_VARNO(varno));
/*
* If it's a column of a foreign table, and it has the column_name FDW
* option, use that value.
*/
options = GetForeignColumnOptions(rte->relid, varattno);
foreach(lc, options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "column_name") == 0)
{
colname = defGetString(def);
elog(DEBUG1, "column name = %s\n", colname);
break;
}
if (strcmp(def->defname, "column_type") == 0)
{
coltype = defGetString(def);
elog(DEBUG4, "column type = %s", coltype);
colaff = sqlite_affinity_code(coltype);
}
}
/*
* If it's a column of a regular table or it doesn't have column_name
* FDW option, use attribute name.
*/
if (colname == NULL)
#if (PG_VERSION_NUM >= 110000)
colname = get_attname(rte->relid, varattno, false);
#else
colname = get_attname(rte->relid, varattno);
#endif
pg_atttyp = get_atttype(rte->relid, varattno);
/*
* PostgreSQL data types with possible mixed affinity SQLite base we should
* normalize to preferred form in SQLite before transfer to PostgreSQL.
* Recommended form for normalisation is someone from 1<->1 with PostgreSQL
* internal storage, hence usually this will not original text data.
*/
if (!dml_context)
{
switch (pg_atttyp)
{
/* some polular usual data types without normalization first */
case INT4OID:
case TEXTOID:
case VARCHAROID:
case BYTEAOID:
case INT8OID:
case BPCHAROID:
case INT2OID:
case TIMEOID:
case TIMESTAMPOID:
case TIMESTAMPTZOID:
case DATEOID:
case NAMEOID:
case VARBITOID:
case BITOID:
case CHAROID:
{
no_unification = true;
break;
}
case FLOAT8OID:
case FLOAT4OID:
case NUMERICOID:
{
elog(DEBUG2, "floatN unification for \"%s\"", colname);
appendStringInfoString(buf, "sqlite_fdw_float(");
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
appendStringInfoString(buf, ")");
break;
}
case BOOLOID:
{
elog(DEBUG2, "boolean unification for \"%s\"", colname);
appendStringInfoString(buf, "sqlite_fdw_bool(");
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
appendStringInfoString(buf, ")");
break;
}
case UUIDOID:
{
elog(DEBUG2, "UUID unification for \"%s\"", colname);
appendStringInfoString(buf, "sqlite_fdw_uuid_blob(");
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
appendStringInfoString(buf, ")");
break;
}
case MACADDROID:
case MACADDR8OID:
{
int mac_len = (pg_atttyp == MACADDROID) ? MACADDR_LEN : MACADDR8_LEN;
elog(DEBUG2, "MAC%d address unification for \"%s\"", mac_len, colname);
appendStringInfoString(buf, "sqlite_fdw_macaddr_int(");
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
appendStringInfo(buf, ", %d)", mac_len);
break;
}
case JSONOID:
{
if (colaff != SQLITE_TEXT)
{
elog(DEBUG2, "json unification for \"%s\"", colname);
appendStringInfoString(buf, "json(");
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
appendStringInfoString(buf, ")");
}
else
{
elog(DEBUG2, "json text affinity only for \"%s\"", colname);
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
}
break;
}
case JSONBOID: /* jsonb in SQLite is no the same as in PosrtgreSQL, use text transport */
{
elog(DEBUG2, "sqlite_fdw : json unification for \"%s\"", colname);
appendStringInfoString(buf, "json(");
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
appendStringInfoString(buf, ")");
break;
}
default:
{
no_unification = true;
#ifndef SQLITE_FDW_GIS_ENABLE
if (listed_datatype_oid(pg_atttyp, -1, postGisSQLiteCompatibleTypes))
{
int32 typmod = -1;
Oid typid = getBaseTypeAndTypmod(pg_atttyp, &typmod);
char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(pg_atttyp, -1));
if (typid != BYTEAOID)
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("This PostGIS data type is supported by SpatiaLite, but FDW compiled without GIS data support"),
errhint("Data type: \"%s\"", pg_dataTypeName)));
}
/* else no unification for normal column */
}
else
#endif
if (listed_datatype_oid(pg_atttyp, -1, postGisSpecificTypes))
{
char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(pg_atttyp, -1));
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("PostGIS specific value is not deparsable because of no similar SpatiaLite conception"),
errhint("Data type: \"%s\"", pg_dataTypeName)));
}
}
}
}
else
no_unification = true;
if (no_unification)
{
elog(DEBUG3, "sqlite_fdw : %s, varattrno != 0, not unificated column \"%s\"", __func__, colname);
if (qualify_col)
ADD_REL_QUALIFIER(buf, varno);
appendStringInfoString(buf, sqlite_quote_identifier(colname, '`'));
}
}
}
/*
* Get column option with optionname for a variable attribute in deparsing context
*/
static char *
sqlite_deparse_column_option(int varno, int varattno, PlannerInfo *root, char *optionname)
{
RangeTblEntry *rte;
char *coloptionvalue = NULL;
List *options;
ListCell *lc;
/* varno must not be any of OUTER_VAR, INNER_VAR and INDEX_VAR. */
Assert(!IS_SPECIAL_VARNO(varno));
/* Get RangeTblEntry from array in PlannerInfo. */
rte = planner_rt_fetch(varno, root);
/*
* If it's a column of a foreign table, and it has the optionname value named FDW
* option, use that value.
*/
options = GetForeignColumnOptions(rte->relid, varattno);
foreach(lc, options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, optionname) == 0)
{
coloptionvalue = defGetString(def);
break;
}
}
return coloptionvalue;
}
/*
* Convert a text value from PostgreSQL database with an encoding to SQLite value which is always UTF8
*/
static const char *
pg_text_value_to_sqlite_text(const char * pg_text_value)
{
int pg_database_encoding = GetDatabaseEncoding(); /* very fast call, see PostgreSQL mbutils.c */
return (pg_database_encoding == PG_UTF8) ? pg_text_value : (char *) pg_do_encoding_conversion((unsigned char *) pg_text_value, strlen(pg_text_value), pg_database_encoding, PG_UTF8);
}
/*
* Append a SQL string literal representing "val" to buf.
*/
void
sqlite_deparse_string_literal(StringInfo buf, const char *val)
{
const char *sqlite_text_val;
const char *valptr;
sqlite_text_val = pg_text_value_to_sqlite_text(val);
appendStringInfoChar(buf, '\'');
for (valptr = sqlite_text_val; *valptr; valptr++)
{
char ch = *valptr;
if (SQL_STR_DOUBLE(ch, true))
appendStringInfoChar(buf, ch);
appendStringInfoChar(buf, ch);
}
appendStringInfoChar(buf, '\'');
}
/*
* Deparse given expression into context->buf.
*
* This function must support all the same node types that sqlite_foreign_expr_walker
* accepts.
*
* Note: unlike ruleutils.c, we just use a simple hard-wired parenthesization
* scheme: anything more complex than a Var, Const, function call or cast
* should be self-parenthesized.
*/
static void
sqlite_deparse_expr(Expr *node, deparse_expr_cxt *context)
{
if (node == NULL)
return;
switch (nodeTag(node))
{
case T_Var:
sqlite_deparse_var((Var *) node, context);
break;
case T_Const:
sqlite_deparse_const((Const *) node, context, 0);
break;
case T_Param:
sqlite_deparse_param((Param *) node, context);
break;
case T_FuncExpr:
sqlite_deparse_func_expr((FuncExpr *) node, context);
break;
case T_OpExpr:
sqlite_deparse_op_expr((OpExpr *) node, context);
break;
case T_ScalarArrayOpExpr:
sqlite_deparse_scalar_array_op_expr((ScalarArrayOpExpr *) node, context);
break;
case T_RelabelType:
sqlite_deparse_relabel_type((RelabelType *) node, context);
break;
case T_BoolExpr:
sqlite_deparse_bool_expr((BoolExpr *) node, context);
break;
case T_NullTest:
sqlite_deparse_null_test((NullTest *) node, context);
break;
case T_ArrayExpr:
sqlite_deparse_array_expr((ArrayExpr *) node, context);
break;
case T_CaseExpr:
sqlite_deparse_case_expr((CaseExpr *) node, context);
break;
case T_CoalesceExpr:
sqlite_deparse_coalesce_expr((CoalesceExpr *) node, context);
break;
case T_NullIfExpr:
sqlite_deparse_null_if_expr((NullIfExpr *) node, context);
break;
case T_Aggref:
sqlite_deparse_aggref((Aggref *) node, context);
break;
default:
elog(ERROR, "unsupported expression type for deparse: %d",
(int) nodeTag(node));
break;
}
}
/*
* deparse remote UPDATE statement
*
* The statement text is appended to buf, and we also create an integer List
* of the columns being retrieved by RETURNING (if any), which is returned
* to *retrieved_attrs.
*/
void
sqlite_deparse_update(StringInfo buf, PlannerInfo *root,
Index rtindex, Relation rel,
List *targetAttrs, List *attnums)
{
#if PG_VERSION_NUM >= 140000
TupleDesc tupdesc = RelationGetDescr(rel);
#endif
AttrNumber pindex;
bool first;
ListCell *lc;
int i;
appendStringInfoString(buf, "UPDATE ");
sqlite_deparse_relation(buf, rel);
appendStringInfoString(buf, " SET ");
pindex = 2;
first = true;
foreach(lc, targetAttrs)
{
int attnum = lfirst_int(lc);
#if PG_VERSION_NUM >= 140000
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
if (!attr->attgenerated)
{
#endif
if (!first)
appendStringInfoString(buf, ", ");
first = false;
sqlite_deparse_column_ref(buf, rtindex, attnum, root, false, true);
appendStringInfo(buf, " = ?");
pindex++;
#if PG_VERSION_NUM >= 140000
}
#endif
}
i = 0;
foreach(lc, attnums)
{
int attnum = lfirst_int(lc);
appendStringInfo(buf, i == 0 ? " WHERE " : " AND ");
sqlite_deparse_column_ref(buf, rtindex, attnum, root, false, true);
appendStringInfo(buf, "=?");
i++;
}
}
/*
* Preferred SQLite affinity from "column_type" foreign column option
* SQLITE_NULL if no value or no normal value
*/
int
preferred_sqlite_affinity (Oid relid, int varattno)
{
char *coltype = NULL;
List *options;
ListCell *lc;
elog(DEBUG4, "sqlite_fdw : %s ", __func__);
if (varattno == 0)
return SQLITE_NULL;
options = GetForeignColumnOptions(relid, varattno);
foreach(lc, options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "column_type") == 0)
{
coltype = defGetString(def);
elog(DEBUG4, "column type = %s", coltype);
break;
}
}
return sqlite_affinity_code(coltype);
}
/*
* deparse remote UPDATE statement
*
* 'buf' is the output buffer to append the statement to 'rtindex' is the RT
* index of the associated target relation 'rel' is the relation descriptor
* for the target relation 'foreignrel' is the RelOptInfo for the target
* relation or the join relation containing all base relations in the query
* 'targetlist' is the tlist of the underlying foreign-scan plan node
* 'targetAttrs' is the target columns of the UPDATE 'remote_conds' is the
* qual clauses that must be evaluated remotely '*params_list' is an output
* list of exprs that will become remote Params '*retrieved_attrs' is an
* output list of integers of columns being retrieved by RETURNING (if any)
*/
void
sqlite_deparse_direct_update_sql(StringInfo buf, PlannerInfo *root,
Index rtindex, Relation rel,
RelOptInfo *foreignrel,
List *targetlist,
List *targetAttrs,
List *remote_conds,
List **params_list,
List **retrieved_attrs)
{
deparse_expr_cxt context;
int nestlevel;
bool first;
ListCell *lc;
ListCell *lc2;
#if PG_VERSION_NUM >= 170000
List *additional_conds = NIL;
#endif
elog(DEBUG3, "sqlite_fdw : %s\n", __func__);
/* Set up context struct for recursion */
context.root = root;
context.foreignrel = foreignrel;
context.scanrel = foreignrel;
context.buf = buf;
context.params_list = params_list;
appendStringInfoString(buf, "UPDATE ");
sqlite_deparse_relation(buf, rel);
if (IS_JOIN_REL(foreignrel))
appendStringInfo(buf, " %s%d", REL_ALIAS_PREFIX, rtindex);
appendStringInfoString(buf, " SET ");
/* Make sure any constants in the exprs are printed portably */
nestlevel = sqlite_set_transmission_modes();
first = true;
forboth(lc, targetlist, lc2, targetAttrs)
{
int attnum = lfirst_int(lc2);
int preferred_affinity = SQLITE_NULL;
TargetEntry *tle;
RangeTblEntry *rte;
bool special_affinity = false;
Oid pg_attyp;
#if (PG_VERSION_NUM >= 140000)
tle = lfirst_node(TargetEntry, lc);
/* update's new-value expressions shouldn't be resjunk */
Assert(!tle->resjunk);
#else
(void) lc;
tle = get_tle_by_resno(targetlist, attnum);
#endif
if (!tle)
elog(ERROR, "attribute number %d not found in UPDATE targetlist",
attnum);
if (!first)
appendStringInfoString(buf, ", ");
first = false;
sqlite_deparse_column_ref(buf, rtindex, attnum, root, false, true);
/* Get RangeTblEntry from array in PlannerInfo. */
rte = planner_rt_fetch(rtindex, root);
pg_attyp = get_atttype(rte->relid, attnum);
preferred_affinity = preferred_sqlite_affinity(rte->relid, attnum);
appendStringInfoString(buf, " = ");
if (pg_attyp == UUIDOID && preferred_affinity == SQLITE3_TEXT)
{
appendStringInfo(buf, "sqlite_fdw_uuid_str(");
special_affinity = true;
}
else if ((pg_attyp == MACADDROID || pg_attyp == MACADDR8OID) && preferred_affinity != SQLITE_INTEGER)
{
if (preferred_affinity == SQLITE3_TEXT)
appendStringInfo(buf, "sqlite_fdw_macaddr_str(");
else if (preferred_affinity == SQLITE_BLOB)
appendStringInfo(buf, "sqlite_fdw_macaddr_blob(");
special_affinity = true;
}
sqlite_deparse_expr((Expr *) tle->expr, &context);
if (preferred_affinity == SQLITE3_TEXT || preferred_affinity == SQLITE_BLOB)
{
if (pg_attyp == MACADDROID)
appendStringInfo(buf, ", %d", MACADDR_LEN);
else if (pg_attyp == MACADDR8OID)
appendStringInfo(buf, ", %d", MACADDR8_LEN);
}
if (special_affinity)
{
elog(DEBUG4, "sqlite_fdw : aff %d\n", preferred_affinity);
appendStringInfoString(buf, ")");
}
}
sqlite_reset_transmission_modes(nestlevel);
if (IS_JOIN_REL(foreignrel))
{
List *ignore_conds = NIL;
appendStringInfo(buf, " FROM ");
sqlite_deparse_from_expr_for_rel(buf, root, foreignrel, true, rtindex,
&ignore_conds,
#if PG_VERSION_NUM >= 170000
&additional_conds,
#endif
params_list);
remote_conds = list_concat(remote_conds, ignore_conds);
}
#if PG_VERSION_NUM >= 170000
sqlite_append_where_clause(remote_conds, additional_conds, &context);
if (additional_conds != NIL)
list_free_deep(additional_conds);
#else
if (remote_conds)
{
appendStringInfoString(buf, " WHERE ");
sqlite_append_conditions(remote_conds, &context);
}
#endif
}
/*
* deparse remote DELETE statement
*
* The statement text is appended to buf, and we also create an integer List
* of the columns being retrieved by RETURNING (if any), which is returned
* to *retrieved_attrs.
*/
void
sqlite_deparse_delete(StringInfo buf, PlannerInfo *root,
Index rtindex, Relation rel,
List *attname)
{
int i = 0;
ListCell *lc;
appendStringInfoString(buf, "DELETE FROM ");
sqlite_deparse_relation(buf, rel);
foreach(lc, attname)
{
int attnum = lfirst_int(lc);
appendStringInfo(buf, i == 0 ? " WHERE " : " AND ");
sqlite_deparse_column_ref(buf, rtindex, attnum, root, false, true);
appendStringInfo(buf, "=?");
i++;
}
}
/*
* deparse remote DELETE statement
*
* 'buf' is the output buffer to append the statement to 'rtindex' is the RT
* index of the associated target relation 'rel' is the relation descriptor
* for the target relation 'foreignrel' is the RelOptInfo for the target
* relation or the join relation containing all base relations in the query
* 'remote_conds' is the qual clauses that must be evaluated remotely
* '*params_list' is an output list of exprs that will become remote Params
* '*retrieved_attrs' is an output list of integers of columns being
* retrieved by RETURNING (if any)
*/
void
sqlite_deparse_direct_delete_sql(StringInfo buf, PlannerInfo *root,
Index rtindex, Relation rel,
RelOptInfo *foreignrel,
List *remote_conds,
List **params_list,
List **retrieved_attrs)
{
deparse_expr_cxt context;
#if PG_VERSION_NUM >= 170000
List *additional_conds = NIL;
#endif
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/* Set up context struct for recursion */
context.root = root;
context.foreignrel = foreignrel;
context.scanrel = foreignrel;
context.buf = buf;
context.params_list = params_list;
appendStringInfoString(buf, "DELETE FROM ");
sqlite_deparse_relation(buf, rel);
if (IS_JOIN_REL(foreignrel))
appendStringInfo(buf, " %s%d", REL_ALIAS_PREFIX, rtindex);
if (IS_JOIN_REL(foreignrel))
{
List *ignore_conds = NIL;
appendStringInfo(buf, " USING ");
sqlite_deparse_from_expr_for_rel(buf, root, foreignrel, true, rtindex,
&ignore_conds,
#if PG_VERSION_NUM >= 170000
&additional_conds,
#endif
params_list);
remote_conds = list_concat(remote_conds, ignore_conds);
}
#if PG_VERSION_NUM >= 170000
sqlite_append_where_clause(remote_conds, additional_conds, &context);
if (additional_conds != NIL)
list_free_deep(additional_conds);
#else
if (remote_conds)
{
appendStringInfoString(buf, " WHERE ");
sqlite_append_conditions(remote_conds, &context);
}
#endif
}
/*
* Deparse given Var node into context->buf.
*
* If the Var belongs to the foreign relation, just print its remote name.
* Otherwise, it's effectively a Param (and will in fact be a Param at
* run time). Handle it the same way we handle plain Params --- see
* deparseParam for comments.
*/
static void
sqlite_deparse_var(Var *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
Relids relids = context->scanrel->relids;
int relno;
int colno;
/* Qualify columns when multiple relations are involved. */
bool qualify_col = (bms_membership(relids) == BMS_MULTIPLE);
/*
* If the Var belongs to the foreign relation that is deparsed as a
* subquery, use the relation and column alias to the Var provided by the
* subquery, instead of the remote name.
*/
if (sqlite_is_subquery_var(node, context->scanrel, &relno, &colno))
{
appendStringInfo(context->buf, "%s%d.%s%d",
SUBQUERY_REL_ALIAS_PREFIX, relno,
SUBQUERY_COL_ALIAS_PREFIX, colno);
return;
}
if (bms_is_member(node->varno, relids) && node->varlevelsup == 0)
{
/* Var belongs to foreign table */
sqlite_deparse_column_ref(buf, node->varno, node->varattno, context->root, qualify_col, false);
}
else
{
/* Treat like a Param */
if (context->params_list)
{
int pindex = 0;
ListCell *lc;
/* find its index in params_list */
foreach(lc, *context->params_list)
{
pindex++;
if (equal(node, (Node *) lfirst(lc)))
break;
}
if (lc == NULL)
{
/* not in list, so add it */
pindex++;
*context->params_list = lappend(*context->params_list, node);
}
sqlite_print_remote_param(pindex, node->vartype, node->vartypmod, context);
}
else
{
sqlite_print_remote_placeholder(node->vartype, node->vartypmod, context);
}
}
}
/*
* With this function, we try to obtain complementary node for operation to be able
* to obtain column name and column type to whom const value its compared to.
* If we obtain type, we know if we need to use datetime convert expressions
* or not depending if sqlite column is TEXT or INT */
static Var *
get_complementary_var_node(Expr *node)
{
if (node == NULL)
return NULL;
switch (nodeTag(node))
{
/* Only supported case by now is T_Var complementary node */
case T_Var:
return (Var *) node;
break;
default:
return NULL;
}
}
/*
* Deparse given constant value into context->buf.
*
* This function has to be kept in sync with ruleutils.c's get_const_expr.
* As for that function, showtype can be -1 to never show "::typename" decoration,
* or +1 to always show it, or 0 to show it only if the constant wouldn't be assumed
* to be the right type by default.
*/
static void
sqlite_deparse_const(Const *node, deparse_expr_cxt *context, int showtype)
{
StringInfo buf = context->buf;
Oid typoutput;
bool typIsVarlena;
char *extval;
char *sqlitecolumntype;
bool convert_timestamp_tounixepoch;
Var *varnode;
if (node->constisnull)
{
appendStringInfoString(buf, "NULL");
return;
}
getTypeOutputInfo(node->consttype,
&typoutput, &typIsVarlena);
switch (node->consttype)
{
/* popular first */
case VARCHAROID:
case CHAROID:
case TEXTOID:
case DATEOID:
case TIMEOID:
case NAMEOID:
case BPCHAROID:
{
/* common branch of constants, deparsable as a text data */
extval = OidOutputFunctionCall(typoutput, node->constvalue);
sqlite_deparse_string_literal(buf, extval);
break;
}
case INT2OID:
case INT4OID:
case INT8OID:
case OIDOID:
{
extval = OidOutputFunctionCall(typoutput, node->constvalue);
if (strspn(extval, "0123456789+-eE.") == strlen(extval))
{
if (extval[0] == '+' || extval[0] == '-')
appendStringInfo(buf, "(%s)", extval);
else
appendStringInfoString(buf, extval);
}
else
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("Invalid input syntax. Invalid characters in number"),
errhint("Value: %s", extval)));
}
break;
case FLOAT4OID:
case FLOAT8OID:
case NUMERICOID:
{
extval = OidOutputFunctionCall(typoutput, node->constvalue);
/*
* No need to quote unless it's a special value such as 'NaN' or 'Infinity'.
* See comments in get_const_expr().
*/
if (strspn(extval, "0123456789+-eE.") == strlen(extval))
{
if (extval[0] == '+' || extval[0] == '-')
appendStringInfo(buf, "(%s)", extval);
else
appendStringInfoString(buf, extval);
}
else if (strcasecmp(extval, infs) == 0 ||
strcasecmp(extval, infl) == 0 ||
strcasecmp(extval + 1, infs) == 0 ||
strcasecmp(extval + 1, infl) == 0)
{
bool is_negative_or_positive = false;
if (extval[0] == '-' || extval[0] == '+')
is_negative_or_positive = true;
if (is_negative_or_positive)
appendStringInfo(buf, "(%c", extval[0]);
appendStringInfo(buf, "9e999");
if (is_negative_or_positive)
appendStringInfo(buf, ")");
}
else
{
/* NaN and other */
appendStringInfo(buf, "\'%s\'", extval);
}
}
break;
case BITOID:
case VARBITOID:
{
extval = OidOutputFunctionCall(typoutput, node->constvalue);
if (strlen(extval) > SQLITE_FDW_BIT_DATATYPE_BUF_SIZE - 1 )
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("SQLite FDW doesn't support very long bit/varbit data"),
errhint("bit length %ld, maximum %ld", strlen(extval), SQLITE_FDW_BIT_DATATYPE_BUF_SIZE - 1)));
}
appendStringInfo(buf, "%lld", binstr2int64(extval));
}
break;
case BOOLOID:
{
extval = OidOutputFunctionCall(typoutput, node->constvalue);
if (strcmp(extval, "t") == 0)
appendStringInfoString(buf, "1");
else
appendStringInfoString(buf, "0");
}
break;
case BYTEAOID:
/*
* the string for BYTEA always seems to be in the format "\\x##"
* where # is a hex digit, Even if the value passed in is
* 'hi'::bytea we will receive "\x6869". Making this assumption
* allows us to quickly convert Postgres escaped strings to SQLite
* ones for comparison
*/
extval = OidOutputFunctionCall(typoutput, node->constvalue);
appendStringInfo(buf, "X\'%s\'", extval + 2);
break;
case TIMESTAMPOID:
{
convert_timestamp_tounixepoch = false;
extval = OidOutputFunctionCall(typoutput, node->constvalue);
if (context->complementarynode != NULL)
{
varnode = get_complementary_var_node(context->complementarynode);
if (varnode != NULL)
{
sqlitecolumntype = sqlite_deparse_column_option(varnode->varno, varnode->varattno, context->root, "column_type");
if (sqlitecolumntype != NULL && strcasecmp(sqlitecolumntype, "INT") == 0)
convert_timestamp_tounixepoch = true;
}
}
if (convert_timestamp_tounixepoch)
appendStringInfo(buf, "strftime('%%s', '%s')", extval);
else
sqlite_deparse_string_literal(buf, extval);
}
break;
case UUIDOID:
/*
* always deparse to BLOB, in case of UPDATE with text affinity
* transformation function will be added
*/
{
int i = 0;
extval = OidOutputFunctionCall(typoutput, node->constvalue);
appendStringInfo(buf, "X\'");
for (i = 0; i < strlen(extval); i++)
{
char c = extval[i];
if ( c != '-')
appendStringInfoChar(buf, c);
}
appendStringInfo(buf, "\'");
}
break;
case MACADDROID:
case MACADDR8OID:
{
int i = 0;
extval = OidOutputFunctionCall(typoutput, node->constvalue);
appendStringInfo(buf, "0x");
for (i = 0; i < strlen(extval); i++)
{
char c = extval[i];
if ( c != '-' && c != '.' && c != ':')
appendStringInfoChar(buf, c);
}
}
break;
case JSONBOID:
{
extval = OidOutputFunctionCall(typoutput, node->constvalue);
appendStringInfo(buf, "jsonb(");
sqlite_deparse_string_literal(buf, extval);
appendStringInfo(buf, ")");
}
break;
case JSONOID:
{
extval = OidOutputFunctionCall(typoutput, node->constvalue);
appendStringInfo(buf, "json(");
sqlite_deparse_string_literal(buf, extval);
appendStringInfo(buf, ")");
}
break;
default:
{
if (listed_datatype_oid(node->consttype, -1, postGisSQLiteCompatibleTypes))
{
/* common branch of PostGIS constants, deparsable as a text data */
elog(DEBUG2, "sqlite_fdw : %s deparse PostGIS constant", __func__);
extval = OidOutputFunctionCall(typoutput, node->constvalue);
#ifdef SQLITE_FDW_GIS_ENABLE
sqlite_deparse_PostGIS_value(buf, extval);
#else
sqlite_deparse_string_literal(buf, extval);
#endif
}
else
{
const char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(node->consttype, -1));
extval = OidOutputFunctionCall(typoutput, node->constvalue);
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("Unknown data type of a constant"),
errhint("Data type: \"%s\" ", pg_dataTypeName),
errcontext("Value: %s", extval)));
}
}
}
}
/*
* Deparse given Param node.
*
* If we're generating the query "for real", add the Param to
* context->params_list if it's not already present, and then use its index
* in that list as the remote parameter number. During EXPLAIN, there's
* no need to identify a parameter number.
*/
static void
sqlite_deparse_param(Param *node, deparse_expr_cxt *context)
{
if (context->params_list)
{
int pindex = 0;
ListCell *lc;
/* find its index in params_list */
foreach(lc, *context->params_list)
{
pindex++;
if (equal(node, (Node *) lfirst(lc)))
break;
}
if (lc == NULL)
{
/* not in list, so add it */
pindex++;
*context->params_list = lappend(*context->params_list, node);
}
sqlite_print_remote_param(pindex, node->paramtype, node->paramtypmod, context);
}
else
{
sqlite_print_remote_placeholder(node->paramtype, node->paramtypmod, context);
}
}
/*
* This possible that name of function in PostgreSQL and
* sqlite differ, so return the sqlite equelent function name
*/
static char *
sqlite_replace_function(char *in)
{
if (strcmp(in, "btrim") == 0)
{
return "trim";
}
return in;
}
/*
* Deparse a function call.
*/
static void
sqlite_deparse_func_expr(FuncExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
HeapTuple proctup;
Form_pg_proc procform;
const char *proname;
bool first;
ListCell *arg;
/*
* If the function call came from an implicit coercion, then just show the
* first argument.
*/
if (node->funcformat == COERCE_IMPLICIT_CAST)
{
sqlite_deparse_expr((Expr *) linitial(node->args), context);
return;
}
/*
* Normal function: display as proname(args).
*/
proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(node->funcid));
if (!HeapTupleIsValid(proctup))
elog(ERROR, "cache lookup failed for function %u", node->funcid);
procform = (Form_pg_proc) GETSTRUCT(proctup);
/* Translate PostgreSQL function into sqlite function */
proname = sqlite_replace_function(NameStr(procform->proname));
/* Deparse the function name ... */
appendStringInfo(buf, "%s(", proname);
/* ... and all the arguments */
first = true;
foreach(arg, node->args)
{
if (!first)
appendStringInfoString(buf, ", ");
sqlite_deparse_expr((Expr *) lfirst(arg), context);
first = false;
}
appendStringInfoChar(buf, ')');
ReleaseSysCache(proctup);
}
/*
* Deparse given operator expression. To avoid problems around
* priority of operations, we always parenthesize the arguments.
*/
static void
sqlite_deparse_op_expr(OpExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
HeapTuple tuple;
Form_pg_operator form;
char oprkind;
/* Retrieve information about the operator from system catalog. */
tuple = SearchSysCache1(OPEROID, ObjectIdGetDatum(node->opno));
if (!HeapTupleIsValid(tuple))
elog(ERROR, "cache lookup failed for operator %u", node->opno);
form = (Form_pg_operator) GETSTRUCT(tuple);
oprkind = form->oprkind;
/* Sanity check. */
Assert((oprkind == 'l' && list_length(node->args) == 1) ||
(oprkind == 'b' && list_length(node->args) == 2));
/* Always parenthesize the expression. */
appendStringInfoChar(buf, '(');
/* Deparse left operand. */
if (oprkind == 'b')
{
context->complementarynode = llast(node->args);
sqlite_deparse_expr(linitial(node->args), context);
appendStringInfoChar(buf, ' ');
}
/* Deparse operator name. */
sqlite_deparse_operator_name(buf, form);
/* Deparse right operand. */
appendStringInfoChar(buf, ' ');
if (oprkind == 'b')
context->complementarynode = linitial(node->args);
sqlite_deparse_expr(llast(node->args), context);
appendStringInfoChar(buf, ')');
ReleaseSysCache(tuple);
}
/*
* Gets SQLite SQL operand or other value for an operator.
*/
static void
sqlite_deparse_operator_name(StringInfo buf, Form_pg_operator opform)
{
char *cur_opname = NULL;
/* opname is not a SQL identifier, so we should not quote it. */
cur_opname = NameStr(opform->oprname);
/*
* Non built-in operators, for example PostGIS
* This operators doesn't belong to pg_catalog
*/
if (opform->oprnamespace != PG_CATALOG_NAMESPACE)
{
/* Don't use fully qualified operator name for SQLite, only name. */
appendStringInfoString(buf, cur_opname);
}
else
{
if (strcmp(cur_opname, "~~") == 0)
{
appendStringInfoString(buf, "LIKE");
}
else if (strcmp(cur_opname, "!~~") == 0)
{
appendStringInfoString(buf, "NOT LIKE");
}
else if (strcmp(cur_opname, "~~*") == 0 ||
strcmp(cur_opname, "!~~*") == 0 ||
/* ~ operator is both one of text RegEx operators and bit string NOT */
(strcmp(cur_opname, "~") == 0 && opform->oprresult != VARBITOID && opform->oprresult != BITOID) ||
strcmp(cur_opname, "!~") == 0 ||
strcmp(cur_opname, "~*") == 0 ||
strcmp(cur_opname, "!~*") == 0)
{
ereport(ERROR, (errcode(ERRCODE_FDW_ERROR),
errmsg("SQL operator is not supported"),
errhint("operator name: %s", cur_opname)));
}
else
{
appendStringInfoString(buf, cur_opname);
}
}
}
/*
* Deparse given ScalarArrayOpExpr expression. To avoid problems
* around priority of operations, we always parenthesize the arguments.
*/
static void
sqlite_deparse_scalar_array_op_expr(ScalarArrayOpExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
HeapTuple tuple;
Expr *arg1;
Expr *arg2;
Form_pg_operator form;
char *opname = NULL;
Oid typoutput;
bool typIsVarlena;
char *extval;
bool useIn = false;
/* Retrieve information about the operator from system catalog. */
tuple = SearchSysCache1(OPEROID, ObjectIdGetDatum(node->opno));
if (!HeapTupleIsValid(tuple))
elog(ERROR, "cache lookup failed for operator %u", node->opno);
form = (Form_pg_operator) GETSTRUCT(tuple);
/* Sanity check. */
Assert(list_length(node->args) == 2);
opname = pstrdup(NameStr(form->oprname));
ReleaseSysCache(tuple);
/* Using IN clause for '= ANY' and NOT IN clause for '<> ALL' */
if ((strcmp(opname, "=") == 0 && node->useOr == true) ||
(strcmp(opname, "<>") == 0 && node->useOr == false))
useIn = true;
/* Get left and right argument for deparsing */
arg1 = linitial(node->args);
arg2 = lsecond(node->args);
if (useIn)
{
/* Deparse left operand. */
sqlite_deparse_expr(arg1, context);
appendStringInfoChar(buf, ' ');
/* Add IN clause */
if (strcmp(opname, "<>") == 0)
{
appendStringInfoString(buf, "NOT IN (");
}
else if (strcmp(opname, "=") == 0)
{
appendStringInfoString(buf, "IN (");
}
}
switch (nodeTag((Node *) arg2))
{
case T_Const:
{
Const *c = (Const *) arg2;
bool isstr = false;
const char *valptr;
int i = -1;
bool deparseLeft = true;
if (!c->constisnull)
{
getTypeOutputInfo(c->consttype,
&typoutput, &typIsVarlena);
extval = OidOutputFunctionCall(typoutput, c->constvalue);
/* Determine array type */
switch (c->consttype)
{
case INT4ARRAYOID:
case INT8ARRAYOID:
case INT2ARRAYOID:
case BOOLARRAYOID:
case OIDARRAYOID:
case NUMERICARRAYOID:
case FLOAT4ARRAYOID:
case FLOAT8ARRAYOID:
isstr = false;
break;
default:
isstr = true;
break;
}
for (valptr = extval; *valptr; valptr++)
{
char ch = *valptr;
i++;
if (useIn)
{
if (i == 0 && isstr)
appendStringInfoChar(buf, '\'');
}
else if (deparseLeft)
{
/* Deparse left operand. */
sqlite_deparse_expr(arg1, context);
/* Append operator */
appendStringInfo(buf, " %s ", opname);
if (isstr)
appendStringInfoChar(buf, '\'');
deparseLeft = false;
}
/*
* Remove '{', '}' and \" character from the string.
* Because this syntax is not recognize by the remote
* Sqlite server.
*/
if ((ch == '{' && i == 0) || (ch == '}' && (i == (strlen(extval) - 1))) || ch == '\"')
continue;
if (ch == ',')
{
if (useIn)
{
if (isstr)
appendStringInfoChar(buf, '\'');
appendStringInfoChar(buf, ch);
appendStringInfoChar(buf, ' ');
if (isstr)
appendStringInfoChar(buf, '\'');
}
else
{
if (isstr)
appendStringInfoChar(buf, '\'');
if (node->useOr)
appendStringInfoString(buf, " OR ");
else
appendStringInfoString(buf, " AND ");
deparseLeft = true;
}
continue;
}
if (SQL_STR_DOUBLE(ch, true))
appendStringInfoChar(buf, ch);
appendStringInfoChar(buf, ch);
}
if (isstr)
appendStringInfoChar(buf, '\'');
}
else
{
appendStringInfoString(buf, " NULL");
return;
}
}
break;
case T_ArrayExpr:
{
bool first = true;
ListCell *lc;
foreach(lc, ((ArrayExpr *) arg2)->elements)
{
if (!first)
{
if (useIn)
{
appendStringInfoString(buf, ", ");
}
else
{
if (node->useOr)
appendStringInfoString(buf, " OR ");
else
appendStringInfoString(buf, " AND ");
}
}
if (useIn)
{
sqlite_deparse_expr(lfirst(lc), context);
}
else
{
/* Deparse left argument */
appendStringInfoChar(buf, '(');
sqlite_deparse_expr(arg1, context);
appendStringInfo(buf, " %s ", opname);
/* Deparse each element in right argument */
sqlite_deparse_expr(lfirst(lc), context);
appendStringInfoChar(buf, ')');
}
first = false;
}
break;
}
default:
elog(ERROR, "unsupported expression type for deparse: %d", (int) nodeTag(node));
break;
}
/* Close IN clause */
if (useIn)
appendStringInfoChar(buf, ')');
}
/*
* Deparse a RelabelType (binary-compatible cast) node.
*/
static void
sqlite_deparse_relabel_type(RelabelType *node, deparse_expr_cxt *context)
{
sqlite_deparse_expr(node->arg, context);
}
/*
* Deparse a BoolExpr node.
*
* Note: by the time we get here, AND and OR expressions have been flattened
* into N-argument form, so we'd better be prepared to deal with that.
*/
static void
sqlite_deparse_bool_expr(BoolExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
const char *op = NULL; /* keep compiler quiet */
bool first;
ListCell *lc;
switch (node->boolop)
{
case AND_EXPR:
op = "AND";
break;
case OR_EXPR:
op = "OR";
break;
case NOT_EXPR:
appendStringInfoString(buf, "(NOT ");
sqlite_deparse_expr(linitial(node->args), context);
appendStringInfoChar(buf, ')');
return;
}
appendStringInfoChar(buf, '(');
first = true;
foreach(lc, node->args)
{
if (!first)
appendStringInfo(buf, " %s ", op);
sqlite_deparse_expr((Expr *) lfirst(lc), context);
first = false;
}
appendStringInfoChar(buf, ')');
}
/*
* Deparse IS [NOT] NULL expression.
*/
static void
sqlite_deparse_null_test(NullTest *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
appendStringInfoChar(buf, '(');
sqlite_deparse_expr(node->arg, context);
if (node->nulltesttype == IS_NULL)
appendStringInfoString(buf, " IS NULL)");
else
appendStringInfoString(buf, " IS NOT NULL)");
}
/*
* Deparse ARRAY[...] construct.
*/
static void
sqlite_deparse_array_expr(ArrayExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
bool first = true;
ListCell *lc;
appendStringInfoString(buf, "ARRAY[");
foreach(lc, node->elements)
{
if (!first)
appendStringInfoString(buf, ", ");
sqlite_deparse_expr(lfirst(lc), context);
first = false;
}
appendStringInfoChar(buf, ']');
}
/*
* Deparse CASE expression
*/
static void
sqlite_deparse_case_expr(CaseExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
ListCell *lc = NULL;
appendStringInfoString(buf, "CASE ");
/* If this is a CASE arg WHEN then emit the arg expression */
if (node->arg != NULL)
sqlite_deparse_expr(node->arg, context);
/* Add each condition/result of the CASE clause */
foreach(lc, node->args)
{
CaseWhen *whenclause = (CaseWhen *) lfirst(lc);
/* WHEN */
appendStringInfoString(buf, " WHEN ");
if (node->arg == NULL) /* CASE WHEN */
sqlite_deparse_expr(whenclause->expr, context);
else /* CASE arg WHEN */
{
/* Ignore the CaseTestExpr and equality operator. */
sqlite_deparse_expr(lsecond(castNode(OpExpr, whenclause->expr)->args),
context);
}
/* THEN */
appendStringInfoString(buf, " THEN ");
sqlite_deparse_expr(whenclause->result, context);
}
/* add ELSE if present */
if (node->defresult != NULL)
{
appendStringInfoString(buf, " ELSE ");
sqlite_deparse_expr(node->defresult, context);
}
/* append END */
appendStringInfoString(buf, " END");
}
/*
* Deparse given NULLIF(val1, val2) expression.
*/
static void
sqlite_deparse_null_if_expr(NullIfExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
appendStringInfoString(buf, "NULLIF(");
sqlite_deparse_expr(lfirst(list_head(node->args)), context);
appendStringInfoString(buf, ", ");
sqlite_deparse_expr(lfirst(list_tail(node->args)), context);
appendStringInfoChar(buf, ')');
}
/*
* Deparse given COALESCE(...) expression.
*/
static void
sqlite_deparse_coalesce_expr(CoalesceExpr *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
ListCell *lc;
bool first = true;
appendStringInfoString(buf, "COALESCE(");
foreach(lc, node->args)
{
if (!first)
appendStringInfoString(buf, ", ");
first = false;
sqlite_deparse_expr(lfirst(lc), context);
}
appendStringInfoChar(buf, ')');
}
/*
* Print the representation of a parameter to be sent to the remote side.
*
* Note: we always label the Param's type explicitly rather than relying on
* transmitting a numeric type OID in PQsendQueryParams(). This allows us to
* avoid assuming that types have the same OIDs on the remote side as they
* do locally --- they need only have the same names.
*/
static void
sqlite_print_remote_param(int paramindex, Oid paramtype, int32 paramtypmod,
deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
appendStringInfo(buf, "?");
}
static void
sqlite_print_remote_placeholder(Oid paramtype, int32 paramtypmod,
deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
appendStringInfo(buf, "(SELECT null)");
}
/*
* Return true if given object is one of PostgreSQL's built-in objects.
*
* We use FirstBootstrapObjectId as the cutoff, so that we only consider
* objects with hand-assigned OIDs to be "built in", not for instance any
* function or type defined in the information_schema.
*
* Our constraints for dealing with types are tighter than they are for
* functions or operators: we want to accept only types that are in pg_catalog,
* else format_type might incorrectly fail to schema-qualify their names.
* (This could be fixed with some changes to format_type, but for now there's
* no need.) Thus we must exclude information_schema types.
*
* XXX there is a problem with this, which is that the set of built-in
* objects expands over time. Something that is built-in to us might not
* be known to the remote server, if it's of an older version. But keeping
* track of that would be a huge exercise.
*/
bool
sqlite_is_builtin(Oid oid)
{
#if PG_VERSION_NUM >= 120000
return (oid < FirstGenbkiObjectId);
#else
return (oid < FirstBootstrapObjectId);
#endif
}
/*
* Deparse an Aggref node.
*/
static void
sqlite_deparse_aggref(Aggref *node, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
bool use_variadic;
/* Only basic, non-split aggregation accepted. */
Assert(node->aggsplit == AGGSPLIT_SIMPLE);
/* Check if need to print VARIADIC (cf. ruleutils.c) */
use_variadic = node->aggvariadic;
/* Find aggregate name from aggfnoid which is a pg_proc entry */
sqlite_append_function_name(node->aggfnoid, context);
appendStringInfoChar(buf, '(');
/* Add DISTINCT */
appendStringInfo(buf, "%s", (node->aggdistinct != NIL) ? "DISTINCT " : "");
if (AGGKIND_IS_ORDERED_SET(node->aggkind))
{
/* Add WITHIN GROUP (ORDER BY ..) */
ListCell *arg;
bool first = true;
Assert(!node->aggvariadic);
Assert(node->aggorder != NIL);
foreach(arg, node->aggdirectargs)
{
if (!first)
appendStringInfoString(buf, ", ");
first = false;
sqlite_deparse_expr((Expr *) lfirst(arg), context);
}
appendStringInfoString(buf, ") WITHIN GROUP (ORDER BY ");
sqlite_append_agg_order_by(node->aggorder, node->args, context);
}
else
{
/* aggstar can be set only in zero-argument aggregates */
if (node->aggstar)
appendStringInfoChar(buf, '*');
else
{
ListCell *arg;
bool first = true;
/* Add all the arguments */
foreach(arg, node->args)
{
TargetEntry *tle = (TargetEntry *) lfirst(arg);
Node *n = (Node *) tle->expr;
if (tle->resjunk)
continue;
if (!first)
appendStringInfoString(buf, ", ");
first = false;
/* Add VARIADIC */
#if PG_VERSION_NUM < 130000
if (use_variadic && lnext(arg) == NULL)
#else
if (use_variadic && lnext(node->args, arg) == NULL)
#endif
appendStringInfoString(buf, "VARIADIC ");
sqlite_deparse_expr((Expr *) n, context);
}
}
/* Add ORDER BY */
if (node->aggorder != NIL)
{
appendStringInfoString(buf, " ORDER BY ");
sqlite_append_agg_order_by(node->aggorder, node->args, context);
}
}
/* Add FILTER (WHERE ..) */
if (node->aggfilter != NULL)
{
appendStringInfoString(buf, ") FILTER (WHERE ");
sqlite_deparse_expr((Expr *) node->aggfilter, context);
}
appendStringInfoChar(buf, ')');
}
/*
* Deparse GROUP BY clause.
*/
static void
sqlite_append_group_by_clause(List *tlist, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
Query *query = context->root->parse;
ListCell *lc;
bool first = true;
/* Nothing to be done, if there's no GROUP BY clause in the query. */
if (!query->groupClause)
return;
appendStringInfo(buf, " GROUP BY ");
/*
* Queries with grouping sets are not pushed down, so we don't expect
* grouping sets here.
*/
Assert(!query->groupingSets);
/*
* We intentionally print query->groupClause not processed_groupClause,
* leaving it to the remote planner to get rid of any redundant GROUP BY
* items again. This is necessary in case processed_groupClause reduced
* to empty, and in any case the redundancy situation on the remote might
* be different than what we think here.
*/
foreach(lc, query->groupClause)
{
SortGroupClause *grp = (SortGroupClause *) lfirst(lc);
if (!first)
appendStringInfoString(buf, ", ");
first = false;
sqlite_deparse_sort_group_clause(grp->tleSortGroupRef, tlist, true, context);
}
}
/*
* Append ORDER BY within aggregate function.
*/
static void
sqlite_append_agg_order_by(List *orderList, List *targetList, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
ListCell *lc;
bool first = true;
foreach(lc, orderList)
{
SortGroupClause *srt = (SortGroupClause *) lfirst(lc);
Node *sortexpr;
if (!first)
appendStringInfoString(buf, ", ");
first = false;
/* Deparse the sort expression proper. */
sortexpr = sqlite_deparse_sort_group_clause(srt->tleSortGroupRef, targetList, false,
context);
/* Add decoration as needed. */
sqlite_append_order_by_suffix(srt->sortop, exprType(sortexpr), srt->nulls_first, context);
}
}
/*
* Deparse ORDER BY clause defined by the given pathkeys.
*
* The clause should use Vars from context->scanrel if !has_final_sort,
* or from context->foreignrel's targetlist if has_final_sort.
*
* We find a suitable pathkey expression (some earlier step
* should have verified that there is one) and deparse it.
*/
static void
sqlite_append_order_by_clause(List *pathkeys, bool has_final_sort, deparse_expr_cxt *context)
{
ListCell *lcell;
int nestlevel;
StringInfo buf = context->buf;
bool gotone = false;
/* Make sure any constants in the exprs are printed portably */
nestlevel = sqlite_set_transmission_modes();
foreach(lcell, pathkeys)
{
PathKey *pathkey = lfirst(lcell);
Expr *em_expr;
int sqliteVersion = sqlite3_libversion_number();
EquivalenceMember *em;
Oid oprid;
if (has_final_sort)
{
/*
* By construction, context->foreignrel is the input relation to
* the final sort.
*/
em = sqlite_find_em_for_rel_target(context->root,
pathkey->pk_eclass,
context->foreignrel);
}
else
em = sqlite_find_em_for_rel(context->root, pathkey->pk_eclass, context->scanrel);
/*
* We don't expect any error here; it would mean that shippability
* wasn't verified earlier. For the same reason, we don't recheck
* shippability of the sort operator.
*/
if (em == NULL)
elog(ERROR, "could not find pathkey item to sort");
em_expr = em->em_expr;
#if PG_VERSION_NUM >= 170000
/*
* If the member is a Const expression then we needn't add it to the
* ORDER BY clause. This can happen in UNION ALL queries where the
* union child targetlist has a Const. Adding these would be
* wasteful, but also, for INT columns, an integer literal would be
* seen as an ordinal column position rather than a value to sort by.
* deparseConst() does have code to handle this, but it seems less
* effort on all accounts just to skip these for ORDER BY clauses.
*/
if (IsA(em_expr, Const))
continue;
#endif
if (!gotone)
{
appendStringInfoString(buf, " ORDER BY ");
gotone = true;
}
else
appendStringInfoString(buf, ", ");
/*
* Lookup the operator corresponding to the strategy in the opclass.
* The datatype used by the opfamily is not necessarily the same as
* the expression type (for array types for example).
*/
oprid = get_opfamily_member(pathkey->pk_opfamily,
em->em_datatype,
em->em_datatype,
pathkey->pk_strategy);
if (!OidIsValid(oprid))
elog(ERROR, "missing operator %d(%u,%u) in opfamily %u",
pathkey->pk_strategy, em->em_datatype, em->em_datatype,
pathkey->pk_opfamily);
sqlite_deparse_expr(em_expr, context);
/*
* Here we need to use the expression's actual type to discover
* whether the desired operator will be the default or not.
*/
sqlite_append_order_by_suffix(oprid, exprType((Node *) em_expr),
pathkey->pk_nulls_first, context);
/*
* In SQLITE3 Release v3.30.0 (2019-10-04) NULLS FIRST/LAST is
* supported, but not in prior versions More info:
* https://www.sqlite.org/changes.html
* https://www.sqlite.org/lang_select.html#orderby
*/
if (sqliteVersion < 3030000)
{
/*
* If we need a different behaviour than SQLite default...we show
* warning message because NULLS FIRST/LAST is not implemented in
* this SQLite version.
*/
if (!pathkey->pk_nulls_first && pathkey->pk_strategy == BTLessStrategyNumber)
elog(WARNING, "Current Sqlite Version (%d) does not support NULLS LAST for ORDER BY ASC, degraded emitted query to ORDER BY ASC NULLS FIRST (default sqlite behaviour).", sqliteVersion);
else if (pathkey->pk_nulls_first && pathkey->pk_strategy != BTLessStrategyNumber)
elog(WARNING, "Current Sqlite Version (%d) does not support NULLS FIRST for ORDER BY DESC, degraded emitted query to ORDER BY DESC NULLS LAST (default sqlite behaviour).", sqliteVersion);
}
}
sqlite_reset_transmission_modes(nestlevel);
}
/*
* Append the ASC, DESC, USING and NULLS FIRST / NULLS LAST parts
* of an ORDER BY clause.
*/
static void sqlite_append_order_by_suffix(Oid sortop, Oid sortcoltype,
bool nulls_first,
deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
TypeCacheEntry *typentry;
/* See whether operator is default < or > for sort expr's datatype. */
typentry = lookup_type_cache(sortcoltype,
TYPECACHE_LT_OPR | TYPECACHE_GT_OPR);
/* SQLite does not support USING */
Assert (sortop == typentry->lt_opr || sortop == typentry->gt_opr);
if (sortop == typentry->lt_opr)
appendStringInfoString(buf, " ASC");
else if (sortop == typentry->gt_opr)
appendStringInfoString(buf, " DESC");
if (nulls_first)
appendStringInfoString(buf, " NULLS FIRST");
else
appendStringInfoString(buf, " NULLS LAST");
}
/*
* Deparse LIMIT/OFFSET clause.
*/
static void
sqlite_append_limit_clause(deparse_expr_cxt *context)
{
PlannerInfo *root = context->root;
StringInfo buf = context->buf;
int nestlevel;
/* Make sure any constants in the exprs are printed portably */
nestlevel = sqlite_set_transmission_modes();
if (root->parse->limitCount)
{
appendStringInfoString(buf, " LIMIT ");
sqlite_deparse_expr((Expr *) root->parse->limitCount, context);
}
else
{
/*
* We add this LIMIT -1 because OFFSET by itself its not
* implemented/allowed in SQLite. You need to provide LIMIT *always*
* when using OFFSET
*/
appendStringInfoString(buf, " LIMIT -1");
}
if (root->parse->limitOffset)
{
appendStringInfoString(buf, " OFFSET ");
sqlite_deparse_expr((Expr *) root->parse->limitOffset, context);
}
sqlite_reset_transmission_modes(nestlevel);
}
/*
* sqlite_append_function_name
* Deparses function name from given function oid.
*/
static void
sqlite_append_function_name(Oid funcid, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
HeapTuple proctup;
Form_pg_proc procform;
const char *proname;
proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
if (!HeapTupleIsValid(proctup))
elog(ERROR, "cache lookup failed for function %u", funcid);
procform = (Form_pg_proc) GETSTRUCT(proctup);
/* Print schema name only if it's not pg_catalog */
if (procform->pronamespace != PG_CATALOG_NAMESPACE)
{
const char *schemaname;
schemaname = get_namespace_name(procform->pronamespace);
appendStringInfo(buf, "%s.", quote_identifier(schemaname));
}
/* Always print the function name */
proname = NameStr(procform->proname);
appendStringInfo(buf, "%s", quote_identifier(proname));
ReleaseSysCache(proctup);
}
/*
* Appends a sort or group clause.
*
* Like get_rule_sortgroupclause(), returns the expression tree, so caller
* need not find it again.
*/
static Node *
sqlite_deparse_sort_group_clause(Index ref, List *tlist, bool force_colno, deparse_expr_cxt *context)
{
StringInfo buf = context->buf;
TargetEntry *tle;
Expr *expr;
tle = get_sortgroupref_tle(ref, tlist);
expr = tle->expr;
if (force_colno)
{
/* Use column-number form when requested by caller. */
Assert(!tle->resjunk);
appendStringInfo(buf, "%d", tle->resno);
}
else if (expr && IsA(expr, Const))
{
/*
* Force a typecast here so that we don't emit something like "GROUP
* BY 2", which will be misconstrued as a column position rather than
* a constant.
*/
sqlite_deparse_const((Const *) expr, context, 1);
}
else if (!expr || IsA(expr, Var))
sqlite_deparse_expr(expr, context);
else
{
/* Always parenthesize the expression. */
appendStringInfoString(buf, "(");
sqlite_deparse_expr(expr, context);
appendStringInfoString(buf, ")");
}
return (Node *) expr;
}
/*
* Returns true if given Var is deparsed as a subquery output column, in
* which case, *relno and *colno are set to the IDs for the relation and
* column alias to the Var provided by the subquery.
*/
static bool
sqlite_is_subquery_var(Var *node, RelOptInfo *foreignrel, int *relno, int *colno)
{
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
RelOptInfo *outerrel = fpinfo->outerrel;
RelOptInfo *innerrel = fpinfo->innerrel;
/* Should only be called in these cases. */
Assert(IS_SIMPLE_REL(foreignrel) || IS_JOIN_REL(foreignrel));
/*
* If the given relation isn't a join relation, it doesn't have any lower
* subqueries, so the Var isn't a subquery output column.
*/
if (!IS_JOIN_REL(foreignrel))
return false;
/*
* If the Var doesn't belong to any lower subqueries, it isn't a subquery
* output column.
*/
if (!bms_is_member(node->varno, fpinfo->lower_subquery_rels))
return false;
if (bms_is_member(node->varno, outerrel->relids))
{
/*
* If outer relation is deparsed as a subquery, the Var is an output
* column of the subquery; get the IDs for the relation/column alias.
*/
if (fpinfo->make_outerrel_subquery)
{
sqlite_get_relation_column_alias_ids(node, outerrel, relno, colno);
return true;
}
/* Otherwise, recurse into the outer relation. */
return sqlite_is_subquery_var(node, outerrel, relno, colno);
}
else
{
Assert(bms_is_member(node->varno, innerrel->relids));
/*
* If inner relation is deparsed as a subquery, the Var is an output
* column of the subquery; get the IDs for the relation/column alias.
*/
if (fpinfo->make_innerrel_subquery)
{
sqlite_get_relation_column_alias_ids(node, innerrel, relno, colno);
return true;
}
/* Otherwise, recurse into the inner relation. */
return sqlite_is_subquery_var(node, innerrel, relno, colno);
}
}
/*
* Get the IDs for the relation and column alias to given Var belonging to
* given relation, which are returned into *relno and *colno.
*/
static void
sqlite_get_relation_column_alias_ids(Var *node, RelOptInfo *foreignrel,
int *relno, int *colno)
{
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
int i;
ListCell *lc;
/* Get the relation alias ID */
*relno = fpinfo->relation_index;
/* Get the column alias ID */
i = 1;
foreach(lc, foreignrel->reltarget->exprs)
{
#if PG_VERSION_NUM >= 160000
Var *tlvar = (Var *) lfirst(lc);
/*
* Match reltarget entries only on varno/varattno. Ideally there
* would be some cross-check on varnullingrels, but it's unclear what
* to do exactly; we don't have enough context to know what that value
* should be.
*/
if (IsA(tlvar, Var) &&
tlvar->varno == node->varno &&
tlvar->varattno == node->varattno)
#else
if (equal(lfirst(lc), (Node *) node))
#endif
{
*colno = i;
return;
}
i++;
}
/* Shouldn't get here */
elog(ERROR, "unexpected expression in subquery output");
}
/*****************************************************************************
* Check clauses for immutable functions
*****************************************************************************/
/*
* contain_immutable_functions
* Recursively search for immutable functions within a clause.
*
* Returns true if any immutable function (or operator implemented by a
* immutable function) is found.
*
* We will recursively look into TargetEntry exprs.
*/
static bool
sqlite_contain_immutable_functions(Node *clause)
{
return sqlite_contain_immutable_functions_walker(clause, NULL);
}
static bool
sqlite_contain_immutable_functions_walker(Node *node, void *context)
{
if (node == NULL)
return false;
/* Check for mutable functions in node itself */
if (nodeTag(node) == T_FuncExpr)
{
FuncExpr *expr = (FuncExpr *) node;
if (func_volatile(expr->funcid) == PROVOLATILE_IMMUTABLE)
return true;
}
/*
* It should be safe to treat MinMaxExpr as immutable, because it will
* depend on a non-cross-type btree comparison function, and those should
* always be immutable. Treating XmlExpr as immutable is more dubious,
* and treating CoerceToDomain as immutable is outright dangerous. But we
* have done so historically, and changing this would probably cause more
* problems than it would fix. In practice, if you have a non-immutable
* domain constraint you are in for pain anyhow.
*/
/* Recurse to check arguments */
if (IsA(node, Query))
{
/* Recurse into subselects */
return query_tree_walker((Query *) node,
sqlite_contain_immutable_functions_walker,
context, 0);
}
return expression_tree_walker(node, sqlite_contain_immutable_functions_walker,
context);
}
/*
* Returns true if given tlist is safe to evaluate on the foreign server.
*/
bool
sqlite_is_foreign_function_tlist(PlannerInfo *root,
RelOptInfo *baserel,
List *tlist)
{
foreign_glob_cxt glob_cxt;
foreign_loc_cxt loc_cxt;
ListCell *lc;
bool is_contain_function;
if (!IS_SIMPLE_REL(baserel) ||
IS_OTHER_REL(baserel))
return false;
/*
* Check that the expression consists of any immutable function.
*/
is_contain_function = false;
foreach(lc, tlist)
{
TargetEntry *tle = lfirst_node(TargetEntry, lc);
if (sqlite_contain_immutable_functions((Node *) tle->expr))
{
is_contain_function = true;
break;
}
}
if (!is_contain_function)
return false;
/*
* Check that the expression consists of nodes that are safe to execute
* remotely.
*/
foreach(lc, tlist)
{
TargetEntry *tle = lfirst_node(TargetEntry, lc);
glob_cxt.root = root;
glob_cxt.foreignrel = baserel;
glob_cxt.relids = baserel->relids;
loc_cxt.collation = InvalidOid;
loc_cxt.state = FDW_COLLATE_NONE;
if (!sqlite_foreign_expr_walker((Node *) tle->expr, &glob_cxt, &loc_cxt, NULL))
return false;
/*
* If the expression has a valid collation that does not arise from a
* foreign var, the expression can not be sent over.
*/
if (loc_cxt.state == FDW_COLLATE_UNSAFE)
return false;
/*
* An expression which includes any mutable functions can't be sent
* over because its result is not stable. For example, sending now()
* remote side could cause confusion from clock offsets. Future
* versions might be able to make this choice with more granularity.
* (We check this last because it requires a lot of expensive catalog
* lookups.)
*/
if (contain_mutable_functions((Node *) tle->expr))
return false;
}
/* OK for the target list with functions to evaluate on the remote server */
return true;
}
/*
* Examine each qual clause in input_conds, and classify them into two
* groups, which are returned as two lists: - remote_conds contains
* expressions that can be evaluated remotely - local_conds contains
* expressions that can't be evaluated remotely
*/
void
sqlite_classify_conditions(PlannerInfo *root,
RelOptInfo *baserel,
List *input_conds,
List **remote_conds,
List **local_conds)
{
ListCell *lc;
*remote_conds = NIL;
*local_conds = NIL;
foreach(lc, input_conds)
{
RestrictInfo *ri = lfirst_node(RestrictInfo, lc);
if (sqlite_is_foreign_expr(root, baserel, ri->clause))
*remote_conds = lappend(*remote_conds, ri);
else
*local_conds = lappend(*local_conds, ri);
}
}
================================================
FILE: option.c
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* Portions Copyright (c) 2018, TOSHIBA CORPORATION
*
* IDENTIFICATION
* option.c
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "sqlite_fdw.h"
#include "funcapi.h"
#include "access/reloptions.h"
#include "catalog/pg_foreign_server.h"
#include "catalog/pg_foreign_table.h"
#include "catalog/pg_type.h"
#include "commands/defrem.h"
#include "utils/guc.h"
#include "utils/lsyscache.h"
#if PG_VERSION_NUM >= 160000
#include "utils/varlena.h"
#endif
/*
* Describes the valid options for objects that use this wrapper.
*/
struct SqliteFdwOption
{
const char *optname;
Oid optcontext; /* Oid of catalog in which option may appear */
};
/*
* Valid options for sqlite_fdw.
*
*/
static struct SqliteFdwOption valid_options[] =
{
{"database", ForeignServerRelationId},
{"keep_connections", ForeignServerRelationId},
{"force_readonly", ForeignServerRelationId},
{"table", ForeignTableRelationId},
{"key", AttributeRelationId},
{"column_name", AttributeRelationId},
{"column_type", AttributeRelationId},
/* updatable is available on both server and table */
{"updatable", ForeignServerRelationId},
{"updatable", ForeignTableRelationId},
/* truncatable is available on both server and table */
{"truncatable", ForeignServerRelationId},
{"truncatable", ForeignTableRelationId},
/* batch_size is available on both server and table */
{"batch_size", ForeignServerRelationId},
{"batch_size", ForeignTableRelationId},
/* Sentinel */
{NULL, InvalidOid}
};
extern PGDLLEXPORT Datum sqlite_fdw_validator(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(sqlite_fdw_validator);
bool
sqlite_is_valid_option(const char *option, Oid context);
/*
* Validate the generic options given to a FOREIGN DATA WRAPPER, SERVER,
* or FOREIGN TABLE that supported by sqlite_fdw.
*
* Raise an ERROR if the option or its value is considered invalid.
*/
Datum
sqlite_fdw_validator(PG_FUNCTION_ARGS)
{
List *options_list = untransformRelOptions(PG_GETARG_DATUM(0));
Oid catalog = PG_GETARG_OID(1);
ListCell *cell;
/*
* Check that only options supported by sqlite_fdw, and allowed for the
* current object type, are given.
*/
foreach(cell, options_list)
{
DefElem *def = (DefElem *) lfirst(cell);
if (!sqlite_is_valid_option(def->defname, catalog))
{
struct SqliteFdwOption *opt;
#if (PG_VERSION_NUM >= 160000)
/*
* Unknown option specified, complain about it. Provide a hint
* with a valid option that looks similar, if there is one.
*/
const char *closest_match;
ClosestMatchState match_state;
bool has_valid_options = false;
initClosestMatch(&match_state, def->defname, 4);
for (opt = valid_options; opt->optname; opt++)
{
if (catalog == opt->optcontext)
{
has_valid_options = true;
updateClosestMatch(&match_state, opt->optname);
}
}
closest_match = getClosestMatch(&match_state);
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_OPTION_NAME),
errmsg("sqlite_fdw: invalid option \"%s\"", def->defname),
has_valid_options ? closest_match ?
errhint("Perhaps you meant the option \"%s\".",
closest_match) : 0 :
errhint("There are no valid options in this context.")));
#else
/*
* Unknown option specified, complain about it. Provide a hint
* with list of valid options for the object.
*/
StringInfoData buf;
initStringInfo(&buf);
for (opt = valid_options; opt->optname; opt++)
{
if (catalog == opt->optcontext)
appendStringInfo(&buf, "%s%s", (buf.len > 0) ? ", " : "",
opt->optname);
}
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_OPTION_NAME),
errmsg("invalid option \"%s\"", def->defname),
buf.len > 0 ?
errhint("Valid options in this context are: %s", buf.data) :
errhint("There are no valid options in this context.")));
#endif
}
/* Validate option value */
if (strcmp(def->defname, "truncatable") == 0 ||
strcmp(def->defname, "keep_connections") == 0 ||
strcmp(def->defname, "updatable") == 0 ||
strcmp(def->defname, "force_readonly") == 0)
{
defGetBoolean(def);
}
else if (strcmp(def->defname, "batch_size") == 0)
{
char *value;
int int_val;
bool is_parsed;
value = defGetString(def);
is_parsed = parse_int(value, &int_val, 0, NULL);
if (!is_parsed)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid value for integer option \"%s\": %s",
def->defname, value)));
if (int_val <= 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("\"%s\" must be an integer value greater than zero",
def->defname)));
}
}
PG_RETURN_VOID();
}
/*
* Check if the provided option is one of the valid options.
* context is the Oid of the catalog holding the object the option is for.
*/
bool
sqlite_is_valid_option(const char *option, Oid context)
{
struct SqliteFdwOption *opt;
for (opt = valid_options; opt->optname; opt++)
{
if (context == opt->optcontext && strcmp(opt->optname, option) == 0)
return true;
}
return false;
}
/*
* Fetch the options for a sqlite_fdw foreign table.
*/
sqlite_opt *
sqlite_get_options(Oid foreignoid)
{
ForeignTable *f_table = NULL;
ForeignServer *f_server = NULL;
List *options;
ListCell *lc;
sqlite_opt *opt;
opt = (sqlite_opt *) palloc(sizeof(sqlite_opt));
memset(opt, 0, sizeof(sqlite_opt));
/*
* Extract options from FDW objects.
*/
PG_TRY();
{
f_table = GetForeignTable(foreignoid);
f_server = GetForeignServer(f_table->serverid);
}
PG_CATCH();
{
f_table = NULL;
f_server = GetForeignServer(foreignoid);
}
PG_END_TRY();
options = NIL;
if (f_table)
options = list_concat(options, f_table->options);
options = list_concat(options, f_server->options);
/* Loop through the options, and get the server/port */
foreach(lc, options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "database") == 0)
opt->svr_database = defGetString(def);
if (strcmp(def->defname, "table") == 0)
opt->svr_table = defGetString(def);
}
if (!opt->svr_table && f_table)
opt->svr_table = get_rel_name(foreignoid);
return opt;
}
================================================
FILE: sql/13.15/aggregate.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 18:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
-- test for aggregate pushdown
--Testcase 8:
DROP SERVER IF EXISTS sqlite_svr CASCADE;
--Testcase 9:
DROP EXTENSION IF EXISTS sqlite_fdw CASCADE;
--Testcase 10:
CREATE EXTENSION sqlite_fdw;
--Testcase 11:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 12:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 1:
explain (costs off, verbose) select count(distinct a) from multiprimary;
--Testcase 2:
explain (costs off, verbose) select sum(b),max(b), min(b), avg(b) from multiprimary;
--Testcase 3:
explain (costs off, verbose) select sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 4:
explain (costs off, verbose) select sum(a) from multiprimary group by b having sum(a) > 0;
--Testcase 5:
explain (costs off, verbose) select sum(a) from multiprimary group by b having avg(a^2) > 0 and sum(a) > 0;
-- stddev and variance are not pushed down
--Testcase 6:
explain (costs off, verbose) select stddev(a) from multiprimary;
--Testcase 7:
explain (costs off, verbose) select sum(a) from multiprimary group by b having variance(a) > 0;
--Testcase 13:
DROP FOREIGN TABLE multiprimary;
--Testcase 16:
CREATE FOREIGN TABLE limittest(id serial OPTIONS (key 'true'), x int, y text) SERVER sqlite_svr;
--Testcase 17:
INSERT INTO limittest(x, y) VALUES (1, 'x'), (2, 'x'), (3, 'x'), (4, 'x');
--Testcase 18:
INSERT INTO limittest(x, y) VALUES (1, 'y'), (2, 'y'), (3, 'y'), (4, 'y');
--Testcase 19:
INSERT INTO limittest(x, y) VALUES (1, 'z'), (2, 'z'), (3, 'z'), (4, 'z');
--Testcase 20:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 21:
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 22:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 23:
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 24:
EXPLAIN VERBOSE
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 25:
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 26:
EXPLAIN VERBOSE
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 27:
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 28:
DROP FOREIGN TABLE limittest;
--Testcase 14:
DROP SERVER sqlite_svr;
--Testcase 15:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/aggregates.sql
================================================
--
-- AGGREGATES
--
--Testcase 266:
CREATE EXTENSION sqlite_fdw;
--Testcase 267:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 268:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 269:
CREATE FOREIGN TABLE aggtest (
a int2,
b float4
) SERVER sqlite_svr;
--Testcase 270:
CREATE FOREIGN TABLE student (
name text,
age int4,
location point,
gpa float8
) SERVER sqlite_svr;
--Testcase 271:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 272:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 588:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 589:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 590:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 591:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 592:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 273:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 593:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 594:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 595:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 596:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 597:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 274:
CREATE FOREIGN TABLE multi_arg_agg (a int OPTIONS (key 'true'), b int, c text) SERVER sqlite_svr;
--Testcase 275:
CREATE FOREIGN TABLE VARCHAR_TBL(f1 varchar(4) OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 276:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 598:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 599:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 600:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 601:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 602:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 588:
SET extra_float_digits = 0;
--Testcase 1:
SELECT avg(four) AS avg_1 FROM onek;
--Testcase 2:
SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
--Testcase 697:
CREATE FOREIGN TABLE agg_tb(v int, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 698:
INSERT INTO agg_tb(v) VALUES(1), (2), (3);
--Testcase 699: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 700:
DELETE FROM agg_tb;
--Testcase 701:
INSERT INTO agg_tb(v) VALUES (NULL);
--Testcase 702: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 703:
DELETE FROM agg_tb;
--Testcase 704:
INSERT INTO agg_tb(v) VALUES (NULL), (1), (2);
--Testcase 705: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 706:
CREATE FOREIGN TABLE agg_tb2(v text) SERVER sqlite_svr;
--Testcase 707:
INSERT INTO agg_tb2(v) VALUES (array['hello', 'world']);
--Testcase 708: -- Pg 16+
SELECT any_value(v) FROM agg_tb2;
-- In 7.1, avg(float4) is computed using float8 arithmetic.
--Testcase 3:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 603:
SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest;
--Testcase 4:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 604:
SELECT avg(gpa)::numeric(10,3) AS avg_3_4 FROM ONLY student;
--Testcase 5:
SELECT sum(four) AS sum_1500 FROM onek;
--Testcase 6:
SELECT sum(a) AS sum_198 FROM aggtest;
--Testcase 7:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 605:
SELECT sum(b)::numeric(10,3) AS avg_431_773 FROM aggtest;
--Testcase 8:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 606:
SELECT sum(gpa)::numeric(10,3) AS avg_6_8 FROM ONLY student;
--Testcase 9:
SELECT max(four) AS max_3 FROM onek;
--Testcase 10:
SELECT max(a) AS max_100 FROM aggtest;
--Testcase 11:
SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
--Testcase 12:
SELECT max(student.gpa) AS max_3_7 FROM student;
--Testcase 13:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 607:
SELECT stddev_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 14:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 608:
SELECT stddev_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 15:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 609:
SELECT var_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 16:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 610:
SELECT var_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 17:
SELECT stddev_pop(b::numeric) FROM aggtest;
--Testcase 18:
SELECT stddev_samp(b::numeric) FROM aggtest;
--Testcase 19:
SELECT var_pop(b::numeric) FROM aggtest;
--Testcase 20:
SELECT var_samp(b::numeric) FROM aggtest;
-- population variance is defined for a single tuple, sample variance
-- is not
--Testcase 277:
CREATE FOREIGN TABLE agg_t3(a float8, b float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 278:
DELETE FROM agg_t3;
--Testcase 279:
INSERT INTO agg_t3 values (1.0::float8, 2.0::float8);
--Testcase 280:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 281:
DELETE FROM agg_t3;
--Testcase 282:
INSERT INTO agg_t3 values (3.0::float8, 4.0::float8);
--Testcase 283:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 284:
DELETE FROM agg_t3;
--Testcase 285:
INSERT INTO agg_t3 values ('inf'::float8, 'inf'::float8);
--Testcase 286:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 287:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 288:
DELETE FROM agg_t3;
--Testcase 289:
INSERT INTO agg_t3 values ('nan'::float8, 'nan'::float8);
--Testcase 290:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 291:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 292:
CREATE FOREIGN TABLE agg_t4(a float4, b float4, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 293:
DELETE FROM agg_t4;
--Testcase 294:
INSERT INTO agg_t4 values (1.0::float4, 2.0::float4);
--Testcase 295:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 296:
DELETE FROM agg_t4;
--Testcase 297:
INSERT INTO agg_t4 values (3.0::float4, 4.0::float4);
--Testcase 298:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 299:
DELETE FROM agg_t4;
--Testcase 300:
INSERT INTO agg_t4 values ('inf'::float4, 'inf'::float4);
--Testcase 301:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 302:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 303:
DELETE FROM agg_t4;
--Testcase 304:
INSERT INTO agg_t4 values ('nan'::float4, 'nan'::float4);
--Testcase 305:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 306:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 307:
CREATE FOREIGN TABLE agg_t5(a numeric, b numeric, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 308:
DELETE FROM agg_t5;
--Testcase 309:
INSERT INTO agg_t5 values (1.0::numeric, 2.0::numeric);
--Testcase 310:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 311:
DELETE FROM agg_t5;
--Testcase 312:
INSERT INTO agg_t5 values (3.0::numeric, 4.0::numeric);
--Testcase 313:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 597:
DELETE FROM agg_t5;
--Testcase 598:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 599:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 600:
DELETE FROM agg_t5;
--Testcase 601:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 602:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 314:
DELETE FROM agg_t5;
--Testcase 315:
INSERT INTO agg_t5 values ('nan'::numeric, 'nan'::numeric);
--Testcase 316:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 317:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
-- verify correct results for null and NaN inputs
--Testcase 318:
CREATE FOREIGN TABLE agg_t8(a text OPTIONS (key 'true'), b text) SERVER sqlite_svr;
--Testcase 319:
DELETE FROM agg_t8;
--Testcase 320:
INSERT INTO agg_t8 select * from generate_series(1,3);
--Testcase 321:
select sum(null::int4) from agg_t8;
--Testcase 322:
select sum(null::int8) from agg_t8;
--Testcase 323:
select sum(null::numeric) from agg_t8;
--Testcase 324:
select sum(null::float8) from agg_t8;
--Testcase 325:
select avg(null::int4) from agg_t8;
--Testcase 326:
select avg(null::int8) from agg_t8;
--Testcase 327:
select avg(null::numeric) from agg_t8;
--Testcase 328:
select avg(null::float8) from agg_t8;
--Testcase 329:
select sum('NaN'::numeric) from agg_t8;
--Testcase 330:
select avg('NaN'::numeric) from agg_t8;
-- verify correct results for infinite inputs
--Testcase 331:
DELETE FROM agg_t3;
--Testcase 332:
INSERT INTO agg_t3 VALUES ('1'::float8), ('infinity'::float8);
--Testcase 333:
SELECT avg(a), var_pop(a) FROM agg_t3;
--Testcase 334:
DELETE FROM agg_t3;
--Testcase 335:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('1'::float8);
--Testcase 336:
SELECT avg(a), var_pop(a) FROM agg_t3;
--Testcase 337:
DELETE FROM agg_t3;
--Testcase 338:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('infinity'::float8);
--Testcase 339:
SELECT avg(a), var_pop(a) FROM agg_t3;
--Testcase 340:
DELETE FROM agg_t3;
--Testcase 341:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('infinity'::float8);
--Testcase 342:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 603:
DELETE FROM agg_t3;
--Testcase 604:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('-infinity'::float8);
--Testcase 605:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 606:
DELETE FROM agg_t3;
--Testcase 607: -- Pg 14+
INSERT INTO agg_t3 VALUES ('1'::numeric), ('infinity'::numeric);
--Testcase 608:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 609:
DELETE FROM agg_t3;
--Testcase 610:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('1'::numeric);
--Testcase 611:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 612:
DELETE FROM agg_t3;
--Testcase 613:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('infinity'::numeric);
--Testcase 614:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 615:
DELETE FROM agg_t3;
--Testcase 616:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('infinity'::numeric);
--Testcase 617:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 618:
DELETE FROM agg_t3;
--Testcase 619:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('-infinity'::numeric);
--Testcase 620:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
-- test accuracy with a large input offset
--Testcase 343:
CREATE FOREIGN TABLE agg_t6(a float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 344:
DELETE FROM agg_t6;
--Testcase 345:
INSERT INTO agg_t6 VALUES (100000003), (100000004), (100000006), (100000007);
--Testcase 346:
SELECT avg(a), var_pop(a) FROM agg_t6;
--Testcase 347:
DELETE FROM agg_t6;
--Testcase 348:
INSERT INTO agg_t6 VALUES (7000000000005), (7000000000007);
--Testcase 349:
SELECT avg(a), var_pop(a) FROM agg_t6;
-- SQL2003 binary aggregates
--Testcase 21:
SELECT regr_count(b, a) FROM aggtest;
--Testcase 22:
SELECT regr_sxx(b, a) FROM aggtest;
--Testcase 23:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 611:
SELECT regr_syy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 24:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 612:
SELECT regr_sxy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 25:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 613:
SELECT regr_avgx(b, a), regr_avgy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 26:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 614:
SELECT regr_r2(b, a)::numeric(20,10) FROM aggtest;
--Testcase 27:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 615:
SELECT regr_slope(b, a)::numeric(20,10), regr_intercept(b, a)::numeric(20,10) FROM aggtest;
--Testcase 28:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 616:
SELECT covar_pop(b, a)::numeric(20,10), covar_samp(b, a)::numeric(20,10) FROM aggtest;
--Testcase 29:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 617:
SELECT corr(b, a)::numeric(20,10) FROM aggtest;
-- check single-tuple behavior
--Testcase 350:
CREATE FOREIGN TABLE agg_t7(a float8, b float8, c float8, d float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 351:
DELETE FROM agg_t7;
--Testcase 352:
INSERT INTO agg_t7 VALUES (1, 2, 3, 4);
--Testcase 353:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 354:
DELETE FROM agg_t7;
--Testcase 355:
INSERT INTO agg_t7 VALUES (1, 'inf', 3, 'inf');
--Testcase 356:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 357:
DELETE FROM agg_t7;
--Testcase 358:
INSERT INTO agg_t7 VALUES (1, 'nan', 3, 'nan');
--Testcase 359:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
-- test accum and combine functions directly
--Testcase 360:
CREATE FOREIGN TABLE regr_test (x float8, y float8, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 361:
DELETE FROM regr_test;
--Testcase 362:
INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
--Testcase 363:
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);
--Testcase 364:
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 590:
EXPLAIN (VERBOSE, COSTS OFF)
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);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 365:
CREATE FOREIGN TABLE agg_t15 (a text, b int, c int, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 366:
delete from agg_t15;
--Testcase 367:
insert into agg_t15 values ('{4,140,2900}', 100);
--Testcase 368:
SELECT float8_accum(a::float8[], b) from agg_t15;
--Testcase 369:
delete from agg_t15;
--Testcase 370:
insert into agg_t15 values ('{4,140,2900,1290,83075,15050}', 200, 100);
--Testcase 371:
SELECT float8_regr_accum(a::float8[], b, c) from agg_t15;
--Testcase 372:
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);
--Testcase 373:
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);
--Testcase 374:
CREATE FOREIGN TABLE agg_t16 (a text, b text, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 375:
delete from agg_t16;
--Testcase 376:
insert into agg_t16 values ('{3,60,200}', '{0,0,0}');
--Testcase 377:
insert into agg_t16 values ('{0,0,0}', '{2,180,200}');
--Testcase 378:
insert into agg_t16 values ('{3,60,200}', '{2,180,200}');
--Testcase 379:
SELECT float8_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 380:
delete from agg_t16;
--Testcase 381:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{0,0,0,0,0,0}');
--Testcase 382:
insert into agg_t16 values ('{0,0,0,0,0,0}', '{2,180,200,740,57800,-3400}');
--Testcase 383:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{2,180,200,740,57800,-3400}');
--Testcase 384:
SELECT float8_regr_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 385:
DROP FOREIGN TABLE regr_test;
-- test count, distinct
--Testcase 30:
SELECT count(four) AS cnt_1000 FROM onek;
--Testcase 31:
SELECT count(DISTINCT four) AS cnt_4 FROM onek;
--Testcase 32:
select ten, count(*), sum(four) from onek
group by ten order by ten;
--Testcase 33:
select ten, count(four), sum(DISTINCT four) from onek
group by ten order by ten;
-- user-defined aggregates
--Testcase 386:
CREATE AGGREGATE newavg (
sfunc = int4_avg_accum, basetype = int4, stype = _int8,
finalfunc = int8_avg,
initcond1 = '{0,0}'
);
--Testcase 387:
CREATE AGGREGATE newsum (
sfunc1 = int4pl, basetype = int4, stype1 = int4,
initcond1 = '0'
);
--Testcase 388:
CREATE AGGREGATE newcnt (*) (
sfunc = int8inc, stype = int8,
initcond = '0', parallel = safe
);
--Testcase 389:
CREATE AGGREGATE newcnt ("any") (
sfunc = int8inc_any, stype = int8,
initcond = '0'
);
--Testcase 390:
CREATE AGGREGATE oldcnt (
sfunc = int8inc, basetype = 'ANY', stype = int8,
initcond = '0'
);
--Testcase 391:
create function sum3(int8,int8,int8) returns int8 as
'select $1 + $2 + $3' language sql strict immutable;
--Testcase 392:
create aggregate sum2(int8,int8) (
sfunc = sum3, stype = int8,
initcond = '0'
);
--Testcase 34:
SELECT newavg(four) AS avg_1 FROM onek;
--Testcase 35:
SELECT newsum(four) AS sum_1500 FROM onek;
--Testcase 36:
SELECT newcnt(four) AS cnt_1000 FROM onek;
--Testcase 37:
SELECT newcnt(*) AS cnt_1000 FROM onek;
--Testcase 38:
SELECT oldcnt(*) AS cnt_1000 FROM onek;
--Testcase 39:
SELECT sum2(q1,q2) FROM int8_tbl;
-- test for outer-level aggregates
-- this should work
--Testcase 40:
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
--Testcase 41:
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.
--Testcase 42:
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.
--Testcase 393:
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;
--Testcase 394:
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;
--Testcase 395:
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;
--Testcase 396:
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
--
--Testcase 397:
CREATE FOREIGN TABLE bitwise_test(
i2 INT2,
i4 INT4,
i8 INT8,
i INTEGER,
x INT2
) SERVER sqlite_svr;
-- empty case
--Testcase 43: -- bit_xor Pg 14+
SELECT
BIT_AND(i2) AS "?",
BIT_OR(i4) AS "?",
BIT_XOR(i8) AS "?"
FROM bitwise_test;
--Testcase 44:
INSERT INTO bitwise_test VALUES
(1, 1, 1, 1, 1),
(3, 3, 3, null, 2),
(7, 7, 7, 3, 4);
--Testcase 45:-- bit_xor Pg 14+
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_OR(i2) AS "7",
BIT_OR(i4) AS "7",
BIT_OR(i8) AS "7",
BIT_OR(i) AS "?",
BIT_OR(x) AS "7",
BIT_XOR(i2) AS "5",
BIT_XOR(i4) AS "5",
BIT_XOR(i8) AS "5",
BIT_XOR(i) AS "?",
BIT_XOR(x) AS "7"
FROM bitwise_test;
--
-- test boolean aggregates
--
-- first test all possible transition and final states
--Testcase 398:
CREATE FOREIGN TABLE bool_test_tmp(
b1 BOOL OPTIONS (key 'true'),
b2 BOOL OPTIONS (key 'true')
) SERVER sqlite_svr;
-- boolean and transitions
-- null because strict
BEGIN;
--Testcase 399:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 400:
SELECT booland_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- and actual computations
BEGIN;
--Testcase 401:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE);
--Testcase 402:
SELECT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 403:
INSERT INTO bool_test_tmp VALUES
(TRUE, FALSE),
(FALSE, TRUE),
(FALSE, FALSE);
--Testcase 404:
SELECT NOT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
-- boolean or transitions
-- null because strict
BEGIN;
--Testcase 405:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 406:
SELECT boolor_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- actual computations
BEGIN;
--Testcase 407:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE),
(TRUE, FALSE),
(FALSE, TRUE);
--Testcase 408:
SELECT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 409:
INSERT INTO bool_test_tmp VALUES
(FALSE, FALSE);
--Testcase 410:
SELECT NOT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
--Testcase 411:
CREATE FOREIGN TABLE bool_test(
b1 BOOL,
b2 BOOL,
b3 BOOL,
b4 BOOL
) SERVER sqlite_svr;
-- empty case
--Testcase 46:
SELECT
BOOL_AND(b1) AS "n",
BOOL_OR(b3) AS "n"
FROM bool_test;
--Testcase 47:
INSERT INTO bool_test VALUES
(TRUE, null, FALSE, null),
(FALSE, TRUE, null, null),
(null, TRUE, FALSE, null);
--Testcase 48:
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;
--Testcase 49:
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;
--Testcase 50:
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
--Testcase 51:
explain (costs off)
select min(unique1) from tenk1;
--Testcase 52:
select min(unique1) from tenk1;
--Testcase 53:
explain (costs off)
select max(unique1) from tenk1;
--Testcase 54:
select max(unique1) from tenk1;
--Testcase 55:
explain (costs off)
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 56:
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 57:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42;
--Testcase 58:
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;
--Testcase 628:
set local max_parallel_workers_per_gather = 0;
--Testcase 59:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42000;
--Testcase 60:
select max(unique1) from tenk1 where unique1 > 42000;
rollback;
-- multi-column index (uses tenk1_thous_tenthous)
--Testcase 61:
explain (costs off)
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 62:
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 63:
explain (costs off)
select min(tenthous) from tenk1 where thousand = 33;
--Testcase 64:
select min(tenthous) from tenk1 where thousand = 33;
-- check parameter propagation into an indexscan subquery
--Testcase 65:
explain (costs off)
select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
from int4_tbl;
--Testcase 66:
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
--Testcase 67:
explain (costs off)
select distinct max(unique2) from tenk1;
--Testcase 68:
select distinct max(unique2) from tenk1;
--Testcase 69:
explain (costs off)
select max(unique2) from tenk1 order by 1;
--Testcase 70:
select max(unique2) from tenk1 order by 1;
--Testcase 71:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2);
--Testcase 72:
select max(unique2) from tenk1 order by max(unique2);
--Testcase 73:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 74:
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 75:
explain (costs off)
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
--Testcase 76:
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
-- interesting corner case: constant gets optimized into a seqscan
--Testcase 77:
explain (costs off)
select max(100) from tenk1;
--Testcase 78:
select max(100) from tenk1;
-- try it on an inheritance tree
--Testcase 412:
create foreign table minmaxtest(f1 int) server sqlite_svr;
--Testcase 413:
create table minmaxtest1() inherits (minmaxtest);
--Testcase 414:
create table minmaxtest2() inherits (minmaxtest);
--Testcase 415:
create table minmaxtest3() inherits (minmaxtest);
--Testcase 416:
create index minmaxtest1i on minmaxtest1(f1);
--Testcase 417:
create index minmaxtest2i on minmaxtest2(f1 desc);
--Testcase 418:
create index minmaxtest3i on minmaxtest3(f1) where f1 is not null;
--Testcase 79:
insert into minmaxtest values(11), (12);
--Testcase 80:
insert into minmaxtest1 values(13), (14);
--Testcase 81:
insert into minmaxtest2 values(15), (16);
--Testcase 82:
insert into minmaxtest3 values(17), (18);
--Testcase 83:
explain (costs off)
select min(f1), max(f1) from minmaxtest;
--Testcase 84:
select min(f1), max(f1) from minmaxtest;
-- DISTINCT doesn't do anything useful here, but it shouldn't fail
--Testcase 85:
explain (costs off)
select distinct min(f1), max(f1) from minmaxtest;
--Testcase 86:
select distinct min(f1), max(f1) from minmaxtest;
-- check for correct detection of nested-aggregate errors
--Testcase 87:
select max(min(unique1)) from tenk1;
--Testcase 88:
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
--
--Testcase 419:
create foreign table agg_t1 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int, d int) server sqlite_svr;
--Testcase 420:
create foreign table agg_t2 (x int OPTIONS (key 'true'), y int OPTIONS (key 'true'), z int) server sqlite_svr;
--Testcase 421:
create foreign table agg_t9 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int) server sqlite_svr;
-- Non-primary-key columns can be removed from GROUP BY
--Testcase 89:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- No removal can happen if the complete PK is not present in GROUP BY
--Testcase 90:
explain (costs off) select a,c from agg_t1 group by a,c,d;
-- Test removal across multiple relations
--Testcase 91:
explain (costs off) select *
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.y,agg_t2.z;
-- Test case where agg_t1 can be optimized but not agg_t2
--Testcase 92:
explain (costs off) select agg_t1.*,agg_t2.x,agg_t2.z
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.z;
-- Cannot optimize when PK is deferrable
--Testcase 422:
explain (costs off) select * from agg_t9 group by a,b,c;
--Testcase 423:
create temp table t1c () inherits (agg_t1);
-- Ensure we don't remove any columns when t1 has a child table
--Testcase 424:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- Okay to remove columns if we're only querying the parent.
--Testcase 425:
explain (costs off) select * from only agg_t1 group by a,b,c,d;
-- Skip this test, sqlite_fdw does not support partition table
--create foreign table p_t1 (
-- a int options (key 'true'),
-- b int options (key 'true'),
-- c int,
-- d int,
--) partition by list(a) server sqlite_svr;
--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
--
--Testcase 426:
create foreign table t1(f1 int, f2 int) server sqlite_svr;
--Testcase 427:
create foreign table t2(f1 bigint, f2 oid) server sqlite_svr;
--Testcase 428:
select f1 from t1 left join t2 using (f1) group by f1;
--Testcase 429:
select f1 from t1 left join t2 using (f1) group by t1.f1;
--Testcase 430:
select t1.f1 from t1 left join t2 using (f1) group by t1.f1;
-- only this one should fail:
--Testcase 431:
select t1.f1 from t1 left join t2 using (f1) group by f1;
-- check case where we have to inject nullingrels into coerced join alias
select f1, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f1)) on (x0 = 0)
group by f1;
-- same, for a RelabelType coercion
select f2, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f2)) on (x0 = 0)
group by f2;
--Testcase 432:
drop foreign table t1, t2;
--
-- Test planner's selection of pathkeys for ORDER BY aggregates
--
-- Ensure we order by four. This suits the most aggregate functions.
explain (costs off)
select sum(two order by two),max(four order by four), min(four order by four)
from tenk1;
-- Ensure we order by two. It's a tie between ordering by two and four but
-- we tiebreak on the aggregate's position.
explain (costs off)
select
sum(two order by two), max(four order by four),
min(four order by four), max(two order by two)
from tenk1;
-- Similar to above, but tiebreak on ordering by four
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two)
from tenk1;
-- Ensure this one orders by ten since there are 3 aggregates that require ten
-- vs two that suit two and four.
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two),
sum(ten order by ten), min(ten order by ten), max(ten order by ten)
from tenk1;
-- Try a case involving a GROUP BY clause where the GROUP BY column is also
-- part of an aggregate's ORDER BY clause. We want a sort order that works
-- for the GROUP BY along with the first and the last aggregate.
explain (costs off)
select
sum(unique1 order by ten, two), sum(unique1 order by four),
sum(unique1 order by two, four)
from tenk1
group by ten;
-- Ensure that we never choose to provide presorted input to an Aggref with
-- a volatile function in the ORDER BY / DISTINCT clause. We want to ensure
-- these sorts are performed individually rather than at the query level.
explain (costs off)
select
sum(unique1 order by two), sum(unique1 order by four),
sum(unique1 order by four, two), sum(unique1 order by two, random()),
sum(unique1 order by two, random(), random() + 1)
from tenk1
group by ten;
-- Ensure consecutive NULLs are properly treated as distinct from each other
select array_agg(distinct val)
from (select null as val from generate_series(1, 2)) g;
-- Ensure no ordering is requested when enable_presorted_aggregate is off
set enable_presorted_aggregate to off;
explain (costs off)
select sum(two order by two) from tenk1;
reset enable_presorted_aggregate;
--
-- Test combinations of DISTINCT and/or ORDER BY
--
begin;
--Testcase 93:
delete from INT8_TBL;
--Testcase 94:
insert into INT8_TBL values (1,4),(2,3),(3,1),(4,2);
--Testcase 95:
select array_agg(q1 order by q2)
from INT8_TBL;
--Testcase 96:
select array_agg(q1 order by q1)
from INT8_TBL;
--Testcase 97:
select array_agg(q1 order by q1 desc)
from INT8_TBL;
--Testcase 98:
select array_agg(q2 order by q1 desc)
from INT8_TBL;
--Testcase 99:
delete from INT4_TBL;
--Testcase 100:
insert into INT4_TBL values (1),(2),(1),(3),(null),(2);
--Testcase 101:
select array_agg(distinct f1)
from INT4_TBL;
--Testcase 102:
select array_agg(distinct f1 order by f1)
from INT4_TBL;
--Testcase 103:
select array_agg(distinct f1 order by f1 desc)
from INT4_TBL;
--Testcase 104:
select array_agg(distinct f1 order by f1 desc nulls last)
from INT4_TBL;
rollback;
-- multi-arg aggs, strict/nonstrict, distinct/order by
--Testcase 433:
create type aggtype as (a integer, b integer, c text);
--Testcase 434:
create function aggf_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql strict immutable;
--Testcase 435:
create function aggfns_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql immutable;
--Testcase 436:
create aggregate aggfstr(integer,integer,text) (
sfunc = aggf_trans, stype = aggtype[],
initcond = '{}'
);
--Testcase 437:
create aggregate aggfns(integer,integer,text) (
sfunc = aggfns_trans, stype = aggtype[], sspace = 10000,
initcond = '{}'
);
begin;
--Testcase 105:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 106:
select aggfstr(a,b,c) from multi_arg_agg;
--Testcase 107:
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 108:
select aggfstr(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 109:
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 110:
select aggfstr(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 111:
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
-- test specific code paths
--Testcase 112:
select aggfns(distinct a,a,c order by c using ~<~,a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 113:
select aggfns(distinct a,a,c order by c using ~<~) from multi_arg_agg, generate_series(1,2) i;
--Testcase 114:
select aggfns(distinct a,a,c order by a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 115:
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
-- check node I/O via view creation and usage, also deparsing logic
--Testcase 438:
create view agg_view1 as
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 116:
select * from agg_view1;
--Testcase 117:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 439:
create or replace view agg_view1 as
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 118:
select * from agg_view1;
--Testcase 119:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 440:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 120:
select * from agg_view1;
--Testcase 121:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 441:
create or replace view agg_view1 as
select aggfns(a,b,c order by b+1) from multi_arg_agg;
--Testcase 122:
select * from agg_view1;
--Testcase 123:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 442:
create or replace view agg_view1 as
select aggfns(a,a,c order by b) from multi_arg_agg;
--Testcase 124:
select * from agg_view1;
--Testcase 125:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 443:
create or replace view agg_view1 as
select aggfns(a,b,c order by c using ~<~) from multi_arg_agg;
--Testcase 126:
select * from agg_view1;
--Testcase 127:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 444:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
--Testcase 128:
select * from agg_view1;
--Testcase 129:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 445:
drop view agg_view1;
rollback;
-- incorrect DISTINCT usage errors
--Testcase 130:
insert into multi_arg_agg values (1,1,'foo');
--Testcase 131:
select aggfns(distinct a,b,c order by i) from multi_arg_agg, generate_series(1,2) i;
--Testcase 132:
select aggfns(distinct a,b,c order by a,b+1) from multi_arg_agg, generate_series(1,2) i;
--Testcase 133:
select aggfns(distinct a,b,c order by a,b,i,c) from multi_arg_agg, generate_series(1,2) i;
--Testcase 134:
select aggfns(distinct a,a,c order by a,b) from multi_arg_agg, generate_series(1,2) i;
-- string_agg tests
begin;
--Testcase 135:
delete from varchar_tbl;
--Testcase 136:
insert into varchar_tbl values ('aaaa'),('bbbb'),('cccc');
--Testcase 137:
select string_agg(f1,',') from varchar_tbl;
--Testcase 138:
delete from varchar_tbl;
--Testcase 139:
insert into varchar_tbl values ('aaaa'),(null),('bbbb'),('cccc');
--Testcase 140:
select string_agg(f1,',') from varchar_tbl;
--Testcase 141:
delete from varchar_tbl;
--Testcase 142:
insert into varchar_tbl values (null),(null),('bbbb'),('cccc');
--Testcase 143:
select string_agg(f1,'AB') from varchar_tbl;
--Testcase 144:
delete from varchar_tbl;
--Testcase 145:
insert into varchar_tbl values (null),(null);
--Testcase 146:
select string_agg(f1,',') from varchar_tbl;
rollback;
-- check some implicit casting cases, as per bug #5564
--Testcase 147:
select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok
--Testcase 148:
select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok
--Testcase 149:
select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok
--Testcase 150:
select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok
-- string_agg bytea tests
--Testcase 446:
create foreign table bytea_test_table(v bytea) server sqlite_svr;
--Testcase 151:
select string_agg(v, '') from bytea_test_table;
--Testcase 152:
insert into bytea_test_table values(decode('ff','hex'));
--Testcase 153:
select string_agg(v, '') from bytea_test_table;
--Testcase 154:
insert into bytea_test_table values(decode('aa','hex'));
--Testcase 155:
select string_agg(v, '') from bytea_test_table;
--Testcase 156:
select string_agg(v, NULL) from bytea_test_table;
--Testcase 157:
select string_agg(v, decode('ee', 'hex')) from bytea_test_table;
--Testcase 447:
drop foreign table bytea_test_table;
-- Test parallel string_agg and array_agg
create foreign table pagg_test (x int, y int) server sqlite_svr;
insert into pagg_test
select (case x % 4 when 1 then null else x end), x % 10
from generate_series(1,5000) x;
set parallel_setup_cost TO 0;
set parallel_tuple_cost TO 0;
set parallel_leader_participation TO 0;
set min_parallel_table_scan_size = 0;
set bytea_output = 'escape';
set max_parallel_workers_per_gather = 2;
-- create a view as we otherwise have to repeat this query a few times.
create view v_pagg_test AS
select
y,
min(t) AS tmin,max(t) AS tmax,count(distinct t) AS tndistinct,
min(b) AS bmin,max(b) AS bmax,count(distinct b) AS bndistinct,
min(a) AS amin,max(a) AS amax,count(distinct a) AS andistinct,
min(aa) AS aamin,max(aa) AS aamax,count(distinct aa) AS aandistinct
from (
select
y,
unnest(regexp_split_to_array(a1.t, ','))::int AS t,
unnest(regexp_split_to_array(a1.b::text, ',')) AS b,
unnest(a1.a) AS a,
unnest(a1.aa) AS aa
from (
select
y,
string_agg(x::text, ',') AS t,
string_agg(x::text::bytea, ',') AS b,
array_agg(x) AS a,
array_agg(ARRAY[x]) AS aa
from pagg_test
group by y
) a1
) a2
group by y;
-- Ensure results are correct.
select * from v_pagg_test order by y;
-- Ensure parallel aggregation is actually being used.
explain (costs off) select * from v_pagg_test order by y;
set max_parallel_workers_per_gather = 0;
-- Ensure results are the same without parallel aggregation.
select * from v_pagg_test order by y;
-- Clean up
reset max_parallel_workers_per_gather;
reset bytea_output;
reset min_parallel_table_scan_size;
reset parallel_leader_participation;
reset parallel_tuple_cost;
reset parallel_setup_cost;
drop view v_pagg_test;
drop foreign table pagg_test;
-- FILTER tests
--Testcase 158:
select min(unique1) filter (where unique1 > 100) from tenk1;
--Testcase 159:
select sum(1/ten) filter (where ten > 0) from tenk1;
--Testcase 160:
select ten, sum(distinct four) filter (where four::text ~ '123') from onek a
group by ten;
--Testcase 161:
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);
--Testcase 448:
create foreign table agg_t17(foo text, bar text) server sqlite_svr;
--Testcase 449:
insert into agg_t17 values ('a', 'b');
--Testcase 450:
select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0')
from agg_t17;
create foreign table agg_t170(v int) server sqlite_svr;
insert into agg_t170(v) values (1), (2), (3);
select any_value(v) filter (where v > 2) from agg_t170;
-- outer reference in FILTER (PostgreSQL extension)
--Testcase 451:
create foreign table agg_t18 (inner_c int) server sqlite_svr;
--Testcase 452:
create foreign table agg_t19 (outer_c int) server sqlite_svr;
--Testcase 453:
insert into agg_t18 values (1);
--Testcase 454:
insert into agg_t19 values (2), (3);
--Testcase 455:
select (select count(*)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 456:
select (select count(*) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- outer query is aggregation query
--Testcase 457:
select (select count(inner_c) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 162:
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)
--Testcase 163:
select sum(unique1) FILTER (WHERE
unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1;
-- exercise lots of aggregate parts with FILTER
begin;
--Testcase 164:
delete from multi_arg_agg;
--Testcase 165:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 166:
select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) from multi_arg_agg, generate_series(1,2) i;
rollback;
-- check handling of bare boolean Var in FILTER
--Testcase 672:
select max(0) filter (where b1) from bool_test;
--Testcase 673:
select (select max(0) filter (where b1)) from bool_test;
-- check for correct detection of nested-aggregate errors in FILTER
--Testcase 674:
select max(unique1) filter (where sum(ten) > 0) from tenk1;
--Testcase 675:
select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1;
--Testcase 676:
select max(unique1) filter (where bool_or(ten > 0)) from tenk1;
--Testcase 677:
select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1;
-- ordered-set aggregates
begin;
--Testcase 167:
delete from FLOAT8_TBL;
--Testcase 168:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 169:
select f1, percentile_cont(f1) within group (order by x::float8)
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 170:
delete from FLOAT8_TBL;
--Testcase 171:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 172:
select f1, percentile_cont(f1 order by f1) within group (order by x) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 173:
delete from FLOAT8_TBL;
--Testcase 174:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 175:
select f1, sum() within group (order by x::float8) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 176:
delete from FLOAT8_TBL;
--Testcase 177:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 178:
select f1, percentile_cont(f1,f1) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
--Testcase 179:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 618:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10) from aggtest;
--Testcase 180:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 619:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10), sum(b)::numeric(10,3) from aggtest;
--Testcase 181:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 620:
select percentile_cont(0.5) within group (order by thousand) from tenk1;
--Testcase 182:
select percentile_disc(0.5) within group (order by thousand) from tenk1;
begin;
--Testcase 183:
delete from INT4_TBL;
--Testcase 184:
insert into INT4_TBL values (1),(1),(2),(2),(3),(3),(4);
--Testcase 185:
select rank(3) within group (order by f1) from INT4_TBL;
--Testcase 186:
select cume_dist(3) within group (order by f1) from INT4_TBL;
--Testcase 187:
insert into INT4_TBL values (5);
--Testcase 458:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 621:
select (percent_rank(3) within group (order by f1))::numeric(20,10) from INT4_TBL;
--Testcase 459:
delete from INT4_TBL where f1 = 5;
--Testcase 188:
select dense_rank(3) within group (order by f1) from INT4_TBL;
rollback;
--Testcase 189:
select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand)
from tenk1;
--Testcase 190:
select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand)
from tenk1;
--Testcase 191:
select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand)
from tenk1;
--Testcase 460:
create foreign table agg_t21 (x int) server sqlite_svr;
begin;
--Testcase 248:
insert into agg_t21 select * from generate_series(1,6);
--Testcase 249:
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 agg_t21;
rollback;
--Testcase 192:
select ten, mode() within group (order by string4) from tenk1 group by ten;
--Testcase 461:
create foreign table agg_t20 (x text) server sqlite_svr;
begin;
--Testcase 462:
insert into agg_t20 values (unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]));
--Testcase 463:
select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) from agg_t20;
rollback;
-- check collation propagates up in suitable cases:
begin;
--Testcase 464:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 465:
select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) from agg_t20;
rollback;
-- ordered-set aggs created with CREATE AGGREGATE
--Testcase 466:
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
);
--Testcase 467:
create aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") (
stype = internal,
sfunc = ordered_set_transition_multi,
finalfunc = rank_final,
finalfunc_extra = true,
hypothetical
);
--Testcase 633:
alter aggregate my_percentile_disc(float8 ORDER BY anyelement)
rename to test_percentile_disc;
--Testcase 634:
alter aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any")
rename to test_rank;
begin;
--Testcase 468:
insert into agg_t21 values (1),(1),(2),(2),(3),(3),(4);
--Testcase 469:
select test_rank(3) within group (order by x) from agg_t21;
rollback;
--Testcase 193:
select test_percentile_disc(0.5) within group (order by thousand) from tenk1;
-- ordered-set aggs can't use ungrouped vars in direct args:
begin;
--Testcase 470:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 471:
select rank(x) within group (order by x) from agg_t21;
rollback;
-- outer-level agg can't use a grouped arg of a lower level, either:
begin;
--Testcase 472:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 473:
select array(select percentile_disc(a) within group (order by x)
from (values (0.3),(0.7)) v(a) group by a)
from agg_t21;
rollback;
-- agg in the direct args is a grouping violation, too:
begin;
--Testcase 474:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 475:
select rank(sum(x)) within group (order by x) from agg_t21;
rollback;
-- hypothetical-set type unification and argument-count failures:
begin;
--Testcase 264:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 265:
select rank(3) within group (order by x) from agg_t20;
rollback;
--Testcase 194:
select rank(3) within group (order by stringu1,stringu2) from tenk1;
begin;
--Testcase 476:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 477:
select rank('fred') within group (order by x) from agg_t21;
rollback;
begin;
--Testcase 478:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 479:
select rank('adam'::text collate "C") within group (order by x collate "POSIX")
from agg_t20;
rollback;
-- hypothetical-set type unification successes:
begin;
--Testcase 480:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 481:
select rank('adam'::varchar) within group (order by x) from agg_t20;
rollback;
begin;
--Testcase 482:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 483:
select rank('3') within group (order by x) from agg_t21;
rollback;
-- divide by zero check
begin;
--Testcase 484:
insert into agg_t21 select * from generate_series(1,0);
--Testcase 485:
select percent_rank(0) within group (order by x) from agg_t21;
rollback;
-- deparse and multiple features:
--Testcase 486:
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;
--Testcase 196:
select pg_get_viewdef('aggordview1');
--Testcase 197:
select * from aggordview1 order by ten;
--Testcase 487:
drop view aggordview1;
-- variadic aggregates
--Testcase 488:
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)';
--Testcase 489:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
--Testcase 490:
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)';
--Testcase 491:
create aggregate cleast_agg(variadic items anycompatiblearray) (
stype = anycompatible, sfunc = cleast_accum);
--Testcase 198:
select least_agg(q1,q2) from int8_tbl;
--Testcase 199:
select least_agg(variadic array[q1,q2]) from int8_tbl;
--Testcase 492:
select cleast_agg(q1,q2) from int8_tbl;
--Testcase 493:
select cleast_agg(4.5,f1) from int4_tbl;
--Testcase 494:
select cleast_agg(variadic array[4.5,f1]) from int4_tbl;
--Testcase 495:
select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl;
-- test aggregates with common transition functions share the same states
--Testcase 496:
create foreign table agg_t10(one int, id int options (key 'true')) server sqlite_svr;
--Testcase 497:
create foreign table agg_t11(one int, two int, id int options (key 'true')) server sqlite_svr;
--Testcase 498:
create foreign table agg_t12(a int, id int options (key 'true')) server sqlite_svr;
begin work;
--Testcase 499:
create type avg_state as (total bigint, count bigint);
--Testcase 500:
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;
--Testcase 501:
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;
--Testcase 502:
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;
--Testcase 503:
create aggregate my_avg(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn
);
--Testcase 504:
create aggregate my_sum(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn
);
-- aggregate state should be shared as aggs are the same.
--Testcase 505:
delete from agg_t10;
--Testcase 506:
insert into agg_t10 values (1), (3);
--Testcase 507:
select my_avg(one),my_avg(one) from agg_t10;
-- aggregate state should be shared as transfn is the same for both aggs.
--Testcase 508:
select my_avg(one),my_sum(one) from agg_t10;
-- same as previous one, but with DISTINCT, which requires sorting the input.
--Testcase 509:
delete from agg_t10;
--Testcase 510:
insert into agg_t10 values (1), (3), (1);
--Testcase 511:
select my_avg(distinct one),my_sum(distinct one) from agg_t10;
-- shouldn't share states due to the distinctness not matching.
--Testcase 512:
delete from agg_t10;
--Testcase 513:
insert into agg_t10 values (1), (3);
--Testcase 514:
select my_avg(distinct one),my_sum(one) from agg_t10;
-- shouldn't share states due to the filter clause not matching.
--Testcase 515:
select my_avg(one) filter (where one > 1),my_sum(one) from agg_t10;
-- this should not share the state due to different input columns.
--Testcase 516:
delete from agg_t11;
--Testcase 517:
insert into agg_t11 values (1,2),(3,4);
--Testcase 518:
select my_avg(one),my_sum(two) from agg_t11;
-- exercise cases where OSAs share state
--Testcase 519:
delete from agg_t12;
--Testcase 520:
insert into agg_t12 values (1), (3), (5), (7);
--Testcase 521:
select
percentile_cont(0.5) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
--Testcase 522:
select
percentile_cont(0.25) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
-- these can't share state currently
--Testcase 523:
select
rank(4) within group (order by a),
dense_rank(4) within group (order by a)
from agg_t12;
-- test that aggs with the same sfunc and initcond share the same agg state
--Testcase 524:
create aggregate my_sum_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn,
initcond = '(10,0)'
);
--Testcase 525:
create aggregate my_avg_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn,
initcond = '(10,0)'
);
--Testcase 526:
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
--Testcase 527:
delete from agg_t10;
--Testcase 528:
insert into agg_t10 values (1), (3);
--Testcase 529:
select my_sum_init(one),my_avg_init(one) from agg_t10;
-- Varying INITCONDs should cause the states not to be shared.
--Testcase 530:
select my_sum_init(one),my_avg_init2(one) from agg_t10;
rollback;
-- test aggregate state sharing to ensure it works if one aggregate has a
-- finalfn and the other one has none.
begin work;
--Testcase 531:
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;
--Testcase 532:
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;
--Testcase 533:
create aggregate my_sum(int4)
(
stype = int4,
sfunc = sum_transfn
);
--Testcase 534:
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
--Testcase 535:
delete from agg_t10;
--Testcase 536:
insert into agg_t10 values (1), (2), (3), (4);
--Testcase 537:
select my_sum(one),my_half_sum(one) from agg_t10;
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;
--Testcase 538:
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$$;
--Testcase 539:
CREATE AGGREGATE balk(int4)
(
SFUNC = balkifnull(int8, int4),
STYPE = int8,
PARALLEL = SAFE,
INITCOND = '0'
);
--Testcase 200:
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;
--Testcase 540:
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$$;
--Testcase 541:
CREATE AGGREGATE balk(int4)
(
SFUNC = int4_sum(int8, int4),
STYPE = int8,
COMBINEFUNC = balkifnull(int8, int8),
PARALLEL = SAFE,
INITCOND = '0'
);
-- force use of parallelism
-- Skip this test, cannot alter foreign table tenk1
-- ALTER FOREIGN 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 multiple usage of an aggregate whose finalfn returns a R/W datum
BEGIN;
CREATE FUNCTION rwagg_sfunc(x anyarray, y anyarray) RETURNS anyarray
LANGUAGE plpgsql IMMUTABLE AS $$
BEGIN
RETURN array_fill(y[1], ARRAY[4]);
END;
$$;
CREATE FUNCTION rwagg_finalfunc(x anyarray) RETURNS anyarray
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
DECLARE
res x%TYPE;
BEGIN
-- assignment is essential for this test, it expands the array to R/W
res := array_fill(x[1], ARRAY[4]);
RETURN res;
END;
$$;
CREATE AGGREGATE rwagg(anyarray) (
STYPE = anyarray,
SFUNC = rwagg_sfunc,
FINALFUNC = rwagg_finalfunc
);
CREATE FUNCTION eatarray(x real[]) RETURNS real[]
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
BEGIN
x[1] := x[1] + 1;
RETURN x;
END;
$$;
CREATE FOREIGN TABLE float_tb(f real) SERVER sqlite_svr;
INSERT INTO float_tb(f) VALUES (1.0);
SELECT eatarray(rwagg(ARRAY[f::real])), eatarray(rwagg(ARRAY[f::real])) FROM float_tb;
ROLLBACK;
-- test coverage for aggregate combine/serial/deserial functions
BEGIN;
--Testcase 635:
SET parallel_setup_cost = 0;
--Testcase 636:
SET parallel_tuple_cost = 0;
--Testcase 637:
SET min_parallel_table_scan_size = 0;
--Testcase 638:
SET max_parallel_workers_per_gather = 4;
--Testcase 639:
SET parallel_leader_participation = off;
--Testcase 640:
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
--Testcase 542:
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;
--Testcase 543:
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
--Testcase 544:
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;
--Testcase 545:
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
--Testcase 546:
create foreign table agg_t13(x int, id int options (key 'true')) server sqlite_svr;
--Testcase 547:
insert into agg_t13 values (1),(1),(2),(2),(3),(3);
--Testcase 548:
SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM agg_t13 GROUP BY (x) ORDER BY 1;
--Testcase 549:
delete from agg_t13;
-- 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
--Testcase 550:
create foreign table agg_t14(x int, y int, id int options (key 'true')) server sqlite_svr;
--Testcase 551:
insert into agg_t14 values (1, NULL), (1, 2);
--Testcase 552:
SELECT min(x ORDER BY y) FROM agg_t14;
--Testcase 553:
SELECT min(x ORDER BY y) FROM agg_t14;
-- check collation-sensitive matching between grouping expressions
begin;
--Testcase 554:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 555:
select x||'a', case x||'a' when 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
begin;
--Testcase 556:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 557:
select x||'a', case when x||'a' = 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
-- 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
--Testcase 641:
set enable_memoize to off;
--Testcase 558:
explain (costs off)
select 1 from tenk1
where (hundred, thousand) in (select twothousand, twothousand from onek);
--Testcase 642:
reset enable_memoize;
--
-- Hash Aggregation Spill tests
--
--Testcase 643:
set enable_sort=false;
--Testcase 644:
set work_mem='64kB';
--Testcase 559:
select unique1, count(*), sum(twothousand) from tenk1
group by unique1
having sum(fivethous) > 4975
order by sum(twothousand);
--Testcase 645:
set work_mem to default;
--Testcase 646:
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.
--
--Testcase 647:
set work_mem='64kB';
--Testcase 560:
create foreign table agg_data_2k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 561:
create foreign table agg_data_20k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 562:
create foreign table agg_group_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 563:
create foreign table agg_group_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 564:
create foreign table agg_group_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 565:
create foreign table agg_group_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 566:
create foreign table agg_hash_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 567:
create foreign table agg_hash_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 568:
create foreign table agg_hash_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 569:
create foreign table agg_hash_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 570:
insert into agg_data_2k select g from generate_series(0, 1999) g;
--analyze agg_data_2k;
--Testcase 571:
insert into agg_data_20k select g from generate_series(0, 19999) g;
--analyze agg_data_20k;
-- Produce results with sorting.
--Testcase 648:
set enable_hashagg = false;
--Testcase 649:
set jit_above_cost = 0;
--Testcase 572:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 573:
insert into agg_group_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 574:
insert into agg_group_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 650:
set jit_above_cost to default;
--Testcase 575:
insert into agg_group_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 576:
insert into agg_group_4
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
--Testcase 651:
set enable_hashagg = true;
--Testcase 652:
set enable_sort = false;
--Testcase 653:
set jit_above_cost = 0;
--Testcase 577:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 578:
insert into agg_hash_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 579:
insert into agg_hash_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 654:
set jit_above_cost to default;
--Testcase 580:
insert into agg_hash_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 581:
insert into agg_hash_4
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 655:
set enable_sort = true;
--Testcase 656:
set work_mem to default;
-- Compare group aggregation results to hash aggregation results
--Testcase 582:
(select * from agg_hash_1 except select * from agg_group_1)
union all
(select * from agg_group_1 except select * from agg_hash_1);
--Testcase 583:
(select * from agg_hash_2 except select * from agg_group_2)
union all
(select * from agg_group_2 except select * from agg_hash_2);
--Testcase 584:
(select * from agg_hash_3 except select * from agg_group_3)
union all
(select * from agg_group_3 except select * from agg_hash_3);
--Testcase 585:
(select * from agg_hash_4 except select * from agg_group_4)
union all
(select * from agg_group_4 except select * from agg_hash_4);
--Testcase 622:
DELETE FROM INT4_TBL;
--Testcase 623:
DELETE FROM INT8_TBL;
--Testcase 624:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 586:
DROP SERVER sqlite_svr CASCADE;
--Testcase 587:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/encodings.sql
================================================
-- tests for PR #76 github
-- see https://www.postgresql.org/docs/current/multibyte.html
-- EUC_CN, not tested
-- EUC_JP
-- EUC_JIS_2004, not tested
-- EUC_KR
-- EUC_TW, not tested
-- ISO_8859_5
-- ISO_8859_6
-- ISO_8859_7
-- ISO_8859_8
-- KOI8R, not tested
-- KOI8U, not tested
-- LATIN1
-- LATIN2
-- LATIN3
-- LATIN4
-- LATIN5
-- LATIN6
-- LATIN7
-- LATIN8
-- LATIN9
-- LATIN10
-- MULE_INTERNAL, not tested
-- SQL_ASCII
-- WIN866, not tested
-- WIN874, not tested
-- WIN1250
-- WIN1251
-- WIN1252
-- WIN1253
-- WIN1254
-- WIN1255
-- WIN1256
-- WIN1257
-- WIN1258, not tested
-- ================
-- check all data in UTF8
-- ================
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
SELECT * FROM "Unicode data";
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
-- euc_jp
CREATE DATABASE "contrib_regression_EUC_JP" ENCODING EUC_JP LC_CTYPE='ja_JP.eucjp' LC_COLLATE='ja_JP.eucjp' template template0;
\connect "contrib_regression_EUC_JP"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_JP";
-- ko_KR.euckr
CREATE DATABASE "contrib_regression_EUC_KR" ENCODING EUC_KR LC_CTYPE='ko_KR.euckr' LC_COLLATE='ko_KR.euckr' template template0;
\connect "contrib_regression_EUC_KR"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_KR";
-- ISO_8859_5
CREATE DATABASE "contrib_regression_ISO_8859_5" ENCODING ISO_8859_5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_5";
-- ISO_8859_6
CREATE DATABASE "contrib_regression_ISO_8859_6" ENCODING ISO_8859_6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_6";
-- ISO_8859_7
CREATE DATABASE "contrib_regression_ISO_8859_7" ENCODING ISO_8859_7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_7";
-- ISO_8859_8
CREATE DATABASE "contrib_regression_ISO_8859_8" ENCODING ISO_8859_8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_8";
-- ISO_8859_9
CREATE DATABASE "contrib_regression_ISO_8859_9" ENCODING ISO_8859_9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_9";
-- LATIN1
CREATE DATABASE "contrib_regression_LATIN1" ENCODING LATIN1 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN1"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN1";
-- LATIN2
CREATE DATABASE "contrib_regression_LATIN2" ENCODING LATIN2 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN2"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN2";
-- LATIN3
CREATE DATABASE "contrib_regression_LATIN3" ENCODING LATIN3 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN3"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN3";
-- LATIN4
CREATE DATABASE "contrib_regression_LATIN4" ENCODING LATIN4 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN4"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN4";
-- LATIN5
CREATE DATABASE "contrib_regression_LATIN5" ENCODING LATIN5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN5";
-- LATIN6
CREATE DATABASE "contrib_regression_LATIN6" ENCODING LATIN6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN6";
-- LATIN7
CREATE DATABASE "contrib_regression_LATIN7" ENCODING LATIN7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN7";
-- LATIN8
CREATE DATABASE "contrib_regression_LATIN8" ENCODING LATIN8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN8";
-- LATIN9
CREATE DATABASE "contrib_regression_LATIN9" ENCODING LATIN9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN9";
-- LATIN10
CREATE DATABASE "contrib_regression_LATIN10" ENCODING LATIN10 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN10"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN10";
-- cp1250
CREATE DATABASE "contrib_regression_WIN1250" ENCODING WIN1250 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1250"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1250";
-- cp1251
CREATE DATABASE "contrib_regression_WIN1251" ENCODING WIN1251 LC_CTYPE='bg_BG' LC_COLLATE='bg_BG' template template0;
\connect "contrib_regression_WIN1251"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1251";
-- cp1252
CREATE DATABASE "contrib_regression_WIN1252" ENCODING WIN1252 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1252"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1252";
-- cp1253
CREATE DATABASE "contrib_regression_WIN1253" ENCODING WIN1253 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1253"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1253";
-- cp1254
CREATE DATABASE "contrib_regression_WIN1254" ENCODING WIN1254 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1254"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1254";
-- cp1255
CREATE DATABASE "contrib_regression_WIN1255" ENCODING WIN1255 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1255"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1255";
-- cp1256
CREATE DATABASE "contrib_regression_WIN1256" ENCODING WIN1256 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1256"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1256";
-- cp1257
CREATE DATABASE "contrib_regression_WIN1257" ENCODING WIN1257 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1257"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1257";
-- SQL_ASCII
CREATE DATABASE "contrib_regression_SQL_ASCII" ENCODING SQL_ASCII LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_SQL_ASCII"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_SQL_ASCII";
================================================
FILE: sql/13.15/extra/insert.sql
================================================
--
-- insert with DEFAULT in the target_list
--
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 18:
CREATE FOREIGN TABLE inserttest01 (col1 int4, col2 int4 NOT NULL, col3 text default 'testing') SERVER sqlite_svr;
--Testcase 1:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT);
--Testcase 2:
insert into inserttest01 (col2, col3) values (3, DEFAULT);
--Testcase 3:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, 5, DEFAULT);
--Testcase 4:
insert into inserttest01 values (DEFAULT, 5, 'test');
--Testcase 5:
insert into inserttest01 values (DEFAULT, 7);
--Testcase 6:
select * from inserttest01;
--
-- insert with similar expression / target_list values (all fail)
--
--Testcase 7:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT);
--Testcase 8:
insert into inserttest01 (col1, col2, col3) values (1, 2);
--Testcase 9:
insert into inserttest01 (col1) values (1, 2);
--Testcase 10:
insert into inserttest01 (col1) values (DEFAULT, DEFAULT);
--Testcase 11:
select * from inserttest01;
--
-- VALUES test
--
--Testcase 12:
insert into inserttest01 values(10, 20, '40'), (-1, 2, DEFAULT),
((select 2), (select i from (values(3)) as foo (i)), 'values are fun!');
--Testcase 13:
select * from inserttest01;
--
-- TOASTed value test
--
--Testcase 14:
insert into inserttest01 values(30, 50, repeat('x', 10000));
--Testcase 15:
select col1, col2, char_length(col3) from inserttest01;
-- skip, sqlite fdw does not support customized type
/*
-- 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 (this checks
-- that estate->es_result_relation_info is appropriately set/reset for each
-- routed tuple)
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;
*/
-- drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 19:
DROP SERVER sqlite_svr;
--Testcase 20:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/join.sql
================================================
--
-- JOIN
-- Test JOIN clauses
--
--Testcase 360:
CREATE EXTENSION sqlite_fdw;
--Testcase 361:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 362:
CREATE FOREIGN TABLE J1_TBL (
i integer,
j integer,
t text
) SERVER sqlite_svr;
--Testcase 363:
CREATE FOREIGN TABLE J2_TBL (
i integer,
k integer
) SERVER sqlite_svr;
--Testcase 364:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 365:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 366:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 489:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 490:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 491:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 492:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 493:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 367:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 494:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 495:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 496:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 497:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 498:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
--Testcase 368:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 499:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 500:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 501:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 502:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 503:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 369:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO J1_TBL VALUES (1, 4, 'one');
--Testcase 2:
INSERT INTO J1_TBL VALUES (2, 3, 'two');
--Testcase 3:
INSERT INTO J1_TBL VALUES (3, 2, 'three');
--Testcase 4:
INSERT INTO J1_TBL VALUES (4, 1, 'four');
--Testcase 5:
INSERT INTO J1_TBL VALUES (5, 0, 'five');
--Testcase 6:
INSERT INTO J1_TBL VALUES (6, 6, 'six');
--Testcase 7:
INSERT INTO J1_TBL VALUES (7, 7, 'seven');
--Testcase 8:
INSERT INTO J1_TBL VALUES (8, 8, 'eight');
--Testcase 9:
INSERT INTO J1_TBL VALUES (0, NULL, 'zero');
--Testcase 10:
INSERT INTO J1_TBL VALUES (NULL, NULL, 'null');
--Testcase 11:
INSERT INTO J1_TBL VALUES (NULL, 0, 'zero');
--Testcase 12:
INSERT INTO J2_TBL VALUES (1, -1);
--Testcase 13:
INSERT INTO J2_TBL VALUES (2, 2);
--Testcase 14:
INSERT INTO J2_TBL VALUES (3, -3);
--Testcase 15:
INSERT INTO J2_TBL VALUES (2, 4);
--Testcase 16:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 17:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 18:
INSERT INTO J2_TBL VALUES (0, NULL);
--Testcase 19:
INSERT INTO J2_TBL VALUES (NULL, NULL);
--Testcase 20:
INSERT INTO J2_TBL VALUES (NULL, 0);
-- useful in some tests below
--Testcase 370:
create temp table onerow();
--Testcase 371:
insert into onerow default values;
analyze onerow;
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
--Testcase 21:
SELECT '' AS "xxx", *
FROM J1_TBL AS tx;
--Testcase 22:
SELECT '' AS "xxx", *
FROM J1_TBL tx;
--Testcase 23:
SELECT '' AS "xxx", *
FROM J1_TBL AS t1 (a, b, c);
--Testcase 24:
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c);
--Testcase 25:
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
--Testcase 26:
SELECT '' AS "xxx", 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.
--
--Testcase 27:
SELECT '' AS "xxx", *
FROM J1_TBL CROSS JOIN J2_TBL;
-- ambiguous column
--Testcase 28:
SELECT '' AS "xxx", i, k, t
FROM J1_TBL CROSS JOIN J2_TBL;
-- resolve previous ambiguity by specifying the table name
--Testcase 29:
SELECT '' AS "xxx", t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
--Testcase 30:
SELECT '' AS "xxx", ii, tt, kk
FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
--Testcase 31:
SELECT '' AS "xxx", 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);
--Testcase 32:
SELECT '' AS "xxx", *
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
--Testcase 33:
SELECT '' AS "xxx", *
FROM J1_TBL INNER JOIN J2_TBL USING (i);
-- Same as above, slightly different syntax
--Testcase 34:
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL USING (i);
--Testcase 35:
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a)
ORDER BY a, d;
--Testcase 36:
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b)
ORDER BY b, t1.a;
--
-- NATURAL JOIN
-- Inner equi-join on all columns with the same name
--
--Testcase 37:
SELECT '' AS "xxx", *
FROM J1_TBL NATURAL JOIN J2_TBL;
--Testcase 38:
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
--Testcase 39:
SELECT '' AS "xxx", *
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
--Testcase 40:
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
--
-- Inner joins (equi-joins)
--
--Testcase 41:
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
--Testcase 42:
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
--
-- Non-equi-joins
--
--Testcase 43:
SELECT '' AS "xxx", *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
--
-- Outer joins
-- Note that OUTER is a noise word
--
--Testcase 44:
SELECT '' AS "xxx", *
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 45:
SELECT '' AS "xxx", *
FROM J1_TBL LEFT JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 46:
SELECT '' AS "xxx", *
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
--Testcase 47:
SELECT '' AS "xxx", *
FROM J1_TBL RIGHT JOIN J2_TBL USING (i);
--Testcase 48:
SELECT '' AS "xxx", *
FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 49:
SELECT '' AS "xxx", *
FROM J1_TBL FULL JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 50:
SELECT '' AS "xxx", *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1);
--Testcase 51:
SELECT '' AS "xxx", *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1);
--
-- semijoin selectivity for <>
--
--Testcase 52:
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
--
--Testcase 372:
CREATE FOREIGN TABLE t11 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 373:
CREATE FOREIGN TABLE t21 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 374:
CREATE FOREIGN TABLE t31 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 53:
INSERT INTO t11 VALUES ( 'bb', 11 );
--Testcase 54:
INSERT INTO t21 VALUES ( 'bb', 12 );
--Testcase 55:
INSERT INTO t21 VALUES ( 'cc', 22 );
--Testcase 56:
INSERT INTO t21 VALUES ( 'ee', 42 );
--Testcase 57:
INSERT INTO t31 VALUES ( 'bb', 13 );
--Testcase 58:
INSERT INTO t31 VALUES ( 'cc', 23 );
--Testcase 59:
INSERT INTO t31 VALUES ( 'dd', 33 );
--Testcase 60:
SELECT * FROM t11 FULL JOIN t21 USING (name) FULL JOIN t31 USING (name);
--
-- Test interactions of join syntax and subqueries
--
-- Basic cases (we expect planner to pull up the subquery here)
--Testcase 61:
SELECT * FROM
(SELECT * FROM t21) as s2
INNER JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 62:
SELECT * FROM
(SELECT * FROM t21) as s2
LEFT JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 63:
SELECT * FROM
(SELECT * FROM t21) as s2
FULL JOIN
(SELECT * FROM t31) s3
USING (name);
-- Cases with non-nullable expressions in subquery results;
-- make sure these go to null as expected
--Testcase 64:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 65:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL LEFT JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 66:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 67:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL INNER JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 68:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL FULL JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 69:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
--Testcase 70:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
-- Constants as join keys can also be problematic
--Testcase 375:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
FULL JOIN
(SELECT name, 2 as s2_n FROM t21) as s2
ON (s1_n = s2_n);
-- Test for propagation of nullability constraints into sub-joins
--Testcase 376:
create foreign table x (x1 int, x2 int) server sqlite_svr;
--Testcase 71:
insert into x values (1,11);
--Testcase 72:
insert into x values (2,22);
--Testcase 73:
insert into x values (3,null);
--Testcase 74:
insert into x values (4,44);
--Testcase 75:
insert into x values (5,null);
--Testcase 377:
create foreign table y (y1 int, y2 int) server sqlite_svr;
--Testcase 76:
insert into y values (1,111);
--Testcase 77:
insert into y values (2,222);
--Testcase 78:
insert into y values (3,333);
--Testcase 79:
insert into y values (4,null);
--Testcase 80:
select * from x;
--Testcase 81:
select * from y;
--Testcase 82:
select * from x left join y on (x1 = y1 and x2 is not null);
--Testcase 83:
select * from x left join y on (x1 = y1 and y2 is not null);
--Testcase 84:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1);
--Testcase 85:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and x2 is not null);
--Testcase 86:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and y2 is not null);
--Testcase 87:
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
--Testcase 88:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (x2 is not null);
--Testcase 89:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (y2 is not null);
--Testcase 90:
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
--
--Testcase 91:
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
--
--Testcase 92:
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;
--Testcase 93:
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
--
--Testcase 378:
create table b (aa int, bb int);
--Testcase 379:
explain (costs off)
select aa, bb, unique1, unique1
from tenk1 right join b on aa = unique1
where bb < bb and bb is null;
--Testcase 380:
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
--
--Testcase 94:
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;
--Testcase 95:
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
--
--Testcase 96:
select count(*)
from
(select t31.tenthous as x1, coalesce(t11.stringu1, t21.stringu1) as x2
from tenk1 t11
left join tenk1 t21 on t11.unique1 = t21.unique1
join tenk1 t31 on t11.unique2 = t31.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
--
--Testcase 97:
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;
--Testcase 98:
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
-- PS: Used ORDER BY to force SQLite and PG12 always order in the same way (NULLS FIRST/LAST default value for PG and Sqlite are different)
--
--Testcase 99:
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 ORDER BY j1_tbl.i, j2_tbl.k;
--Testcase 100:
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 BY j1_tbl.i, j2_tbl.k;
--
-- a different check for handling of redundant sort keys in merge joins
--
--Testcase 101:
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;
--Testcase 102:
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
--
--Testcase 381:
DROP FOREIGN TABLE t11;
--Testcase 382:
DROP FOREIGN TABLE t21;
--Testcase 383:
DROP FOREIGN TABLE t31;
--Testcase 384:
DROP FOREIGN TABLE J1_TBL;
--Testcase 385:
DROP FOREIGN TABLE J2_TBL;
-- Both DELETE and UPDATE allow the specification of additional tables
-- to "join" against to determine which rows should be modified.
--Testcase 386:
CREATE FOREIGN TABLE t12 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 387:
CREATE FOREIGN TABLE t22 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 388:
CREATE FOREIGN TABLE t32 (x int OPTIONS (key 'true'), y int) SERVER sqlite_svr;
--Testcase 103:
INSERT INTO t12 VALUES (5, 10);
--Testcase 104:
INSERT INTO t12 VALUES (15, 20);
--Testcase 105:
INSERT INTO t12 VALUES (100, 100);
--Testcase 106:
INSERT INTO t12 VALUES (200, 1000);
--Testcase 107:
INSERT INTO t22 VALUES (200, 2000);
--Testcase 108:
INSERT INTO t32 VALUES (5, 20);
--Testcase 109:
INSERT INTO t32 VALUES (6, 7);
--Testcase 110:
INSERT INTO t32 VALUES (7, 8);
--Testcase 111:
INSERT INTO t32 VALUES (500, 100);
--Testcase 112:
DELETE FROM t32 USING t12 table1 WHERE t32.x = table1.a;
--Testcase 113:
SELECT * FROM t32;
--Testcase 114:
DELETE FROM t32 USING t12 JOIN t22 USING (a) WHERE t32.x > t12.a;
--Testcase 115:
SELECT * FROM t32;
--Testcase 116:
DELETE FROM t32 USING t32 t3_other WHERE t32.x = t3_other.x AND t32.y = t3_other.y;
--Testcase 117:
SELECT * FROM t32;
-- Test join against inheritance tree
--Testcase 389:
create temp table t2a () inherits (t22);
--Testcase 118:
insert into t2a values (200, 2001);
--Testcase 119:
select * from t12 left join t22 on (t12.a = t22.a);
-- Test matching of column name with wrong alias
--Testcase 120:
select t12.x from t12 join t32 on (t12.a = t32.x);
--Testcase 504:
drop table t2a;
--
-- regression test for 8.1 merge right join bug
--
--Testcase 390:
CREATE FOREIGN TABLE tt1 ( tt1_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO tt1 VALUES (1, 11);
--Testcase 122:
INSERT INTO tt1 VALUES (2, NULL);
--Testcase 391:
CREATE FOREIGN TABLE tt2 ( tt2_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 123:
INSERT INTO tt2 VALUES (21, 11);
--Testcase 124:
INSERT INTO tt2 VALUES (22, 11);
set enable_hashjoin to off;
set enable_nestloop to off;
-- these should give the same results
--Testcase 125:
select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol;
--Testcase 126:
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;
--Testcase 127:
explain (costs off)
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 128:
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
reset work_mem;
reset enable_mergejoin;
--
-- regression test for 8.2 bug with improper re-ordering of left joins
--
--Testcase 392:
create foreign table tt3(f1 int, f2 text) server sqlite_svr;
--Testcase 129:
insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x;
--Testcase 393:
create foreign table tt4(f1 int) server sqlite_svr;
--Testcase 130:
insert into tt4 values (0),(1),(9999);
--Testcase 131:
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
--
--Testcase 394:
create foreign table tt4x(c1 int, c2 int, c3 int) server sqlite_svr;
--Testcase 132:
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
--
--Testcase 395:
create foreign table tt5(f1 int, f2 int) server sqlite_svr;
--Testcase 396:
create foreign table tt6(f1 int, f2 int) server sqlite_svr;
--Testcase 133:
insert into tt5 values(1, 10);
--Testcase 134:
insert into tt5 values(1, 11);
--Testcase 135:
insert into tt6 values(1, 9);
--Testcase 136:
insert into tt6 values(1, 2);
--Testcase 137:
insert into tt6 values(2, 9);
--Testcase 138:
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
--
--Testcase 397:
create foreign table xx (pkxx int) server sqlite_svr;
--Testcase 398:
create foreign table yy (pkyy int, pkxx int) server sqlite_svr;
--Testcase 139:
insert into xx values (1);
--Testcase 140:
insert into xx values (2);
--Testcase 141:
insert into xx values (3);
--Testcase 142:
insert into yy values (101, 1);
--Testcase 143:
insert into yy values (201, 2);
--Testcase 144:
insert into yy values (301, NULL);
--Testcase 145:
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)
--
--Testcase 399:
create foreign table zt1 (f1 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 400:
create foreign table zt2 (f2 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 401:
create foreign table zt3 (f3 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 146:
insert into zt1 values(53);
--Testcase 147:
insert into zt2 values(53);
--Testcase 148:
select * from
zt2 left join zt3 on (f2 = f3)
left join zt1 on (f3 = f1)
where f2 = 53;
--Testcase 402:
create temp view zv1 as select *,'dummy'::text AS junk from zt1;
--Testcase 149:
select * from
zt2 left join zt3 on (f2 = f3)
left join zv1 on (f3 = f1)
where f2 = 53;
--Testcase 505:
drop view zv1;
--
-- regression test for improper extraction of OR indexqual conditions
-- (as seen in early 8.3.x releases)
--
--Testcase 150:
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)
--
--Testcase 151:
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));
--Testcase 152:
execute foo(true);
--Testcase 153:
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;
--Testcase 403:
create foreign table a1 (i integer) server sqlite_svr;
--Testcase 404:
create foreign table b1 (x integer, y integer) server sqlite_svr;
--Testcase 154:
select * from a1 left join b1 on i = x and i = y and x = i;
rollback;
-- skip this test, sqlite fdw does not support customized type
-- test handling of merge clauses using record_ops
--
--begin;
--create type mycomptype as (id int, v bigint);
--create foreign table tidv (idv mycomptype) server sqlite_svr;
--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;
--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
--
--Testcase 155:
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;
--Testcase 156:
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;
--Testcase 157:
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;
--Testcase 158:
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;
--Testcase 405:
create foreign table a2 (
code char OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 406:
create foreign table b2 (
a char OPTIONS (key 'true'),
num integer OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 407:
create foreign table c2 (
name char OPTIONS (key 'true'),
a char
) server sqlite_svr;
--Testcase 159:
insert into a2 (code) values ('p');
--Testcase 160:
insert into a2 (code) values ('q');
--Testcase 161:
insert into b2 (a, num) values ('p', 1);
--Testcase 162:
insert into b2 (a, num) values ('p', 2);
--Testcase 163:
insert into c2 (name, a) values ('A', 'p');
--Testcase 164:
insert into c2 (name, a) values ('B', 'q');
--Testcase 165:
insert into c2 (name, a) values ('C', null);
--Testcase 166:
select c2.name, ss.code, ss.b_cnt, ss.const
from c2 left join
(select a2.code, coalesce(b_grp.cnt, 0) as b_cnt, -1 as const
from a2 left join
(select count(1) as cnt, b2.a from b2 group by b2.a) as b_grp
on a2.code = b_grp.a
) as ss
on (c2.a = ss.code)
order by c2.name;
rollback;
--
-- test incorrect handling of placeholders that only appear in targetlists,
-- per bug #6154
--
--Testcase 408:
create foreign table sub_tbl (key1 int, key3 int, key5 int, key6 int, value1 int, id int options (key 'true')) server sqlite_svr;
--Testcase 409:
insert into sub_tbl values (1, 1, 1, 2, 42);
--Testcase 410:
SELECT * FROM
( SELECT key1 from sub_tbl) sub1
LEFT JOIN
( SELECT sub3.key3, sub4.value2, COALESCE(sub4.value2, 66) as value3 FROM
( SELECT key3 from sub_tbl) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl ) 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
--Testcase 411:
SELECT * FROM
( SELECT key1 from sub_tbl ) sub1
LEFT JOIN
( SELECT sub3.key3, value2, COALESCE(value2, 66) as value3 FROM
( SELECT key3 from sub_tbl ) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl ) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl) 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
--
--Testcase 167:
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;
--Testcase 168:
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
--
--Testcase 412:
create foreign table nt1 (
id int OPTIONS (key 'true'),
a1 boolean,
a2 boolean
) server sqlite_svr;
--Testcase 413:
create foreign table nt2 (
id int OPTIONS (key 'true'),
nt1_id int,
b1 boolean,
b2 boolean
) server sqlite_svr;
--Testcase 414:
create foreign table nt3 (
id int OPTIONS (key 'true'),
nt2_id int,
c1 boolean
) server sqlite_svr;
--Testcase 169:
insert into nt1 values (1,true,true);
--Testcase 170:
insert into nt1 values (2,true,false);
--Testcase 171:
insert into nt1 values (3,false,false);
--Testcase 172:
insert into nt2 values (1,1,true,true);
--Testcase 173:
insert into nt2 values (2,2,true,false);
--Testcase 174:
insert into nt2 values (3,3,false,false);
--Testcase 175:
insert into nt3 values (1,1,true);
--Testcase 176:
insert into nt3 values (2,2,false);
--Testcase 177:
insert into nt3 values (3,3,true);
--Testcase 178:
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;
--Testcase 179:
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
--
--Testcase 180:
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;
--Testcase 181:
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;
--
-- test the corner cases FULL JOIN ON TRUE and FULL JOIN ON FALSE
--
--Testcase 182:
select * from int4_tbl a full join int4_tbl b on true;
--Testcase 183:
select * from int4_tbl a full join int4_tbl b on false;
--
-- test for ability to use a cartesian join when necessary
--
--Testcase 415:
create foreign table q1(i int) server sqlite_svr;
--Testcase 416:
insert into q1 values (1);
--Testcase 417:
create foreign table q2(i int) server sqlite_svr;
--Testcase 418:
insert into q2 values (0);
--Testcase 184:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where q1.i = thousand or q2.i = thousand;
--Testcase 185:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where thousand = (q1.i + q2.i);
--
-- test ability to generate a suitable plan for a star-schema query
--
--Testcase 186:
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
--
--Testcase 187:
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;
--Testcase 188:
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
--Testcase 189:
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
--Testcase 419:
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;
--Testcase 420:
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
--Testcase 421:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
--Testcase 422:
select * from
(select key1 as x from sub_tbl as x) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
--
-- test inlining of immutable functions
--
--Testcase 423:
create function f_immutable_int4(i integer) returns integer as
$$ begin return i; end; $$ language plpgsql immutable;
-- check optimization of function scan with join
--Testcase 424:
explain (costs off)
select unique1 from tenk1, (select * from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 425:
explain (verbose, costs off)
select unique1, x.*
from tenk1, (select *, random() from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 426:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = unique1;
--Testcase 427:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
--Testcase 428:
explain (costs off)
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
--Testcase 429:
explain (costs off)
select unique1, x from tenk1 left join f_immutable_int4(1) x on unique1 = x;
--Testcase 430:
explain (costs off)
select unique1, x from tenk1 right join f_immutable_int4(1) x on unique1 = x;
--Testcase 431:
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
--Testcase 432:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = 42;
-- test inlining of immutable functions with PlaceHolderVars
--Testcase 433:
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;
--Testcase 434:
drop function f_immutable_int4(int);
-- test inlining when function returns composite
--Testcase 435:
create function mki8(bigint, bigint) returns int8_tbl as
$$select row($1,$2)::int8_tbl$$ language sql;
--Testcase 436:
create function mki4(int) returns int4_tbl as
$$select row($1)::int4_tbl$$ language sql;
--Testcase 437:
explain (verbose, costs off)
select * from mki8(1,2);
--Testcase 438:
select * from mki8(1,2);
--Testcase 439:
explain (verbose, costs off)
select * from mki4(42);
--Testcase 440:
select * from mki4(42);
--Testcase 441:
drop function mki8(bigint, bigint);
--Testcase 442:
drop function mki4(int);
--
-- test extraction of restriction OR clauses from join OR clause
-- (we used to only do this for indexable clauses)
--
--Testcase 190:
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);
--Testcase 191:
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);
--Testcase 192:
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
--
--Testcase 193:
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;
--Testcase 194:
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;
--Testcase 195:
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;
--Testcase 196:
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;
--Testcase 197:
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;
--Testcase 198:
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;
--Testcase 199:
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;
--Testcase 200:
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;
--Testcase 201:
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;
--Testcase 202:
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
--
--Testcase 203:
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);
--Testcase 204:
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);
--Testcase 205:
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;
--Testcase 206:
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)
--
--Testcase 207:
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;
--Testcase 208:
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
--
--Testcase 209:
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);
--Testcase 210:
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
--
--Testcase 443:
create foreign table text_tbl(f1 text) server sqlite_svr;
--Testcase 211:
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);
--Testcase 212:
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);
--Testcase 213:
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);
--Testcase 214:
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);
--Testcase 215:
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);
--Testcase 216:
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);
--Testcase 217:
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;
--Testcase 218:
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
--
--Testcase 219:
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;
--Testcase 220:
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;
--Testcase 221:
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;
--Testcase 222:
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;
--Testcase 223:
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;
--Testcase 224:
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
--
--Testcase 225:
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;
--Testcase 226:
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)
--
--Testcase 227:
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));
--Testcase 228:
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
--
--Testcase 229:
explain (costs off)
select * from int4_tbl a left join tenk1 b on f1 = unique2 where f1 = 0;
--Testcase 230:
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;
--Testcase 231:
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;
--Testcase 232:
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;
--Testcase 444:
CREATE FOREIGN TABLE a3 (id int OPTIONS (key 'true'), b_id int) SERVER sqlite_svr;
--Testcase 445:
CREATE FOREIGN TABLE b3 (id int OPTIONS (key 'true'), c_id int) SERVER sqlite_svr;
--Testcase 446:
CREATE FOREIGN TABLE c3 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 447:
CREATE FOREIGN TABLE d3 (a int, b int) SERVER sqlite_svr;
--Testcase 233:
INSERT INTO a3 VALUES (0, 0), (1, NULL);
--Testcase 234:
INSERT INTO b3 VALUES (0, 0), (1, NULL);
--Testcase 235:
INSERT INTO c3 VALUES (0), (1);
--Testcase 236:
INSERT INTO d3 VALUES (1,3), (2,2), (3,1);
-- all three cases should be optimizable into a3 simple seqscan
--Testcase 237:
explain (costs off) SELECT a3.* FROM a3 LEFT JOIN b3 ON a3.b_id = b3.id;
--Testcase 238:
explain (costs off) SELECT b3.* FROM b3 LEFT JOIN c3 ON b3.c_id = c3.id;
--Testcase 239:
explain (costs off)
SELECT a3.* FROM a3 LEFT JOIN (b3 left join c3 on b3.c_id = c3.id)
ON (a3.b_id = b3.id);
-- check optimization of outer join within another special join
--Testcase 240:
explain (costs off)
select id from a3 where id in (
select b3.id from b3 left join c3 on b3.id = c3.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
--Testcase 241:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id and d3.b = s.c_id;
-- similarly, but keying off a DISTINCT clause
--Testcase 242:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id and d3.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 b3.id is a
-- primary key and so drop b3.c_id from the GROUP BY of the resulting plan;
-- but this happens too late for join removal in the outer plan level.)
--Testcase 243:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id;
-- similarly, but keying off a DISTINCT clause
--Testcase 244:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id;
-- check join removal works when uniqueness of the join condition is enforced
-- by a UNION
--Testcase 245:
explain (costs off)
select d3.* from d3 left join (select id from a3 union select id from b3) s
on d3.a = s.id;
-- check join removal with a cross-type comparison operator
--Testcase 246:
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
--Testcase 247:
explain (costs off)
select 1 from (select a3.id FROM a3 left join b3 on a3.b_id = b3.id) q,
lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
rollback;
--Testcase 448:
create foreign table parent (k int options (key 'true'), pd int) server sqlite_svr;
--Testcase 449:
create foreign table child (k int options (key 'true'), cd int) server sqlite_svr;
--Testcase 248:
insert into parent values (1, 10), (2, 20), (3, 30);
--Testcase 249:
insert into child values (1, 100), (4, 400);
-- this case is optimizable
--Testcase 250:
select p.* from parent p left join child c on (p.k = c.k);
--Testcase 251:
explain (costs off)
select p.* from parent p left join child c on (p.k = c.k);
-- this case is not
--Testcase 252:
select p.*, linked from parent p
left join (select c.*, true as linked from child c) as ss
on (p.k = ss.k);
--Testcase 253:
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
--Testcase 254:
select p.* from
parent p left join child c on (p.k = c.k)
where p.k = 1 and p.k = 2;
--Testcase 255:
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;
--Testcase 256:
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;
--Testcase 257:
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;
--Testcase 450:
CREATE FOREIGN TABLE a4 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 451:
CREATE FOREIGN TABLE b4 (id int OPTIONS (key 'true'), a_id int) SERVER sqlite_svr;
--Testcase 258:
INSERT INTO a4 VALUES (0), (1);
--Testcase 259:
INSERT INTO b4 VALUES (0, 0), (1, NULL);
--Testcase 260:
SELECT * FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
--Testcase 261:
SELECT b4.* FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
rollback;
-- another join removal bug: this is not optimizable, either
begin;
--Testcase 452:
create foreign table innertab (id int8 options (key 'true'), dat1 int8) server sqlite_svr;
--Testcase 262:
insert into innertab values(123, 42);
--Testcase 263:
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;
--Testcase 453:
create foreign table uniquetbl (f1 text) server sqlite_svr;
--Testcase 264:
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;
--Testcase 265:
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;
--Testcase 266:
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;
-- bug #8444: we've historically allowed duplicate aliases within aliased JOINs
--Testcase 267:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; -- error
--Testcase 268:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; -- error
--Testcase 269:
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
--
--Testcase 270:
select t1.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t1" suggestion
--Testcase 271:
select t2.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t2" suggestion
--Testcase 272:
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
--
--Testcase 454:
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
--
--Testcase 273:
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 274:
explain (costs off)
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 275:
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 276:
explain (costs off)
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 277:
explain (costs off)
select unique2, x.*
from int4_tbl x cross join lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 278:
select unique2, x.*
from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true;
--Testcase 279:
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
--Testcase 280:
select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl;
--Testcase 281:
select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl;
-- lateral with function in FROM
--Testcase 282:
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 283:
explain (costs off)
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 284:
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
--Testcase 285:
explain (costs off)
select count(*) from tenk1 a, generate_series(1,two) g;
-- lateral with UNION ALL subselect
--Testcase 286:
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;
--Testcase 287:
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
--Testcase 288:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x;
--Testcase 289:
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
--Testcase 290:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x;
--Testcase 291:
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
--Testcase 292:
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;
--Testcase 293:
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
--Testcase 294:
select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (select x) ss2(y);
--Testcase 295:
select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (values(x)) ss2(y);
--Testcase 296:
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
--Testcase 297:
select * from (values(1)) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 298:
select * from (select f1/1000000000 from int4_tbl) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 299:
select * from (values(1)) x(lb),
lateral (values(lb)) y(lbcopy);
--Testcase 300:
select * from (values(1)) x(lb),
lateral (select lb from int4_tbl) y(lbcopy);
--Testcase 301:
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);
--Testcase 302:
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);
--Testcase 303:
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);
--Testcase 304:
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);
--Testcase 305:
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);
--Testcase 307:
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);
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 455:
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;
--Testcase 456:
select * from
int8_tbl a left join
lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1;
--Testcase 457:
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;
--Testcase 458:
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
--Testcase 308:
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;
--Testcase 309:
select * from int4_tbl i left join
lateral (select * from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 310:
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;
--Testcase 311:
select * from int4_tbl i left join
lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 312:
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;
--Testcase 313:
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
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 459:
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;
--Testcase 460:
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
--Testcase 461:
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
--Testcase 462:
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)
--Testcase 463:
delete from sub_tbl;
--Testcase 464:
insert into sub_tbl values (1, 2, 3, 4, 5);
--Testcase 465:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl offset 0) x cross join (select key3 as y from sub_tbl offset 0) y
left join lateral (
select * from (select key5 as z from sub_tbl offset 0) z where z.z = x.x
) zz on zz.z = y.y;
-- check dummy rels with lateral references (bug #15694)
--Testcase 466:
explain (verbose, costs off)
select * from int8_tbl i8 left join lateral
(select *, i8.q2 from int4_tbl where false) ss on true;
--Testcase 467:
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
--Testcase 468:
select * from
((select key3 as v from sub_tbl) union all (select key5 as v from sub_tbl)) as q1
cross join lateral
((select * from
((select key6 as v from sub_tbl) union all (select value1 as v from sub_tbl)) as q3)
union all
(select q1.v)
) as q2;
-- check we don't try to do a unique-ified semijoin with LATERAL
--Testcase 314:
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;
--Testcase 315:
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)
--Testcase 316:
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;
--Testcase 317:
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
--Testcase 318:
select f1,g from int4_tbl a, (select f1 as g) ss;
--Testcase 319:
select f1,g from int4_tbl a, (select a.f1 as g) ss;
--Testcase 320:
select f1,g from int4_tbl a cross join (select f1 as g) ss;
--Testcase 321:
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
--Testcase 322:
select f1,g from int4_tbl a right join lateral generate_series(0, a.f1) g on true;
--Testcase 323:
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
--Testcase 324:
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
--Testcase 325:
select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss;
-- check behavior of LATERAL in UPDATE/DELETE
--Testcase 469:
create temp table xx1 as select f1 as x1, -f1 as x2 from int4_tbl;
-- error, can't do this:
--Testcase 326:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss;
--Testcase 327:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss;
-- can't do it even with LATERAL:
--Testcase 328:
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:
--Testcase 329:
update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1) ss;
-- also errors:
--Testcase 330:
delete from xx1 using (select * from int4_tbl where f1 = x1) ss;
--Testcase 331:
delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss;
--Testcase 332:
delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
-- Skip this test, sqlite fdw does not support to create partition table
-- 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 that foreign key join estimation performs sanely for outer joins
--
begin;
--Testcase 470:
create foreign table fkest (a int options (key 'true'), b int options (key 'true'), c int) server sqlite_svr;
--Testcase 471:
create foreign table fkest1 (a int options (key 'true'), b int options (key 'true')) server sqlite_svr;
--Testcase 333:
insert into fkest select x/10, x%10, x from generate_series(1,1000) x;
--Testcase 334:
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;
--Testcase 335:
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
--
--Testcase 472:
create foreign table j11 (id int options (key 'true')) server sqlite_svr;
--Testcase 473:
create foreign table j21 (id int options (key 'true')) server sqlite_svr;
--Testcase 474:
create foreign table j31 (id int) server sqlite_svr;
--Testcase 336:
insert into j11 values(1),(2),(3);
--Testcase 337:
insert into j21 values(1),(2),(3);
--Testcase 338:
insert into j31 values(1),(1);
-- ensure join is properly marked as unique
--Testcase 339:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id = j21.id;
-- ensure join is not unique when not an equi-join
--Testcase 340:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id > j21.id;
-- ensure non-unique rel is not chosen as inner
--Testcase 341:
explain (verbose, costs off)
select * from j11 inner join j31 on j11.id = j31.id;
-- ensure left join is marked as unique
--Testcase 342:
explain (verbose, costs off)
select * from j11 left join j21 on j11.id = j21.id;
-- ensure right join is marked as unique
--Testcase 343:
explain (verbose, costs off)
select * from j11 right join j21 on j11.id = j21.id;
-- ensure full join is marked as unique
--Testcase 344:
explain (verbose, costs off)
select * from j11 full join j21 on j11.id = j21.id;
-- a clauseless (cross) join can't be unique
--Testcase 345:
explain (verbose, costs off)
select * from j11 cross join j21;
-- ensure a natural join is marked as unique
--Testcase 346:
explain (verbose, costs off)
select * from j11 natural join j21;
-- ensure a distinct clause allows the inner to become unique
--Testcase 347:
explain (verbose, costs off)
select * from j11
inner join (select distinct id from j31) j31 on j11.id = j31.id;
-- ensure group by clause allows the inner to become unique
--Testcase 348:
explain (verbose, costs off)
select * from j11
inner join (select id from j31 group by id) j31 on j11.id = j31.id;
--drop table j1;
--drop table j2;
--drop table j3;
-- test more complex permutations of unique joins
--Testcase 475:
create foreign table j12 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 476:
create foreign table j22 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 477:
create foreign table j32 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 349:
insert into j12 values(1,1),(1,2);
--Testcase 350:
insert into j22 values(1,1);
--Testcase 351:
insert into j32 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
--Testcase 352:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1;
-- ensure proper unique detection with multiple join quals
--Testcase 353:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2;
-- ensure we don't detect the join to be unique when quals are not part of the
-- join condition
--Testcase 354:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 where j12.id2 = 1;
-- as above, but for left joins.
--Testcase 355:
explain (verbose, costs off)
select * from j12
left join j22 on j12.id1 = j22.id1 where j12.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;
-- skip, cannot create index on foreign table
-- 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
--Testcase 478:
insert into j22 values(1,2);
--analyze j2;
--Testcase 356:
explain (costs off) select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
--Testcase 357:
select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
-- Exercise array keys mark/restore B-Tree code
--Testcase 479:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
--Testcase 480:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
-- Exercise array keys "find extreme element" B-Tree code
--Testcase 481:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 482:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.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
--Testcase 483:
CREATE FOREIGN TABLE onek (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 358:
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
--Testcase 484:
create table j3 as select unique1, tenthous from onek;
vacuum analyze j3;
--Testcase 485:
create unique index on j3(unique1, tenthous);
--Testcase 359:
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;
--Testcase 486:
drop table j3;
--Testcase 506:
DELETE FROM INT4_TBL;
--Testcase 507:
DELETE FROM INT8_TBL;
--Testcase 508:
DELETE FROM FLOAT8_TBL;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 487:
DROP SERVER sqlite_svr;
--Testcase 488:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/limit.sql
================================================
--
-- LIMIT
-- Check the LIMIT/OFFSET feature of SELECT
--
--Testcase 27:
CREATE EXTENSION sqlite_fdw;
--Testcase 28:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 29:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 30:
CREATE FOREIGN TABLE int8_tbl(q1 int8 OPTIONS (key 'true'), q2 int8) SERVER sqlite_svr;
--Testcase 104:
INSERT INTO int8_tbl VALUES(' 123 ',' 456');
--Testcase 105:
INSERT INTO int8_tbl VALUES('123 ','4567890123456789');
--Testcase 106:
INSERT INTO int8_tbl VALUES('4567890123456789','123');
--Testcase 107:
INSERT INTO int8_tbl VALUES(+4567890123456789,'4567890123456789');
--Testcase 108:
INSERT INTO int8_tbl VALUES('+4567890123456789','-4567890123456789');
--Testcase 31:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 32:
CREATE FOREIGN TABLE tenk1 (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 88:
CREATE TABLE parent_table (
unique1 int4 PRIMARY KEY,
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
);
--Testcase 89:
CREATE FOREIGN table inherited_table ()
INHERITS (parent_table)
SERVER sqlite_svr options (table 'tenk1');
--Testcase 1:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
ORDER BY unique1 LIMIT 2;
--Testcase 2:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60
ORDER BY unique1 LIMIT 5;
--Testcase 3:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60 AND unique1 < 63
ORDER BY unique1 LIMIT 5;
--Testcase 4:
SELECT ''::text AS three, unique1, unique2, stringu1
FROM onek WHERE unique1 > 100
ORDER BY unique1 LIMIT 3 OFFSET 20;
--Testcase 5:
SELECT ''::text AS zero, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 8 OFFSET 99;
--Testcase 6:
SELECT ''::text AS eleven, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 20 OFFSET 39;
--Testcase 7:
SELECT ''::text AS ten, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990;
--Testcase 8:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990 LIMIT 5;
--Testcase 9:
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:
--Testcase 10:
select * from int8_tbl limit (case when random() < 0.5 then null::bigint end);
--Testcase 11:
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
begin;
declare c1 scroll cursor for select * from int8_tbl order by q1 limit 10;
--Testcase 12:
fetch all in c1;
--Testcase 13:
fetch 1 in c1;
--Testcase 14:
fetch backward 1 in c1;
--Testcase 33:
fetch backward all in c1;
--Testcase 34:
fetch backward 1 in c1;
--Testcase 35:
fetch all in c1;
declare c2 scroll cursor for select * from int8_tbl limit 3;
--Testcase 36:
fetch all in c2;
--Testcase 37:
fetch 1 in c2;
--Testcase 38:
fetch backward 1 in c2;
--Testcase 39:
fetch backward all in c2;
--Testcase 40:
fetch backward 1 in c2;
--Testcase 41:
fetch all in c2;
declare c3 scroll cursor for select * from int8_tbl offset 3;
--Testcase 42:
fetch all in c3;
--Testcase 43:
fetch 1 in c3;
--Testcase 44:
fetch backward 1 in c3;
--Testcase 45:
fetch backward all in c3;
--Testcase 46:
fetch backward 1 in c3;
--Testcase 47:
fetch all in c3;
declare c4 scroll cursor for select * from int8_tbl offset 10;
--Testcase 48:
fetch all in c4;
--Testcase 49:
fetch 1 in c4;
--Testcase 50:
fetch backward 1 in c4;
--Testcase 51:
fetch backward all in c4;
--Testcase 52:
fetch backward 1 in c4;
--Testcase 53:
fetch all in c4;
declare c5 scroll cursor for select * from int8_tbl order by q1 fetch first 2 rows with ties;
--Testcase 54:
fetch all in c5;
--Testcase 55:
fetch 1 in c5;
--Testcase 56:
fetch backward 1 in c5;
--Testcase 57:
fetch backward 1 in c5;
--Testcase 58:
fetch all in c5;
--Testcase 59:
fetch backward all in c5;
--Testcase 60:
fetch all in c5;
--Testcase 61:
fetch backward all in c5;
rollback;
-- Stress test for variable LIMIT in conjunction with bounded-heap sorting
--Testcase 62:
DELETE FROM INT8_TMP;
--Testcase 63:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series(1,10) q1;
--Testcase 64:
SELECT
(SELECT s.q1
FROM (VALUES (1)) AS x,
(SELECT q1 FROM INT8_TMP as n
ORDER BY q1 LIMIT 1 OFFSET s.q1-1) AS y) AS z
FROM INT8_TMP AS s;
--
-- Test behavior of volatile and set-returning functions in conjunction
-- with ORDER BY and LIMIT.
--
--Testcase 65:
create temp sequence testseq;
--Testcase 15:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 16:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 90:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 91:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 17:
select currval('testseq');
--Testcase 92:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 93:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 94:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 95:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 96:
select currval('testseq');
--Testcase 18:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 19:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 97:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 98:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 20:
select currval('testseq');
-- test for limit and offset when querying table and foreign table inherited
--Testcase 99:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
--Testcase 100:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
-- when querying regular tables with inherited tables, only limit is pushed-down when no offset is specified
--Testcase 101:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 102:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 103:
select currval('testseq');
--Testcase 21:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 22:
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 23:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by tenthous limit 7;
--Testcase 24:
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
--Testcase 66:
DELETE FROM INT8_TMP;
--Testcase 67:
INSERT INTO INT8_TMP VALUES (generate_series(0,2), generate_series((random()*.1)::int,2));
--Testcase 68:
explain (verbose, costs off)
select q1, q2 from int8_tmp;
--Testcase 69:
select q1, q2 from int8_tmp;
--Testcase 70:
explain (verbose, costs off)
select q1, q2 from int8_tmp order by q2 desc;
--Testcase 71:
select q1, q2 from int8_tmp order by q2 desc;
-- test for failure to set all aggregates' aggtranstype
--Testcase 25:
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;
--Testcase 26:
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
--
--Testcase 72:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW WITH TIES;
--Testcase 73:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST ROWS WITH TIES;
--Testcase 74:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES;
--Testcase 75:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW ONLY;
-- should fail
--Testcase 76:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
FETCH FIRST 2 ROW WITH TIES;
-- test ruleutils
--Testcase 77:
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;
--Testcase 78:
\d+ limit_thousand_v_1
--Testcase 79:
CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY;
--Testcase 80:
\d+ limit_thousand_v_2
--Testcase 81:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS WITH TIES; -- fails
--Testcase 82:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES;
--Testcase 83:
\d+ limit_thousand_v_3
--Testcase 84:
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
--Testcase 85:
\d+ limit_thousand_v_4
-- leave these views
--Testcase 109:
DELETE FROM int8_tbl;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 86:
DROP SERVER sqlite_svr;
--Testcase 87:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/prepare.sql
================================================
-- Regression tests for prepareable statements. We query the content
-- of the pg_prepared_statements view as prepared statements are
-- created and removed.
--Testcase 26:
CREATE EXTENSION sqlite_fdw;
--Testcase 27:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 28:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 29:
CREATE FOREIGN TABLE road (
name text,
thepath path
) SERVER sqlite_svr;
--Testcase 30:
create foreign table road_tmp (a int, b int, id int options (key 'true')) server sqlite_svr;
--Testcase 31:
insert into road_tmp values (1, 2);
--Testcase 1:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
--Testcase 2:
PREPARE q1 AS SELECT a FROM road_tmp;
--Testcase 3:
EXECUTE q1;
--Testcase 4:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- should fail
--Testcase 5:
PREPARE q1 AS SELECT b FROM road_tmp;
-- should succeed
DEALLOCATE q1;
--Testcase 6:
PREPARE q1 AS SELECT b FROM road_tmp;
--Testcase 7:
EXECUTE q1;
--Testcase 8:
PREPARE q2 AS SELECT b FROM road_tmp;
--Testcase 9:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- sql92 syntax
DEALLOCATE PREPARE q1;
--Testcase 10:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
DEALLOCATE PREPARE q2;
-- the view should return the empty set again
--Testcase 11:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- parameterized queries
--Testcase 12:
PREPARE q2(text) AS
SELECT datname, datistemplate, datallowconn
FROM pg_database WHERE datname = $1;
--Testcase 13:
EXECUTE q2('postgres');
--Testcase 14:
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;
--Testcase 15:
EXECUTE q3('AAAAxx', 5::smallint, 10.5::float, false, 4::bigint);
-- too few params
--Testcase 16:
EXECUTE q3('bool');
-- too many params
--Testcase 17:
EXECUTE q3('bytea', 5::smallint, 10.5::float, false, 4::bigint, true);
-- wrong param types
--Testcase 18:
EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'bytea');
-- invalid type
--Testcase 19:
PREPARE q4(nonexistenttype) AS SELECT * FROM road WHERE name = $1;
-- create table as execute
--Testcase 20:
PREPARE q5(int, text) AS
SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
ORDER BY unique1;
--Testcase 32:
CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA');
--Testcase 21:
SELECT * FROM q5_prep_results;
--Testcase 33:
CREATE TEMPORARY TABLE q5_prep_nodata AS EXECUTE q5(200, 'DTAAAA')
WITH NO DATA;
--Testcase 34:
SELECT * FROM q5_prep_nodata;
-- unknown or unspecified parameter types: should succeed
--Testcase 22:
PREPARE q6 AS
SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
--Testcase 23:
PREPARE q7(unknown) AS
SELECT * FROM road WHERE thepath = $1;
--Testcase 24:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
-- test DEALLOCATE ALL;
DEALLOCATE ALL;
--Testcase 25:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
--Testcase 35:
DROP FOREIGN TABLE tenk1;
--Testcase 36:
DROP FOREIGN TABLE road;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/select.sql
================================================
--
-- SELECT
--
--Testcase 43:
CREATE EXTENSION sqlite_fdw;
--Testcase 44:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 45:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 46:
CREATE FOREIGN TABLE onek2 (
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
) SERVER sqlite_svr;
--Testcase 47:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 73:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 74:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 75:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 76:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 77:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 48:
CREATE FOREIGN TABLE person (
name text,
age int4,
location point
) SERVER sqlite_svr;
-- btree index
-- awk '{if($1<10){print;}else{next;}}' onek.data | sort +0n -1
--
--Testcase 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
--
--Testcase 2:
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
--
--Testcase 3:
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
--
--Testcase 4:
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
--
--Testcase 5:
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
--
--Testcase 6:
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
--
--Testcase 7:
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
--
--Testcase 8:
SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10 order by onek2.unique1;
--
-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1
--
--Testcase 9:
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
--
--Testcase 10:
SELECT onek2.unique1, onek2.stringu1 FROM onek2
WHERE onek2.unique1 > 980 ORDER BY onek2.unique1;
RESET enable_seqscan;
RESET enable_bitmapscan;
RESET enable_sort;
--Testcase 11:
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
--Testcase 12:
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
--
--Testcase 13:
SELECT p.name, p.age FROM person* p ORDER BY age using >, name;
--
-- Test some cases involving whole-row Var referencing a subquery
--
--Testcase 49:
select foo from (select 1 offset 0) as foo;
--Testcase 50:
select foo from (select null offset 0) as foo;
--Testcase 51:
select foo from (select 'xyzzy',1,null offset 0) as foo;
--
-- Test VALUES lists
--
--Testcase 14:
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 :-)
--Testcase 15:
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
--Testcase 16:
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
--Testcase 17:
VALUES (1,2), (3,4+4), (7,77.7);
--Testcase 52:
VALUES (1,2), (3,4+4), (7,77.7)
UNION ALL
SELECT 2+2, 57
UNION ALL
TABLE int8_tbl;
--
-- Test ORDER BY options
--
--Testcase 53:
CREATE FOREIGN TABLE foo (f1 int options (key 'true')) SERVER sqlite_svr;
--Testcase 18:
INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1);
--Testcase 19:
SELECT * FROM foo ORDER BY f1;
--Testcase 20:
SELECT * FROM foo ORDER BY f1 ASC; -- same thing
--Testcase 21:
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
--Testcase 22:
SELECT * FROM foo ORDER BY f1 DESC;
--Testcase 23:
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
-- Skip, cannot create index on foreign table
-- 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
--Testcase 24:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 25:
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- actually run the query with an analyze to use the partial index
--Testcase 54:
explain (costs off, analyze on, timing off, summary off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 27:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 28:
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- partial index predicate implies clause, so no need for retest
--Testcase 29:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 30:
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 31:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 32:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
-- but if it's an update target, must retest anyway
--Testcase 33:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
--Testcase 34:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
-- partial index is not applicable
--Testcase 35:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'C';
--Testcase 36:
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;
--Testcase 37:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 38:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
RESET enable_indexscan;
-- check multi-index cases too
--Testcase 39:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 40:
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 41:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 and stringu1 < 'B') or unique1 = 0;
--Testcase 42:
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
--Testcase 55:
SELECT 1 AS x ORDER BY x;
-- But ORDER BY on a set-valued expression does
--Testcase 56:
create function sillysrf(int) returns setof int as
'values (1),(10),(2),($1)' language sql immutable;
--Testcase 57:
select sillysrf(42);
--Testcase 58:
select sillysrf(-1) order by 1;
--Testcase 59:
drop function sillysrf(int);
-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict
-- (see bug #5084)
--Testcase 60:
select * from (values (2),(null),(1)) v(k) where k = k order by k;
--Testcase 61:
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.
--Testcase 62:
create table list_parted_tbl (a int,b int) partition by list (a);
--Testcase 63:
create table list_parted_tbl1 partition of list_parted_tbl
for values in (1) partition by list(b);
--Testcase 64:
explain (costs off) select * from list_parted_tbl;
--Testcase 65:
drop table list_parted_tbl;
--Testcase 78:
DELETE FROM INT8_TBL;
--Testcase 66:
DROP FOREIGN TABLE onek;
--Testcase 67:
DROP FOREIGN TABLE onek2;
--Testcase 68:
DROP FOREIGN TABLE int8_tbl;
--Testcase 69:
DROP FOREIGN TABLE person;
--Testcase 70:
DROP FOREIGN TABLE foo;
--Testcase 71:
DROP SERVER sqlite_svr;
--Testcase 72:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/select_having.sql
================================================
--
-- SELECT_HAVING
--
--Testcase 22:
CREATE EXTENSION sqlite_fdw;
--Testcase 23:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 24:
CREATE FOREIGN TABLE test_having(a int OPTIONS (key 'true'), b int, c char(8), d char) SERVER sqlite_svr;
-- load test data
--Testcase 1:
INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A');
--Testcase 2:
INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b');
--Testcase 3:
INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c');
--Testcase 4:
INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D');
--Testcase 5:
INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e');
--Testcase 6:
INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F');
--Testcase 7:
INSERT INTO test_having VALUES (6, 4, 'cccc', 'g');
--Testcase 8:
INSERT INTO test_having VALUES (7, 4, 'cccc', 'h');
--Testcase 9:
INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I');
--Testcase 10:
INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j');
--Testcase 11:
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
--Testcase 12:
SELECT b, c FROM test_having
GROUP BY b, c HAVING b = 3 ORDER BY b, c collate "en_US.utf8";
--Testcase 13:
SELECT lower(c), count(c) FROM test_having
GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY lower(c);
--Testcase 14:
SELECT c, max(a) FROM test_having
GROUP BY c HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY c collate "en_US.utf8";
-- test degenerate cases involving HAVING without GROUP BY
-- Per SQL spec, these should generate 0 or 1 row, even without aggregates
--Testcase 15:
SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a);
--Testcase 16:
SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a);
-- errors: ungrouped column references
--Testcase 17:
SELECT a FROM test_having HAVING min(a) < max(a);
--Testcase 18:
SELECT 1 AS one FROM test_having HAVING a > 1;
-- the really degenerate case: need not scan table at all
--Testcase 19:
SELECT 1 AS one FROM test_having HAVING 1 > 2;
--Testcase 20:
SELECT 1 AS one FROM test_having HAVING 1 < 2;
-- and just to prove that we aren't scanning the table:
--Testcase 21:
SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2;
--Testcase 25:
DROP FOREIGN TABLE test_having;
--Testcase 26:
DROP SERVER sqlite_svr;
--Testcase 27:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/sqlite_fdw_post.sql
================================================
-- ===================================================================
-- create FDW objects
-- ===================================================================
--Testcase 483:
CREATE EXTENSION sqlite_fdw;
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr2 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- SQLite FDW does not need User and User Mapping.
--Testcase 484:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 485:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
-- ===================================================================
-- create objects used through FDW sqlite server
-- ===================================================================
--Testcase 486:
CREATE SCHEMA "S 1";
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO "S 1";
--Testcase 1:
INSERT INTO "S 1"."T 1"
SELECT id,
id % 10,
to_char(id, 'FM00000'),
'1970-01-01'::timestamptz + ((id % 100) || ' days')::interval,
'1970-01-01'::timestamp + ((id % 100) || ' days')::interval,
id % 10,
id % 10,
'foo'
FROM generate_series(1, 1000) id;
--Testcase 2:
INSERT INTO "S 1"."T 2"
SELECT id,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 3:
INSERT INTO "S 1"."T 3"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 487:
DELETE FROM "S 1"."T 3" WHERE c1 % 2 != 0; -- delete for outer join tests
--Testcase 4:
INSERT INTO "S 1"."T 4"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 488:
DELETE FROM "S 1"."T 4" WHERE c1 % 3 != 0; -- delete for outer join tests
/*ANALYZE "S 1"."T 1";
ANALYZE "S 1"."T 2";
ANALYZE "S 1"."T 3";
ANALYZE "S 1"."T 4";*/
-- ===================================================================
-- create foreign tables
-- ===================================================================
--Testcase 489:
CREATE FOREIGN TABLE ft1 (
c0 int,
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr;
ALTER FOREIGN TABLE ft1 DROP COLUMN c0;
--Testcase 490:
CREATE FOREIGN TABLE ft2 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
cx int,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft2',
c8 text
) SERVER sqlite_svr;
ALTER FOREIGN TABLE ft2 DROP COLUMN cx;
--Testcase 491:
CREATE FOREIGN TABLE ft4 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 3');
--Testcase 492:
CREATE FOREIGN TABLE ft5 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 4');
--Testcase 493:
CREATE FOREIGN TABLE ft6 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr2 OPTIONS (table 'T 4');
ALTER FOREIGN TABLE ft1 OPTIONS (table 'T 1');
ALTER FOREIGN TABLE ft2 OPTIONS (table 'T 1');
ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
ALTER FOREIGN TABLE ft2 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 5:
\det+
-- Test that alteration of server options causes reconnection
-- Remote's errors might be non-English, so hide them to ensure stable results
\set VERBOSITY terse
--Testcase 6:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work
ALTER SERVER sqlite_svr OPTIONS (SET database 'no such database');
--Testcase 7:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should fail
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_svr
OPTIONS (SET database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
--Testcase 8:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work again
\set VERBOSITY default
-- Now we should be able to run ANALYZE.
-- To exercise multiple code paths, we use local stats on ft1
-- and remote-estimate mode on ft2.
--ANALYZE ft1;
--ALTER FOREIGN TABLE ft2 OPTIONS (use_remote_estimate 'true');
-- ===================================================================
-- simple queries
-- ===================================================================
-- single table without alias
--Testcase 9:
EXPLAIN (COSTS OFF) SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
--Testcase 10:
SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
-- single table with alias - also test that tableoid sort is not pushed to remote side
--Testcase 11:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
--Testcase 12:
SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
-- whole-row reference
--Testcase 13:
EXPLAIN (VERBOSE, COSTS OFF) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 14:
SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- empty result
--Testcase 15:
SELECT * FROM ft1 WHERE false;
-- with WHERE clause
--Testcase 16:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
--Testcase 17:
SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
-- with FOR UPDATE/SHARE
--Testcase 18:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 19:
SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 20:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
--Testcase 21:
SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
-- aggregate
--Testcase 22:
SELECT COUNT(*) FROM ft1 t1;
-- subquery
--Testcase 23:
SELECT * FROM ft1 t1 WHERE t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 <= 10) ORDER BY c1;
-- subquery+MAX
--Testcase 24:
SELECT * FROM ft1 t1 WHERE t1.c3 = (SELECT MAX(c3) FROM ft2 t2) ORDER BY c1;
-- used in CTE
--Testcase 25:
WITH t1 AS (SELECT * FROM ft1 WHERE c1 <= 10) SELECT t2.c1, t2.c2, t2.c3, t2.c4 FROM t1, ft2 t2 WHERE t1.c1 = t2.c1 ORDER BY t1.c1;
-- fixed values
--Testcase 26:
SELECT 'fixed', NULL FROM ft1 t1 WHERE c1 = 1;
-- Test forcing the remote server to produce sorted data for a merge join.
SET enable_hashjoin TO false;
SET enable_nestloop TO false;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 27:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 28:
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 29:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 30:
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- A join between local table and foreign join. ORDER BY clause is added to the
-- foreign join so that the local table can be joined using merge join strategy.
--Testcase 31:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 32:
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above, except that the full join prevents any equivalence
-- classes from being merged. This produces single relation equivalence classes
-- included in join restrictions.
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 34:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above with all full outer joins
--Testcase 35:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 36:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
RESET enable_hashjoin;
RESET enable_nestloop;
-- ===================================================================
-- WHERE with remotely-executable conditions
-- ===================================================================
--Testcase 37:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 1; -- Var, OpExpr(b), Const
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = 0; -- BoolExpr
--Testcase 39:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NULL; -- NullTest
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NOT NULL; -- NullTest
--Testcase 41:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = -c1; -- OpExpr(l)
--Testcase 43:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE 1 = c1!; -- OpExpr(r)
--Testcase 44:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE (c1 IS NOT NULL) IS DISTINCT FROM (c1 IS NOT NULL); -- DistinctExpr
--Testcase 45:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = ANY(ARRAY[c2, 1, c1 + 0]); -- ScalarArrayOpExpr
--Testcase 46:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = (ARRAY[c1,c2,3])[1]; -- SubscriptingRef
--Testcase 47:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c6 = E'foo''s\\bar'; -- check special chars
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c8 = 'foo'; -- can't be sent to remote
-- parameterized remote path for foreign table
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2;
--Testcase 50:
SELECT * FROM ft2 a, ft2 b WHERE a.c1 = 47 AND b.c1 = a.c2;
-- check both safe and unsafe join conditions
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
--Testcase 52:
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
-- bug before 9.3.5 due to sloppy handling of remote-estimate parameters
--Testcase 53:
SELECT * FROM ft1 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft2 WHERE c1 < 5));
--Testcase 54:
SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5));
-- we should not push order by clause with volatile expressions or unsafe
-- collations
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, random();
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C";
-- user-defined operator/function
--Testcase 494:
CREATE FUNCTION sqlite_fdw_abs(int) RETURNS int AS $$
BEGIN
RETURN abs($1);
END
$$ LANGUAGE plpgsql IMMUTABLE;
--Testcase 495:
CREATE OPERATOR === (
LEFTARG = int,
RIGHTARG = int,
PROCEDURE = int4eq,
COMMUTATOR = ===
);
-- built-in operators and functions can be shipped for remote execution
--Testcase 57:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 58:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 59:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 60:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
-- by default, user-defined ones cannot
--Testcase 61:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 62:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 63:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 64:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- ORDER BY can be shipped, though
--Testcase 496:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 497:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- but let's put them in an extension ...
ALTER EXTENSION sqlite_fdw ADD FUNCTION sqlite_fdw_abs(int);
ALTER EXTENSION sqlite_fdw ADD OPERATOR === (int, int);
--ALTER SERVER sqlite_svr2 OPTIONS (ADD extensions 'sqlite_fdw');
-- ... now they can be shipped
--Testcase 498:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 499:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 500:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 501:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- and both ORDER BY and LIMIT can be shipped
--Testcase 502:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 503:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- ===================================================================
-- JOIN queries
-- ===================================================================
-- Analyze ft4 and ft5 so that we have better statistics. These tables do not
-- have use_remote_estimate set.
--ANALYZE ft4;
--ANALYZE ft5;
-- join two tables
--Testcase 65:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 66:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join three tables
--Testcase 67:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 68:
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
-- left outer join
--Testcase 69:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 70:
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- left outer join three tables
--Testcase 71:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 72:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- left outer join + placement of clauses.
-- clauses within the nullable side are not pulled up, but top level clause on
-- non-nullable side is pushed into non-nullable side
--Testcase 73:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
--Testcase 74:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
-- clauses within the nullable side are not pulled up, but the top level clause
-- on nullable side is not pushed down into nullable side
--Testcase 75:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
--Testcase 76:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
-- right outer join
--Testcase 77:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 78:
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
-- right outer join three tables
--Testcase 79:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 80:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- full outer join
--Testcase 81:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
--Testcase 82:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
-- full outer join with restrictions on the joining relations
-- a. the joining relations are both base relations
--Testcase 83:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 84:
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 85:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
--Testcase 86:
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
-- b. one of the joining relations is a base relation and the other is a join
-- relation
--Testcase 87:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 88:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- c. test deparsing the remote query as nested subqueries
--Testcase 89:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 90:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- d. test deparsing rowmarked relations as subqueries
--Testcase 91:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
--Testcase 92:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
-- full outer join + inner join
--Testcase 93:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
--Testcase 94:
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
-- full outer join three tables
--Testcase 95:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 96:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + right outer join
--Testcase 97:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 98:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- right outer join + full outer join
--Testcase 99:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 100:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + left outer join
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 102:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- left outer join + full outer join
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 104:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- right outer join + left outer join
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 106:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- left outer join + right outer join
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 108:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause, only matched rows
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 110:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause with shippable extensions set
--Testcase 504:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--ALTER SERVER sqlite_svr2 OPTIONS (DROP extensions);
-- full outer join + WHERE clause with shippable extensions not set
--Testcase 505:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- join two tables with FOR UPDATE clause
-- tests whole-row reference for row marks
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 112:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
--Testcase 114:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
-- join two tables with FOR SHARE clause
--Testcase 115:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 116:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
--Testcase 118:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
-- join in CTE
--Testcase 119:
EXPLAIN (VERBOSE, COSTS OFF)
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
--Testcase 120:
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
-- ctid with whole-row reference
--Testcase 121:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- SEMI JOIN, not pushed down
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 123:
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- ANTI JOIN, not pushed down
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 125:
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- CROSS JOIN can be pushed down
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 127:
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- different server, not pushed down. No result expected.
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 129:
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe join conditions (c8 has a UDT), not pushed down. Practically a CROSS
-- JOIN since c8 in both tables has same value.
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 131:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe conditions on one side (c8 has a UDT), not pushed down.
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 133:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join where unsafe to pushdown condition in WHERE clause has a column not
-- in the SELECT clause. In this test unsafe clause needs to have column
-- references from both joining sides so that the clause is not pushed down
-- into one of the joining sides.
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 135:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- Aggregate after UNION, for testing setrefs
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
--Testcase 137:
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
-- join with lateral reference
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
--Testcase 139:
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
-- non-Var items in targetlist of the nullable rel of a join preventing
-- push-down in some cases
-- unable to push {ft1, ft2}
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
--Testcase 141:
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
-- ok to push {ft1, ft2} but not {ft1, ft2, ft4}
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
--Testcase 143:
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
-- join with nullable side with some columns with null values
--Testcase 144:
UPDATE ft5 SET c3 = null where c1 % 9 = 0;
--Testcase 145:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
--Testcase 146:
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
-- multi-way join involving multiple merge joins
-- (this case used to have EPQ-related planning problems)
--Testcase 506:
CREATE TABLE local_tbl (c1 int NOT NULL, c2 int NOT NULL, c3 text, CONSTRAINT local_tbl_pkey PRIMARY KEY (c1));
--Testcase 507:
INSERT INTO local_tbl SELECT id, id % 10, to_char(id, 'FM0000') FROM generate_series(1, 1000) id;
ANALYZE local_tbl;
SET enable_nestloop TO false;
SET enable_hashjoin TO false;
--Testcase 147:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 FOR UPDATE;
--Testcase 148:
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 ORDER BY ft1.c1 FOR UPDATE;
RESET enable_nestloop;
RESET enable_hashjoin;
--DROP TABLE local_tbl;
-- check join pushdown in situations where multiple userids are involved
-- Although SQLite FDW does not need User and User mapping to connect to
-- the database file, however, JOIN pushdown is decided by the core code.
-- If outer and inner relation are foreign tables (or joins) belonging to
-- the same server and assigned to the same user, join will be pushed down.
-- Otherwise, join cannot be pushed down.
-- In addition to an exact match of userid, we allow the case where one side
-- has zero userid (implying current user) and the other side has explicit
-- userid that happens to equal the current user; but in that case, pushdown of
-- the join is only valid for the current user.
--Testcase 508:
CREATE ROLE regress_view_owner SUPERUSER;
--Testcase 509:
-- CREATE USER MAPPING FOR regress_view_owner SERVER sqlite_svr;
GRANT SELECT ON ft4 TO regress_view_owner;
GRANT SELECT ON ft5 TO regress_view_owner;
--Testcase 510:
CREATE VIEW v4 AS SELECT * FROM ft4;
--Testcase 511:
CREATE VIEW v5 AS SELECT * FROM ft5;
ALTER VIEW v5 OWNER TO regress_view_owner;
--Testcase 149:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, different view owners
--Testcase 150:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
ALTER VIEW v4 OWNER TO regress_view_owner;
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 152:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, view owner not current user
--Testcase 154:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
ALTER VIEW v4 OWNER TO CURRENT_USER;
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 156:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
ALTER VIEW v4 OWNER TO regress_view_owner;
-- cleanup
--Testcase 512:
DROP OWNED BY regress_view_owner;
--Testcase 513:
DROP ROLE regress_view_owner;
-- ===================================================================
-- Aggregate and grouping queries
-- ===================================================================
-- Simple aggregates
--Testcase 157:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 158:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 514:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
--Testcase 515:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
-- Aggregate is not pushed down as aggregation contains random()
--Testcase 159:
explain (verbose, costs off)
select sum(c1 * (random() <= 1)::int) as sum, avg(c1) from ft1;
-- Aggregate over join query
--Testcase 160:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
--Testcase 161:
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
-- Not pushed down due to local conditions present in underneath input rel
--Testcase 162:
explain (verbose, costs off)
select sum(t1.c1), count(t2.c1) from ft1 t1 inner join ft2 t2 on (t1.c1 = t2.c1) where ((t1.c1 * t2.c1)/(t1.c1 * t2.c1)) * random() <= 1;
-- GROUP BY clause having expressions
--Testcase 163:
explain (verbose, costs off)
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
--Testcase 164:
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
-- Aggregates in subquery are pushed down.
--Testcase 165:
explain (verbose, costs off)
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
--Testcase 166:
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
-- Aggregate is still pushed down by taking unshippable expression out
--Testcase 167:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
--Testcase 168:
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
-- Aggregate with unshippable GROUP BY clause are not pushed
--Testcase 169:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as c2 from ft2 group by c2 * (random() <= 1)::int order by 1;
-- GROUP BY clause in various forms, cardinal, alias and constant expression
--Testcase 516:
explain (verbose, costs off)
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
--Testcase 517:
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
-- GROUP BY clause referring to same column multiple times
-- Also, ORDER BY contains an aggregate function
--Testcase 170:
explain (verbose, costs off)
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
--Testcase 171:
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
-- Testing HAVING clause shippability
--Testcase 172:
explain (verbose, costs off)
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
--Testcase 173:
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
-- Unshippable HAVING clause will be evaluated locally, and other qual in HAVING clause is pushed down
--Testcase 174:
explain (verbose, costs off)
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
--Testcase 175:
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
-- Aggregate in HAVING clause is not pushable, and thus aggregation is not pushed down
--Testcase 176:
explain (verbose, costs off)
select sum(c1) from ft1 group by c2 having avg(c1 * (random() <= 1)::int) > 100 order by 1;
-- Remote aggregate in combination with a local Param (for the output
-- of an initplan) can be trouble, per bug #15781
--Testcase 518:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 519:
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 520:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
--Testcase 521:
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
-- Testing ORDER BY, DISTINCT, FILTER, Ordered-sets and VARIADIC within aggregates
-- ORDER BY within aggregate, same column used to order
--Testcase 177:
explain (verbose, costs off)
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
--Testcase 178:
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
-- ORDER BY within aggregate, different column used to order also using DESC
--Testcase 179:
explain (verbose, costs off)
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
--Testcase 180:
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
-- DISTINCT within aggregate
--Testcase 181:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 182:
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- DISTINCT combined with ORDER BY within aggregate
--Testcase 183:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 184:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 185:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 186:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- FILTER within aggregate
--Testcase 187:
explain (verbose, costs off)
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
--Testcase 188:
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
-- DISTINCT, ORDER BY and FILTER within aggregate
--Testcase 189:
explain (verbose, costs off)
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
--Testcase 190:
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
-- Outer query is aggregation query
--Testcase 191:
explain (verbose, costs off)
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 192:
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Inner query is aggregation query
--Testcase 193:
explain (verbose, costs off)
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 194:
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Aggregate not pushed down as FILTER condition is not pushable
--Testcase 195:
explain (verbose, costs off)
select sum(c1) filter (where (c1 / c1) * random() <= 1) from ft1 group by c2 order by 1;
--Testcase 196:
explain (verbose, costs off)
select sum(c2) filter (where c2 in (select c2 from ft1 where c2 < 5)) from ft1;
-- Ordered-sets within aggregate
--Testcase 197:
explain (verbose, costs off)
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
--Testcase 198:
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
-- Using multiple arguments within aggregates
--Testcase 199:
explain (verbose, costs off)
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
--Testcase 200:
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
-- User defined function for user defined aggregate, VARIADIC
--Testcase 522:
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)';
--Testcase 523:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
-- Disable hash aggregation for plan stability.
set enable_hashagg to false;
-- Not pushed down due to user defined aggregate
--Testcase 524:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Add function and aggregate into extension
--alter extension postgres_fdw add function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw add aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now aggregate will be pushed. Aggregate will display VARIADIC argument.
--Testcase 525:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
--Testcase 526:
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
-- Remove function and aggregate from extension
--alter extension postgres_fdw drop function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw drop aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Not pushed down as we have dropped objects from extension.
--Testcase 527:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Cleanup
reset enable_hashagg;
--Testcase 528:
drop aggregate least_agg(variadic items anyarray);
--Testcase 529:
drop function least_accum(anyelement, variadic anyarray);
-- Testing USING OPERATOR() in ORDER BY within aggregate.
-- For this, we need user defined operators along with operator family and
-- operator class. Create those and then add them in extension. Note that
-- user defined objects are considered unshippable unless they are part of
-- the extension.
--Testcase 530:
create operator public.<^ (
leftarg = int4,
rightarg = int4,
procedure = int4eq
);
--Testcase 531:
create operator public.=^ (
leftarg = int4,
rightarg = int4,
procedure = int4lt
);
--Testcase 532:
create operator public.>^ (
leftarg = int4,
rightarg = int4,
procedure = int4gt
);
--Testcase 533:
create operator family my_op_family using btree;
--Testcase 534:
create function my_op_cmp(a int, b int) returns int as
$$begin return btint4cmp(a, b); end $$ language plpgsql;
--Testcase 535:
create operator class my_op_class for type int using btree family my_op_family as
operator 1 public.<^,
operator 3 public.=^,
operator 5 public.>^,
function 1 my_op_cmp(int, int);
-- This will not be pushed as user defined sort operator is not part of the
-- extension yet.
--Testcase 536:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Update local stats on ft2
--ANALYZE ft2;
-- Add into extension
alter extension sqlite_fdw add operator class my_op_class using btree;
alter extension sqlite_fdw add function my_op_cmp(a int, b int);
alter extension sqlite_fdw add operator family my_op_family using btree;
alter extension sqlite_fdw add operator public.<^(int, int);
alter extension sqlite_fdw add operator public.=^(int, int);
alter extension sqlite_fdw add operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now this will be pushed as sort operator is part of the extension.
--Testcase 537:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
--Testcase 538:
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Remove from extension
alter extension sqlite_fdw drop operator class my_op_class using btree;
alter extension sqlite_fdw drop function my_op_cmp(a int, b int);
alter extension sqlite_fdw drop operator family my_op_family using btree;
alter extension sqlite_fdw drop operator public.<^(int, int);
alter extension sqlite_fdw drop operator public.=^(int, int);
alter extension sqlite_fdw drop operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- This will not be pushed as sort operator is now removed from the extension.
--Testcase 539:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Cleanup
--Testcase 540:
drop operator class my_op_class using btree;
--Testcase 541:
drop function my_op_cmp(a int, b int);
--Testcase 542:
drop operator family my_op_family using btree;
--Testcase 543:
drop operator public.>^(int, int);
--Testcase 544:
drop operator public.=^(int, int);
--Testcase 545:
drop operator public.<^(int, int);
-- Input relation to aggregate push down hook is not safe to pushdown and thus
-- the aggregate cannot be pushed down to foreign server.
--Testcase 201:
explain (verbose, costs off)
select count(t1.c3) from ft2 t1 left join ft2 t2 on (t1.c1 = random() * t2.c2);
-- Subquery in FROM clause having aggregate
--Testcase 202:
explain (verbose, costs off)
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
--Testcase 203:
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
-- FULL join with IS NULL check in HAVING
--Testcase 204:
explain (verbose, costs off)
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
--Testcase 205:
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
-- Aggregate over FULL join needing to deparse the joining relations as
-- subqueries.
--Testcase 206:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
--Testcase 207:
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
-- ORDER BY expression is part of the target list but not pushed down to
-- foreign server.
--Testcase 208:
explain (verbose, costs off)
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
--Testcase 209:
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
-- LATERAL join, with parameterization
set enable_hashagg to false;
--Testcase 210:
explain (verbose, costs off)
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 211:
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
reset enable_hashagg;
-- bug #15613: bad plan for foreign table scan with lateral reference
--Testcase 546:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
--Testcase 547:
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
-- Check with placeHolderVars
--Testcase 212:
explain (verbose, costs off)
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
--Testcase 213:
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
-- Not supported cases
-- Grouping sets
--Testcase 214:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 215:
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 216:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 217:
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 218:
explain (verbose, costs off)
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 219:
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 220:
explain (verbose, costs off)
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
--Testcase 221:
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
-- DISTINCT itself is not pushed down, whereas underneath aggregate is pushed
--Testcase 222:
explain (verbose, costs off)
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
--Testcase 223:
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
-- WindowAgg
--Testcase 224:
explain (verbose, costs off)
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 225:
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 226:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 227:
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 228:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 229:
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
-- ===================================================================
-- parameterized queries
-- ===================================================================
-- simple join
--Testcase 230:
PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $1 AND t2.c1 = $2;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2);
--Testcase 232:
EXECUTE st1(1, 1);
--Testcase 233:
EXECUTE st1(101, 101);
-- subquery using stable function (can't be sent to remote)
--Testcase 234:
PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1;
--Testcase 235:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st2(10, 20);
--Testcase 236:
EXECUTE st2(10, 20);
--Testcase 237:
EXECUTE st2(101, 121);
-- subquery using immutable function (can be sent to remote)
--Testcase 238:
PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1;
--Testcase 239:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st3(10, 20);
--Testcase 240:
EXECUTE st3(10, 20);
--Testcase 241:
EXECUTE st3(20, 30);
-- custom plan should be chosen initially
--Testcase 242:
PREPARE st4(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 = $1;
--Testcase 243:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 244:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 245:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 246:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 247:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- once we try it enough times, should switch to generic plan
--Testcase 248:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- value of $1 should not be sent to remote
--Testcase 249:
PREPARE st5(text,int) AS SELECT * FROM ft1 t1 WHERE c8 = $1 and c1 = $2;
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 254:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 255:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 256:
EXECUTE st5('foo', 1);
-- altering FDW options requires replanning
--Testcase 257:
PREPARE st6 AS SELECT * FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 258:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 259:
PREPARE st7 AS INSERT INTO ft1 (c1,c2,c3) VALUES (1001,101,'foo');
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 548:
INSERT INTO "S 1"."T 0" SELECT * FROM "S 1"."T 1";
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 0');
--Testcase 261:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 262:
EXECUTE st6;
--Testcase 263:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 1');
--Testcase 549:
PREPARE st8 AS SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 550:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 551:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--Testcase 552:
EXECUTE st8;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- cleanup
DEALLOCATE st1;
DEALLOCATE st2;
DEALLOCATE st3;
DEALLOCATE st4;
DEALLOCATE st5;
DEALLOCATE st6;
DEALLOCATE st7;
DEALLOCATE st8;
-- System columns, except ctid and oid, should not be sent to remote
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'pg_class'::regclass LIMIT 1;
--Testcase 265:
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'ft1'::regclass LIMIT 1;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 267:
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 553:
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 554:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ctid, * FROM ft1 t1 LIMIT 1;
--Testcase 271:
SELECT ctid, * FROM ft1 t1 LIMIT 1;
-- ===================================================================
-- used in PL/pgSQL function
-- ===================================================================
--Testcase 555:
CREATE OR REPLACE FUNCTION f_test(p_c1 int) RETURNS int AS $$
DECLARE
v_c1 int;
BEGIN
--Testcase 556:
SELECT c1 INTO v_c1 FROM ft1 WHERE c1 = p_c1 LIMIT 1;
PERFORM c1 FROM ft1 WHERE c1 = p_c1 AND p_c1 = v_c1 LIMIT 1;
RETURN v_c1;
END;
$$ LANGUAGE plpgsql;
--Testcase 272:
SELECT f_test(100);
--Testcase 557:
DROP FUNCTION f_test(int);
-- ===================================================================
-- conversion error
-- ===================================================================
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE int;
--Testcase 273:
SELECT * FROM ft1 WHERE c1 = 1;
--Testcase 274:
SELECT ft1.c1, ft2.c2, ft1.c8 FROM ft1, ft2 WHERE ft1.c1 = ft2.c1 AND ft1.c1 = 1;
--Testcase 275:
SELECT ft1.c1, ft2.c2, ft1 FROM ft1, ft2 WHERE ft1.c1 = ft2.c1 AND ft1.c1 = 1;
--Testcase 276:
SELECT sum(c2), array_agg(c8) FROM ft1 GROUP BY c8;
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE text;
-- ===================================================================
-- subtransaction
-- + local/remote error doesn't break cursor
-- ===================================================================
BEGIN;
DECLARE c CURSOR FOR SELECT * FROM ft1 ORDER BY c1;
--Testcase 277:
FETCH c;
SAVEPOINT s;
ERROR OUT; -- ERROR
ROLLBACK TO s;
--Testcase 278:
FETCH c;
SAVEPOINT s;
--Testcase 279:
SELECT * FROM ft1 WHERE 1 / (c1 - 1) > 0; -- ERROR
ROLLBACK TO s;
--Testcase 280:
FETCH c;
--Testcase 281:
SELECT * FROM ft1 ORDER BY c1 LIMIT 1;
COMMIT;
-- ===================================================================
-- test handling of collations
-- ===================================================================
--Testcase 558:
create foreign table ft3 (f1 text collate "C", f2 text, f3 varchar(10)) server sqlite_svr;
-- can be sent to remote
--Testcase 559:
explain (verbose, costs off) select * from ft3 where f1 = 'foo';
--Testcase 560:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "C" = 'foo';
--Testcase 561:
explain (verbose, costs off) select * from ft3 where f2 = 'foo';
--Testcase 562:
explain (verbose, costs off) select * from ft3 where f3 = 'foo';
--Testcase 563:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 and l.f1 = 'foo';
-- can't be sent to remote
--Testcase 564:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "POSIX" = 'foo';
--Testcase 565:
explain (verbose, costs off) select * from ft3 where f1 = 'foo' COLLATE "C";
--Testcase 566:
explain (verbose, costs off) select * from ft3 where f2 COLLATE "C" = 'foo';
--Testcase 567:
explain (verbose, costs off) select * from ft3 where f2 = 'foo' COLLATE "C";
--Testcase 568:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 COLLATE "POSIX" and l.f1 = 'foo';
-- ===================================================================
-- test writable foreign table stuff
-- ===================================================================
--Testcase 282:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 283:
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 284:
INSERT INTO ft2 (c1,c2,c3) VALUES (1101,201,'aaa'), (1102,202,'bbb'), (1103,203,'ccc');
--Testcase 285:
SELECT * FROM ft2 WHERE c1 >= 1101;
--Testcase 286:
INSERT INTO ft2 (c1,c2,c3) VALUES (1104,204,'ddd'), (1105,205,'eee');
--Testcase 287:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3; -- can be pushed down
--Testcase 288:
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3;
--Testcase 289:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7; -- can be pushed down
--Testcase 290:
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7;
--Testcase 291:
SELECT * FROM ft2 WHERE c1 % 10 = 7;
--Testcase 292:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9; -- can be pushed down
--Testcase 293:
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9;
--Testcase 294:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 % 10 = 5; -- can be pushed down
--Testcase 295:
SELECT c1, c4 FROM ft2 WHERE c1 % 10 = 5;
--Testcase 569:
DELETE FROM ft2 WHERE c1 % 10 = 5;
--Testcase 297:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2; -- can be pushed down
--Testcase 298:
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
--Testcase 299:
SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1;
--Testcase 300:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 301:
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 302:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200; -- can be pushed down
--Testcase 303:
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200;
--Testcase 304:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 = 1200; -- can be pushed down
--Testcase 305:
DELETE FROM ft2 WHERE c1 = 1200;
-- Test UPDATE/DELETE on a three-table join
--Testcase 306:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id;
--Testcase 307:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 308:
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1;
--Testcase 309:
SELECT ft2, ft2.*, ft4, ft4.*
FROM ft2 INNER JOIN ft4 ON (ft2.c1 > 1200 AND ft2.c2 = ft4.c1)
INNER JOIN ft5 ON (ft4.c1 = ft5.c1);
--Testcase 310:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 311:
SELECT 100 FROM ft2, ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 570:
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 312:
DELETE FROM ft2 WHERE ft2.c1 > 1200;
-- Test UPDATE with a MULTIEXPR sub-select
-- (maybe someday this'll be remotely executable, but not today)
--Testcase 571:
EXPLAIN (verbose, costs off)
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 572:
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 573:
UPDATE ft2 AS target SET (c2) = (
SELECT c2 / 10
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
-- Test UPDATE/DELETE with WHERE or JOIN/ON conditions containing
-- user-defined operators/functions
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 574:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id % 10, to_char(id, 'FM00000') FROM generate_series(2001, 2010) id;
--Testcase 575:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000; -- can't be pushed down
--Testcase 576:
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 577:
SELECT * FROM ft2 WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 578:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1; -- can't be pushed down
--Testcase 579:
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 580:
SELECT ft2.*, ft4.*, ft5.*
FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 581:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 582:
SELECT ft2.c1, ft2.c2, ft2.c3 FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 583:
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1;
--Testcase 584:
DELETE FROM ft2 WHERE ft2.c1 > 2000;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- Test that trigger on remote table works as expected
--Testcase 585:
CREATE OR REPLACE FUNCTION "S 1".F_BRTRIG() RETURNS trigger AS $$
BEGIN
NEW.c3 = NEW.c3 || '_trig_update';
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
--Testcase 586:
CREATE TRIGGER t1_br_insert BEFORE INSERT OR UPDATE
ON ft2 FOR EACH ROW EXECUTE PROCEDURE "S 1".F_BRTRIG();
--Testcase 313:
INSERT INTO ft2 (c1,c2,c3) VALUES (1208, 818, 'fff');
--Testcase 314:
SELECT * FROM ft2 WHERE c1 = 1208;
--Testcase 315:
INSERT INTO ft2 (c1,c2,c3,c6) VALUES (1218, 818, 'ggg', '(--;');
--Testcase 316:
SELECT * FROM ft2 WHERE c1 = 1218;
--Testcase 317:
UPDATE ft2 SET c2 = c2 + 600, c3 = c3 WHERE c1 % 10 = 8 AND c1 < 1200;
--Testcase 318:
SELECT * FROM ft2 WHERE c1 % 10 = 8 AND c1 < 1200;
-- Test errors thrown on remote side during update
-- create table in the remote server with check contraint
--Testcase 738:
CREATE FOREIGN TABLE ft1_constraint (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr OPTIONS (table 't1_constraint');
--Testcase 747:
INSERT INTO ft1_constraint SELECT * FROM ft1 ON CONFLICT DO NOTHING;
-- c2 must be greater than or equal to 0, so this case is ignored.
--Testcase 754:
INSERT INTO ft1_constraint(c1, c2) VALUES (2222, -2) ON CONFLICT DO NOTHING; -- ignore, do nothing
--Testcase 755:
SELECT c1, c2 FROM ft1_constraint WHERE c1 = 2222 or c2 = -2; -- empty result
--Testcase 748:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 749:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
--Testcase 319:
INSERT INTO ft1(c1, c2) VALUES(11, 12); -- duplicate key
--Testcase 320:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO NOTHING; -- unsupported
--Testcase 321:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO UPDATE SET c3 = 'ffg'; -- unsupported
--Testcase 743:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 744:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 750:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_constraint;
--Testcase 751:
ALTER FOREIGN TABLE ft1_org RENAME TO ft1;
-- Test savepoint/rollback behavior
--Testcase 322:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 323:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
begin;
--Testcase 324:
update ft2 set c2 = 42 where c2 = 0;
--Testcase 325:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s1;
--Testcase 326:
update ft2 set c2 = 44 where c2 = 4;
--Testcase 327:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s1;
--Testcase 328:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s2;
--Testcase 329:
update ft2 set c2 = 46 where c2 = 6;
--Testcase 330:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
rollback to savepoint s2;
--Testcase 331:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s2;
--Testcase 332:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s3;
--Testcase 333:
--skip, does not support CHECK
--update ft2 set c2 = -2 where c2 = 42 and c1 = 10; -- fail on remote side
rollback to savepoint s3;
--Testcase 334:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s3;
--Testcase 335:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
-- none of the above is committed yet remotely
--Testcase 336:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
commit;
--Testcase 337:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 338:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
--VACUUM ANALYZE "S 1"."T 1";
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
-- FIRST behavior here.
-- ORDER BY DESC NULLS LAST options
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
--Testcase 340:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
-- ORDER BY DESC NULLS FIRST options
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 342:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ORDER BY ASC NULLS FIRST options
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 344:
SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ===================================================================
-- test check constraints
-- ===================================================================
--Testcase 752:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 753:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
-- Consistent check constraints provide consistent results
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2positive CHECK (c2 >= 0);
--Testcase 587:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 588:
SELECT count(*) FROM ft1 WHERE c2 < 0;
SET constraint_exclusion = 'on';
--Testcase 589:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 590:
SELECT count(*) FROM ft1 WHERE c2 < 0;
RESET constraint_exclusion;
-- check constraint is enforced on the remote side, not locally
--Testcase 745:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 746:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2positive;
-- But inconsistent check constraints provide inconsistent results
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2negative CHECK (c2 < 0);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 592:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
SET constraint_exclusion = 'on';
--Testcase 593:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 594:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
RESET constraint_exclusion;
-- local check constraint is not actually enforced
--Testcase 595:
INSERT INTO ft1(c1, c2) VALUES(1111, 2);
--Testcase 596:
UPDATE ft1 SET c2 = c2 + 1 WHERE c1 = 1;
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2negative;
-- ===================================================================
-- test WITH CHECK OPTION constraints
-- ===================================================================
--Testcase 597:
CREATE FUNCTION row_before_insupd_trigfunc() RETURNS trigger AS $$BEGIN NEW.a := NEW.a + 10; RETURN NEW; END$$ LANGUAGE plpgsql;
--Testcase 598:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 599:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 600:
CREATE VIEW rw_view AS SELECT * FROM foreign_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 601:
\d+ rw_view
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 602:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 603:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 604:
INSERT INTO rw_view VALUES (0, 15); -- error
--Testcase 605:
SELECT * FROM foreign_tbl;
--Testcase 606:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 607:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 608:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 609:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 610:
SELECT * FROM foreign_tbl;
--Testcase 611:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 612:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
-- test WCO for partitions
--Testcase 613:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 614:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 615:
CREATE TABLE parent_tbl (a int, b int) PARTITION BY RANGE(a);
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
--Testcase 616:
CREATE VIEW rw_view AS SELECT * FROM parent_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 617:
\d+ rw_view
--Testcase 618:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 619:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 620:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 621:
INSERT INTO rw_view VALUES (0, 15); -- ok
--Testcase 622:
SELECT * FROM foreign_tbl;
--Testcase 623:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 624:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 625:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 626:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 627:
SELECT * FROM foreign_tbl;
--Testcase 628:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
--Testcase 629:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 630:
DROP TABLE parent_tbl CASCADE;
--Testcase 631:
DROP FUNCTION row_before_insupd_trigfunc;
-- ===================================================================
-- test serial columns (ie, sequence-based defaults)
-- ===================================================================
--Testcase 632:
create foreign table loc1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr;
--Testcase 633:
create foreign table rem1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr options(table 'loc1');
--Testcase 352:
select pg_catalog.setval('rem1_f1_seq', 10, false);
--Testcase 353:
insert into loc1(f2) values('hi');
--Testcase 634:
insert into rem1(f2) values('hi remote');
--Testcase 354:
insert into loc1(f2) values('bye');
--Testcase 635:
insert into rem1(f2) values('bye remote');
--Testcase 355:
select f1, f2 from loc1;
--Testcase 636:
select f1, f2 from rem1;
-- ===================================================================
-- test generated columns
-- ===================================================================
--Testcase 637:
create foreign table grem1 (
a int options (key 'true'),
b int generated always as (a * 2) stored)
server sqlite_svr;
--Testcase 638:
insert into grem1 (a) values (1), (2);
--Testcase 639:
update grem1 set a = 22 where a = 2;
--Testcase 640:
select * from grem1;
-- ===================================================================
-- test local triggers
-- ===================================================================
-- Trigger functions "borrowed" from triggers regress test.
--Testcase 641:
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;$$;
--Testcase 642:
CREATE TRIGGER trig_stmt_before BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 643:
CREATE TRIGGER trig_stmt_after AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 644:
CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger
LANGUAGE plpgsql AS $$
declare
oldnew text[];
relid text;
argstr text;
begin
relid := TG_relid::regclass;
argstr := '';
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 '%(%) % % % ON %',
tg_name, argstr, TG_when, TG_level, TG_OP, relid;
oldnew := '{}'::text[];
if TG_OP != 'INSERT' then
oldnew := array_append(oldnew, format('OLD: %s', OLD));
end if;
if TG_OP != 'DELETE' then
oldnew := array_append(oldnew, format('NEW: %s', NEW));
end if;
RAISE NOTICE '%', array_to_string(oldnew, ',');
if TG_OP = 'DELETE' then
return OLD;
else
return NEW;
end if;
end;
$$;
-- Test basic functionality
--Testcase 645:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 646:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 356:
delete from rem1;
--Testcase 357:
insert into rem1 values(1,'insert');
--Testcase 358:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 359:
update rem1 set f2 = f2 || f2;
-- cleanup
--Testcase 647:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 648:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 649:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 650:
DROP TRIGGER trig_stmt_after ON rem1;
--Testcase 360:
DELETE from rem1;
-- Test multiple AFTER ROW triggers on a foreign table
--Testcase 651:
CREATE TRIGGER trig_row_after1
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 652:
CREATE TRIGGER trig_row_after2
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 653:
insert into rem1 values(1,'insert');
--Testcase 654:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 655:
update rem1 set f2 = f2 || f2;
--Testcase 656:
delete from rem1;
-- cleanup
--Testcase 657:
DROP TRIGGER trig_row_after1 ON rem1;
--Testcase 658:
DROP TRIGGER trig_row_after2 ON rem1;
-- Test WHEN conditions
--Testcase 659:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 660:
CREATE TRIGGER trig_row_after_insupd
AFTER INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Insert or update not matching: nothing happens
--Testcase 363:
INSERT INTO rem1 values(1, 'insert');
--Testcase 364:
UPDATE rem1 set f2 = 'test';
-- Insert or update matching: triggers are fired
--Testcase 365:
INSERT INTO rem1 values(2, 'update');
--Testcase 366:
UPDATE rem1 set f2 = 'update update' where f1 = '2';
--Testcase 661:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 662:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Trigger is fired for f1=2, not for f1=1
--Testcase 369:
DELETE FROM rem1;
-- cleanup
--Testcase 663:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 664:
DROP TRIGGER trig_row_after_insupd ON rem1;
--Testcase 665:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 666:
DROP TRIGGER trig_row_after_delete ON rem1;
-- Test various RETURN statements in BEFORE triggers.
--Testcase 667:
CREATE FUNCTION trig_row_before_insupdate() RETURNS TRIGGER AS $$
BEGIN
NEW.f2 := NEW.f2 || ' triggered !';
RETURN NEW;
END
$$ language plpgsql;
--Testcase 668:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
-- The new values should have 'triggered' appended
--Testcase 370:
INSERT INTO rem1 values(1, 'insert');
--Testcase 371:
SELECT f1, f2 from rem1;
--Testcase 372:
INSERT INTO rem1 values(2, 'insert');
--Testcase 373:
SELECT f1, f2 from rem1;
--Testcase 374:
UPDATE rem1 set f2 = '';
--Testcase 375:
SELECT f1, f2 from rem1;
--Testcase 376:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 377:
SELECT f1, f2 from rem1;
--Testcase 669:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f1 = 10; -- all columns should be transmitted
--Testcase 670:
UPDATE rem1 set f1 = 10;
--Testcase 671:
SELECT f1, f2 from rem1;
--Testcase 378:
DELETE FROM rem1;
-- Add a second trigger, to check that the changes are propagated correctly
-- from trigger to trigger
--Testcase 672:
CREATE TRIGGER trig_row_before_insupd2
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 379:
INSERT INTO rem1 values(1, 'insert');
--Testcase 380:
SELECT f1, f2 from rem1;
--Testcase 381:
INSERT INTO rem1 values(2, 'insert');
--Testcase 382:
SELECT f1, f2 from rem1;
--Testcase 383:
UPDATE rem1 set f2 = '';
--Testcase 384:
SELECT f1, f2 from rem1;
--Testcase 385:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 386:
SELECT f1, f2 from rem1;
--Testcase 673:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 674:
DROP TRIGGER trig_row_before_insupd2 ON rem1;
--Testcase 387:
DELETE from rem1;
--Testcase 388:
INSERT INTO rem1 VALUES (1, 'test');
-- Test with a trigger returning NULL
--Testcase 675:
CREATE FUNCTION trig_null() RETURNS TRIGGER AS $$
BEGIN
RETURN NULL;
END
$$ language plpgsql;
--Testcase 676:
CREATE TRIGGER trig_null
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_null();
-- Nothing should have changed.
--Testcase 389:
INSERT INTO rem1 VALUES (2, 'test2');
--Testcase 390:
SELECT f1, f2 from rem1;
--Testcase 391:
UPDATE rem1 SET f2 = 'test2';
--Testcase 392:
SELECT f1, f2 from rem1;
--Testcase 393:
DELETE from rem1;
--Testcase 394:
SELECT f1, f2 from rem1;
--Testcase 677:
DROP TRIGGER trig_null ON rem1;
--Testcase 395:
DELETE from rem1;
-- Test a combination of local and remote triggers
--Testcase 678:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 679:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 680:
CREATE TRIGGER trig_local_before BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 681:
INSERT INTO rem1(f2) VALUES ('test');
--Testcase 682:
UPDATE rem1 SET f2 = 'testo';
-- Test returning a system attribute
--Testcase 683:
INSERT INTO rem1(f2) VALUES ('test');
-- cleanup
--Testcase 684:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 685:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 686:
DROP TRIGGER trig_local_before ON rem1;
-- Test direct foreign table modification functionality
-- Test with statement-level triggers
--Testcase 687:
CREATE TRIGGER trig_stmt_before
BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 396:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 397:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 688:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 689:
CREATE TRIGGER trig_stmt_after
AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 398:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 399:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 690:
DROP TRIGGER trig_stmt_after ON rem1;
-- Test with row-level ON INSERT triggers
--Testcase 691:
CREATE TRIGGER trig_row_before_insert
BEFORE INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 400:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 401:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 692:
DROP TRIGGER trig_row_before_insert ON rem1;
--Testcase 693:
CREATE TRIGGER trig_row_after_insert
AFTER INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 402:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 403:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 694:
DROP TRIGGER trig_row_after_insert ON rem1;
-- Test with row-level ON UPDATE triggers
--Testcase 695:
CREATE TRIGGER trig_row_before_update
BEFORE UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 404:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 405:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 696:
DROP TRIGGER trig_row_before_update ON rem1;
--Testcase 697:
CREATE TRIGGER trig_row_after_update
AFTER UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 406:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 407:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 698:
DROP TRIGGER trig_row_after_update ON rem1;
-- Test with row-level ON DELETE triggers
--Testcase 699:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 408:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 409:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 700:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 701:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 410:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 411:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 702:
DROP TRIGGER trig_row_after_delete ON rem1;
-- ===================================================================
-- test inheritance features
-- ===================================================================
--Testcase 703:
CREATE TABLE a (aa TEXT);
ALTER TABLE a SET (autovacuum_enabled = 'false');
--Testcase 704:
CREATE FOREIGN TABLE b (aa TEXT OPTIONS (key 'true'), bb TEXT) INHERITS (a)
SERVER sqlite_svr OPTIONS (table 'loct');
--Testcase 412:
INSERT INTO a(aa) VALUES('aaa');
--Testcase 413:
INSERT INTO a(aa) VALUES('aaaa');
--Testcase 414:
INSERT INTO a(aa) VALUES('aaaaa');
--Testcase 415:
INSERT INTO b(aa) VALUES('bbb');
--Testcase 416:
INSERT INTO b(aa) VALUES('bbbb');
--Testcase 417:
INSERT INTO b(aa) VALUES('bbbbb');
--Testcase 418:
SELECT tableoid::regclass, * FROM a;
--Testcase 419:
SELECT tableoid::regclass, * FROM b;
--Testcase 420:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 421:
UPDATE a SET aa = 'zzzzzz' WHERE aa LIKE 'aaaa%';
--Testcase 422:
SELECT tableoid::regclass, * FROM a;
--Testcase 423:
SELECT tableoid::regclass, * FROM b;
--Testcase 424:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 425:
UPDATE b SET aa = 'new';
--Testcase 426:
SELECT tableoid::regclass, * FROM a;
--Testcase 427:
SELECT tableoid::regclass, * FROM b;
--Testcase 428:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 429:
UPDATE a SET aa = 'newtoo';
--Testcase 430:
SELECT tableoid::regclass, * FROM a;
--Testcase 431:
SELECT tableoid::regclass, * FROM b;
--Testcase 432:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 433:
DELETE FROM a;
--Testcase 434:
SELECT tableoid::regclass, * FROM a;
--Testcase 435:
SELECT tableoid::regclass, * FROM b;
--Testcase 436:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 705:
DROP TABLE a CASCADE;
-- Check SELECT FOR UPDATE/SHARE with an inherited source table
--Testcase 706:
create table foo (f1 int, f2 int);
--Testcase 707:
create foreign table foo2 (f3 int OPTIONS (key 'true')) inherits (foo)
server sqlite_svr options (table 'loct1');
--Testcase 708:
create table bar (f1 int, f2 int);
--Testcase 709:
create foreign table bar2 (f3 int OPTIONS (key 'true')) inherits (bar)
server sqlite_svr options (table 'loct2');
alter table foo set (autovacuum_enabled = 'false');
alter table bar set (autovacuum_enabled = 'false');
--Testcase 437:
insert into foo values(1,1);
--Testcase 438:
insert into foo values(3,3);
--Testcase 439:
insert into foo2 values(2,2,2);
--Testcase 440:
insert into foo2 values(4,4,4);
--Testcase 441:
insert into bar values(1,11);
--Testcase 442:
insert into bar values(2,22);
--Testcase 443:
insert into bar values(6,66);
--Testcase 444:
insert into bar2 values(3,33,33);
--Testcase 445:
insert into bar2 values(4,44,44);
--Testcase 446:
insert into bar2 values(7,77,77);
--Testcase 447:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 448:
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 449:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for share;
--Testcase 450:
select * from bar where f1 in (select f1 from foo) for share;
-- Check UPDATE with inherited target and an inherited source table
--Testcase 451:
explain (verbose, costs off)
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 452:
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 453:
select tableoid::regclass, * from bar order by 1,2;
-- Check UPDATE with inherited target and an appendrel subquery
--Testcase 454:
explain (verbose, costs off)
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 455:
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 456:
select tableoid::regclass, * from bar order by 1,2;
-- Test forcing the remote server to produce sorted data for a merge join,
-- but the foreign table is an inheritance child.
--truncate table loct1;
--Testcase 710:
delete from foo2;
truncate table only foo;
\set num_rows_foo 2000
--Testcase 711:
insert into foo2 select generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2);
--Testcase 712:
insert into foo select generate_series(1, :num_rows_foo, 2), generate_series(1, :num_rows_foo, 2);
SET enable_hashjoin to false;
SET enable_nestloop to false;
--alter foreign table foo2 options (use_remote_estimate 'true');
--create index i_loct1_f1 on loct1(f1);
--Testcase 713:
create index i_foo_f1 on foo(f1);
analyze foo;
--analyze loct1;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 714:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 715:
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 716:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 717:
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
RESET enable_hashjoin;
RESET enable_nestloop;
-- Test that WHERE CURRENT OF is not supported
begin;
declare c cursor for select * from bar where f1 = 7;
--Testcase 457:
fetch from c;
--Testcase 458:
update bar set f2 = null where current of c;
rollback;
--Testcase 459:
explain (verbose, costs off)
delete from foo where f1 < 5;
--Testcase 460:
delete from foo where f1 < 5;
--Testcase 461:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 462:
update bar set f2 = f2 + 100;
--Testcase 463:
select * from bar;
-- Test that UPDATE/DELETE with inherited target works with row-level triggers
--Testcase 718:
CREATE TRIGGER trig_row_before
BEFORE UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 719:
CREATE TRIGGER trig_row_after
AFTER UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 464:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 465:
update bar set f2 = f2 + 100;
--Testcase 466:
explain (verbose, costs off)
delete from bar where f2 < 400;
--Testcase 467:
delete from bar where f2 < 400;
-- cleanup
--Testcase 720:
drop table foo cascade;
--Testcase 721:
drop table bar cascade;
-- Test pushing down UPDATE/DELETE joins to the remote server
--Testcase 722:
create table parent (a int, b text);
--Testcase 723:
create foreign table remt1 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct3');
--Testcase 724:
create foreign table remt2 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct4');
alter foreign table remt1 inherit parent;
--Testcase 468:
insert into remt1 values (1, 'foo');
--Testcase 469:
insert into remt1 values (2, 'bar');
--Testcase 470:
insert into remt2 values (1, 'foo');
--Testcase 471:
insert into remt2 values (2, 'bar');
--Testcase 472:
explain (verbose, costs off)
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 473:
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 474:
select * from parent inner join remt2 on (parent.a = remt2.a);
--Testcase 475:
explain (verbose, costs off)
delete from parent using remt2 where parent.a = remt2.a;
--Testcase 476:
delete from parent using remt2 where parent.a = remt2.a;
-- cleanup
--Testcase 725:
drop foreign table remt1;
--Testcase 726:
drop foreign table remt2;
--Testcase 727:
drop table parent;
/*
-- Skip these tests, sqlite fdw does not support partition table, check constraint, copy from
-- ===================================================================
-- test tuple routing for foreign-table partitions
-- ===================================================================
-- Test insert tuple routing
create table itrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table itrtest attach partition remp1 for values in (1);
alter table itrtest attach partition remp2 for values in (2);
insert into itrtest values (1, 'foo');
insert into itrtest values (1, 'bar') returning *;
insert into itrtest values (2, 'baz');
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
select tableoid::regclass, * FROM itrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
delete from itrtest;
create unique index loct1_idx on loct1 (a);
-- DO NOTHING without an inference specification is supported
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
-- But other cases are not supported
insert into itrtest values (1, 'bar') on conflict (a) do nothing;
insert into itrtest values (1, 'bar') on conflict (a) do update set b = excluded.b;
select tableoid::regclass, * FROM itrtest;
delete from itrtest;
drop index loct1_idx;
-- Test that remote triggers work with insert tuple routing
create function br_insert_trigfunc() returns trigger as $$
begin
new.b := new.b || ' triggered !';
return new;
end
$$ language plpgsql;
create trigger loct1_br_insert_trigger before insert on loct1
for each row execute procedure br_insert_trigfunc();
create trigger loct2_br_insert_trigger before insert on loct2
for each row execute procedure br_insert_trigfunc();
-- The new values are concatenated with ' triggered !'
insert into itrtest values (1, 'foo') returning *;
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
with result as (insert into itrtest values (1, 'test1'), (2, 'test2') returning *) select * from result;
drop trigger loct1_br_insert_trigger on loct1;
drop trigger loct2_br_insert_trigger on loct2;
drop table itrtest;
drop table loct1;
drop table loct2;
-- Test update tuple routing
create table utrtest (a int, b text) partition by list (a);
create table loct (a int check (a in (1)), b text);
create foreign table remp (a int check (a in (1)), b text) server loopback options (table_name 'loct');
create table locp (a int check (a in (2)), b text);
alter table utrtest attach partition remp for values in (1);
alter table utrtest attach partition locp for values in (2);
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- It's not allowed to move a row from a partition that is foreign to another
update utrtest set a = 2 where b = 'foo' returning *;
-- But the reverse is allowed
update utrtest set a = 1 where b = 'qux' returning *;
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- The executor should not let unexercised FDWs shut down
update utrtest set a = 1 where b = 'foo';
-- Test that remote triggers work with update tuple routing
create trigger loct_br_insert_trigger before insert on loct
for each row execute procedure br_insert_trigfunc();
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition is a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 1 or a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 1 or a = 2 returning *;
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition isn't a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 2 returning *;
drop trigger loct_br_insert_trigger on loct;
-- We can move rows to a foreign partition that has been updated already,
-- but can't move rows to a foreign partition that hasn't been updated yet
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- Test the former case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 returning *;
update utrtest set a = 1 returning *;
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
-- Change the definition of utrtest so that the foreign partition get updated
-- after the local partition
delete from utrtest;
alter table utrtest detach partition remp;
drop foreign table remp;
alter table loct drop constraint loct_a_check;
alter table loct add check (a in (3));
create foreign table remp (a int check (a in (3)), b text) server loopback options (table_name 'loct');
alter table utrtest attach partition remp for values in (3);
insert into utrtest values (2, 'qux');
insert into utrtest values (3, 'xyzzy');
-- Test the latter case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 returning *;
update utrtest set a = 3 returning *; -- ERROR
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *;
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *; -- ERROR
drop table utrtest;
drop table loct;
-- Test copy tuple routing
create table ctrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table ctrtest attach partition remp1 for values in (1);
alter table ctrtest attach partition remp2 for values in (2);
copy ctrtest from stdin;
1 foo
2 qux
\.
select tableoid::regclass, * FROM ctrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
-- Copying into foreign partitions directly should work as well
copy remp1 from stdin;
1 bar
\.
select tableoid::regclass, * FROM remp1;
drop table ctrtest;
drop table loct1;
drop table loct2;
-- ===================================================================
-- test COPY FROM
-- ===================================================================
create table loc2 (f1 int, f2 text);
alter table loc2 set (autovacuum_enabled = 'false');
create foreign table rem2 (f1 int, f2 text) server loopback options(table_name 'loc2');
-- Test basic functionality
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
delete from rem2;
-- Test check constraints
alter table loc2 add constraint loc2_f1positive check (f1 >= 0);
alter foreign table rem2 add constraint rem2_f1positive check (f1 >= 0);
-- check constraint is enforced on the remote side, not locally
copy rem2 from stdin;
1 foo
2 bar
\.
copy rem2 from stdin; -- ERROR
-1 xyzzy
\.
select * from rem2;
alter foreign table rem2 drop constraint rem2_f1positive;
alter table loc2 drop constraint loc2_f1positive;
delete from rem2;
-- Test local triggers
create trigger trig_stmt_before before insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_stmt_after after insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before on rem2;
drop trigger trig_row_after on rem2;
drop trigger trig_stmt_before on rem2;
drop trigger trig_stmt_after on rem2;
delete from rem2;
create trigger trig_row_before_insert before insert on rem2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on rem2;
delete from rem2;
create trigger trig_null before insert on rem2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on rem2;
delete from rem2;
-- Test remote triggers
create trigger trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on loc2;
delete from rem2;
create trigger trig_null before insert on loc2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on loc2;
delete from rem2;
-- Test a combination of local and remote triggers
create trigger rem2_trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger rem2_trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger loc2_trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger rem2_trig_row_before on rem2;
drop trigger rem2_trig_row_after on rem2;
drop trigger loc2_trig_row_before_insert on loc2;
delete from rem2;
-- test COPY FROM with foreign table created in the same transaction
create table loc3 (f1 int, f2 text);
begin;
create foreign table rem3 (f1 int, f2 text)
server loopback options(table_name 'loc3');
copy rem3 from stdin;
1 foo
2 bar
\.
commit;
select * from rem3;
drop foreign table rem3;
drop table loc3;
*/
-- ===================================================================
-- test IMPORT FOREIGN SCHEMA
-- ===================================================================
--Testcase 728:
CREATE SCHEMA import_dest1;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest1;
--Testcase 477:
\det+ import_dest1.*
--Testcase 478:
\d import_dest1.*
-- Options
--Testcase 729:
CREATE SCHEMA import_dest2;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest2
OPTIONS (import_default 'true');
--Testcase 479:
\det+ import_dest2.*
--Testcase 480:
\d import_dest2.*
-- Check LIMIT TO and EXCEPT
--Testcase 730:
CREATE SCHEMA import_dest3;
IMPORT FOREIGN SCHEMA public LIMIT TO ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 481:
\det+ import_dest3.*
IMPORT FOREIGN SCHEMA public EXCEPT ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 482:
\det+ import_dest3.*
-- Assorted error cases
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest3;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO notthere;
IMPORT FOREIGN SCHEMA public FROM SERVER nowhere INTO notthere;
/*
-- Skip these test, sqlite fdw does not support fetch_size option, partition table
-- Check case of a type present only on the remote server.
-- We can fake this by dropping the type locally in our transaction.
CREATE TYPE "Colors" AS ENUM ('red', 'green', 'blue');
CREATE TABLE import_source.t5 (c1 int, c2 text collate "C", "Col" "Colors");
CREATE SCHEMA import_dest5;
BEGIN;
DROP TYPE "Colors" CASCADE;
IMPORT FOREIGN SCHEMA import_source LIMIT TO (t5)
FROM SERVER loopback INTO import_dest5; -- ERROR
ROLLBACK;
BEGIN;
CREATE SERVER fetch101 FOREIGN DATA WRAPPER postgres_fdw OPTIONS( fetch_size '101' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
ALTER SERVER fetch101 OPTIONS( SET fetch_size '202' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=202'];
CREATE FOREIGN TABLE table30000 ( x int ) SERVER fetch101 OPTIONS ( fetch_size '30000' );
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '60000');
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=60000'];
ROLLBACK;
-- ===================================================================
-- test partitionwise joins
-- ===================================================================
SET enable_partitionwise_join=on;
CREATE TABLE fprt1 (a int, b int, c varchar) PARTITION BY RANGE(a);
CREATE TABLE fprt1_p1 (LIKE fprt1);
CREATE TABLE fprt1_p2 (LIKE fprt1);
ALTER TABLE fprt1_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt1_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt1_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 2) i;
INSERT INTO fprt1_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 2) i;
CREATE FOREIGN TABLE ftprt1_p1 PARTITION OF fprt1 FOR VALUES FROM (0) TO (250)
SERVER loopback OPTIONS (table_name 'fprt1_p1', use_remote_estimate 'true');
CREATE FOREIGN TABLE ftprt1_p2 PARTITION OF fprt1 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (TABLE_NAME 'fprt1_p2');
ANALYZE fprt1;
ANALYZE fprt1_p1;
ANALYZE fprt1_p2;
CREATE TABLE fprt2 (a int, b int, c varchar) PARTITION BY RANGE(b);
CREATE TABLE fprt2_p1 (LIKE fprt2);
CREATE TABLE fprt2_p2 (LIKE fprt2);
ALTER TABLE fprt2_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt2_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt2_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 3) i;
INSERT INTO fprt2_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 3) i;
CREATE FOREIGN TABLE ftprt2_p1 (b int, c varchar, a int)
SERVER loopback OPTIONS (table_name 'fprt2_p1', use_remote_estimate 'true');
ALTER TABLE fprt2 ATTACH PARTITION ftprt2_p1 FOR VALUES FROM (0) TO (250);
CREATE FOREIGN TABLE ftprt2_p2 PARTITION OF fprt2 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (table_name 'fprt2_p2', use_remote_estimate 'true');
ANALYZE fprt2;
ANALYZE fprt2_p1;
ANALYZE fprt2_p2;
-- inner join three tables
EXPLAIN (COSTS OFF)
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
-- left outer join + nullable clause
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
-- with whole-row reference; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
-- join with lateral reference
EXPLAIN (COSTS OFF)
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
-- with PHVs, partitionwise join selected but no join pushdown
EXPLAIN (COSTS OFF)
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
-- test FOR UPDATE; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
RESET enable_partitionwise_join;
-- ===================================================================
-- test partitionwise aggregates
-- ===================================================================
CREATE TABLE pagg_tab (a int, b int, c text) PARTITION BY RANGE(a);
CREATE TABLE pagg_tab_p1 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p2 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p3 (LIKE pagg_tab);
INSERT INTO pagg_tab_p1 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 10;
INSERT INTO pagg_tab_p2 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 20 and (i % 30) >= 10;
INSERT INTO pagg_tab_p3 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 30 and (i % 30) >= 20;
-- Create foreign partitions
CREATE FOREIGN TABLE fpagg_tab_p1 PARTITION OF pagg_tab FOR VALUES FROM (0) TO (10) SERVER loopback OPTIONS (table_name 'pagg_tab_p1');
CREATE FOREIGN TABLE fpagg_tab_p2 PARTITION OF pagg_tab FOR VALUES FROM (10) TO (20) SERVER loopback OPTIONS (table_name 'pagg_tab_p2');;
CREATE FOREIGN TABLE fpagg_tab_p3 PARTITION OF pagg_tab FOR VALUES FROM (20) TO (30) SERVER loopback OPTIONS (table_name 'pagg_tab_p3');;
ANALYZE pagg_tab;
ANALYZE fpagg_tab_p1;
ANALYZE fpagg_tab_p2;
ANALYZE fpagg_tab_p3;
-- When GROUP BY clause matches with PARTITION KEY.
-- Plan with partitionwise aggregates is disabled
SET enable_partitionwise_aggregate TO false;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Plan with partitionwise aggregates is enabled
SET enable_partitionwise_aggregate TO true;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Check with whole-row reference
-- Should have all the columns in the target list for the given relation
EXPLAIN (VERBOSE, COSTS OFF)
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- When GROUP BY clause does not match with PARTITION KEY.
EXPLAIN (COSTS OFF)
SELECT b, avg(a), max(a), count(*) FROM pagg_tab GROUP BY b HAVING sum(a) < 700 ORDER BY 1;
*/
/*
-- Skip these tests, sqlite fdw does not support nosuper user.
-- ===================================================================
-- access rights and superuser
-- ===================================================================
-- Non-superuser cannot create a FDW without a password in the connstr
CREATE ROLE regress_nosuper NOSUPERUSER;
GRANT USAGE ON FOREIGN DATA WRAPPER sqlite_fdw TO regress_nosuper;
SET ROLE regress_nosuper;
SHOW is_superuser;
-- This will be OK, we can create the FDW
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_nopw FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- But creation of user mappings for non-superusers should fail
CREATE USER MAPPING FOR public SERVER sqlite_nopw;
CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
CREATE FOREIGN TABLE ft1_nopw (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_nopw;
ALTER FOREIGN TABLE ft1_nopw OPTIONS (table 'T 1');
ALTER FOREIGN TABLE ft1_nopw ALTER COLUMN c1 OPTIONS (column_name 'C 1');
SELECT * FROM ft1_nopw LIMIT 1;
-- If we add a password to the connstr it'll fail, because we don't allow passwords
-- in connstrs only in user mappings.
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw')$$;
END;
$d$;
-- If we add a password for our user mapping instead, we should get a different
-- error because the password wasn't actually *used* when we run with trust auth.
--
-- This won't work with installcheck, but neither will most of the FDW checks.
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw');
SELECT * FROM ft1_nopw LIMIT 1;
-- Unpriv user cannot make the mapping passwordless
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SELECT * FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- But the superuser can
ALTER USER MAPPING FOR regress_nosuper SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SET ROLE regress_nosuper;
-- Should finally work now
SELECT * FROM ft1_nopw LIMIT 1;
-- unpriv user also cannot set sslcert / sslkey on the user mapping
-- first set password_required so we see the right error messages
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (SET password_required 'true');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslcert 'foo.crt');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslkey 'foo.key');
-- We're done with the role named after a specific user and need to check the
-- changes to the public mapping.
DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
-- This will fail again as it'll resolve the user mapping for public, which
-- lacks password_required=false
SELECT * FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- The user mapping for public is passwordless and lacks the password_required=false
-- mapping option, but will work because the current user is a superuser.
SELECT * FROM ft1_nopw LIMIT 1;
-- cleanup
DROP USER MAPPING FOR public SERVER sqlite_nopw;
DROP OWNED BY regress_nosuper;
DROP ROLE regress_nosuper;
-- Clean-up
RESET enable_partitionwise_aggregate;
*/
-- Two-phase transactions are not supported.
BEGIN;
--Testcase 731:
SELECT count(*) FROM ft1;
-- error here
--Testcase 732:
PREPARE TRANSACTION 'fdw_tpc';
ROLLBACK;
-- Clean-up
--Testcase 733:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 734:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 735:
DROP SERVER sqlite_svr CASCADE;
--Testcase 736:
DROP SERVER sqlite_svr2 CASCADE;
--Testcase 737:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/extra/update.sql
================================================
--
-- UPDATE syntax tests
--
--Testcase 32:
CREATE EXTENSION sqlite_fdw;
--Testcase 33:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 34:
CREATE FOREIGN TABLE update_test (
i INT OPTIONS (key 'true'),
a INT DEFAULT 10,
b INT,
c TEXT
) SERVER sqlite_svr;
--Testcase 35:
CREATE FOREIGN TABLE upsert_test (
a INT OPTIONS (key 'true'),
b TEXT
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO update_test VALUES (1, 5, 10, 'foo');
--Testcase 2:
INSERT INTO update_test(i, b, a) VALUES (2, 15, 10);
--Testcase 3:
SELECT * FROM update_test;
--Testcase 4:
UPDATE update_test SET a = DEFAULT, b = DEFAULT;
--Testcase 5:
SELECT * FROM update_test;
-- aliases for the UPDATE target table
--Testcase 6:
UPDATE update_test AS t SET b = 10 WHERE t.a = 10;
--Testcase 7:
SELECT * FROM update_test;
--Testcase 8:
UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10;
--Testcase 9:
SELECT * FROM update_test;
--
-- Test VALUES in FROM
--
--Testcase 10:
UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j)
WHERE update_test.b = v.j;
--Testcase 11:
SELECT * FROM update_test;
-- fail, wrong data type:
--Testcase 12:
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
--
--Testcase 13:
INSERT INTO update_test SELECT i+2,a,b+1,c FROM update_test;
--Testcase 14:
SELECT * FROM update_test;
--Testcase 15:
UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo';
--Testcase 16:
SELECT * FROM update_test;
--Testcase 17:
UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10;
--Testcase 18:
SELECT * FROM update_test;
-- fail, multi assignment to same column:
--Testcase 19:
UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10;
-- uncorrelated sub-select:
--Testcase 20:
UPDATE update_test
SET (b,a) = (select a,b from update_test where b = 41 and c = 'car')
WHERE a = 100 AND b = 20;
--Testcase 21:
SELECT * FROM update_test;
-- correlated sub-select:
--Testcase 22:
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);
--Testcase 23:
SELECT * FROM update_test;
-- fail, multiple rows supplied:
--Testcase 24:
UPDATE update_test SET (b,a) = (select a+1,b from update_test);
-- set to null if no rows supplied:
--Testcase 25:
UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000)
WHERE a = 11;
--Testcase 26:
SELECT * FROM update_test;
-- *-expansion should work in this context:
--Testcase 27:
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:
--Testcase 28:
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
--Testcase 29:
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.
--Testcase 30:
UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car';
--Testcase 31:
SELECT a, b, char_length(c) FROM update_test;
-- Check multi-assignment with a Result node to handle a one-time filter.
--Testcase 36:
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;
--Testcase 37:
UPDATE update_test t
SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a)
WHERE CURRENT_USER = SESSION_USER;
--Testcase 38:
SELECT a, b, char_length(c) FROM update_test;
/* Skip, sqlite fdw does not support ON CONFLICT DO UPDATE
-- Test ON CONFLICT DO UPDATE
INSERT INTO upsert_test VALUES(1, 'Boo');
-- 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') 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') 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 FOREIGN TABLE update_test;
DROP FOREIGN TABLE upsert_test;
*/
/*Skip, sqlite fdw does not support create partition table
---------------------------
-- 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;
--------------
-- 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);
*/
--drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 39:
DROP SERVER sqlite_svr;
--Testcase 40:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/libsqlite.sql
================================================
-- Test for SQLite library code source and defaults
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
SELECT sqlite_fdw_sqlite_version();
--Testcase 3:
SELECT length(sqlite_fdw_sqlite_code_source());
--Testcase 4:
SELECT sqlite_fdw_sqlite_code_source();
--Testcase 7:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/selectfunc.sql
================================================
SET datestyle=ISO;
SET timezone='Japan';
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER server1 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/selectfunc.db');
--CREATE USER MAPPING FOR CURRENT_USER SERVER server1 OPTIONS(user 'user', password 'pass');
--IMPORT FOREIGN SCHEMA public FROM SERVER server1 INTO public OPTIONS(import_time_text 'false');
--Testcase 3:
CREATE FOREIGN TABLE s3(id text OPTIONS (key 'true'), time timestamp, tag1 text, value1 float, value2 int, value3 float, value4 int, str1 text, str2 text) SERVER server1;
-- s3 (value1 as float8, value2 as bigint)
--Testcase 4:
\d s3;
--Testcase 5:
SELECT * FROM s3;
-- select float8() (not pushdown, remove float8, explain)
-- EXPLAIN VERBOSE
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select float8() (not pushdown, remove float8, result)
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select sqrt (builtin function, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (buitin function, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function,, not pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, not pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select abs (builtin function, explain)
--Testcase 6:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (buitin function, result)
--Testcase 7:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (builtin function, not pushdown constraints, explain)
--Testcase 8:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, not pushdown constraints, result)
--Testcase 9:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, pushdown constraints, explain)
--Testcase 10:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select abs (builtin function, pushdown constraints, result)
--Testcase 11:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select log (builtin function, need to swap arguments, numeric cast, explain)
-- log_(v) : postgresql (base, v), sqlite (v, base)
-- EXPLAIN VERBOSE
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (builtin function, need to swap arguments, numeric cast, result)
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, result)
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, result)
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, result)
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log2 (stub function, explain)
-- EXPLAIN VERBOSE
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select log2 (stub function, result)
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select spread (stub agg function, explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, result)
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, raise exception if not expected type)
-- SELECT spread(value1::numeric),spread(value2::numeric),spread(value3::numeric),spread(value4::numeric) FROM s3;
-- sqlite fdw does not have spread()
-- select abs as nest function with agg (pushdown, explain)
--Testcase 12:
EXPLAIN VERBOSE
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest function with agg (pushdown, result)
--Testcase 13:
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest with log2 (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs as nest with log2 (pushdown, result)
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs with non pushdown func and explicit constant (explain)
--Testcase 14:
EXPLAIN VERBOSE
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select abs with non pushdown func and explicit constant (result)
--Testcase 15:
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select sqrt as nest function with agg and explicit constant (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant (pushdown, result)
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant and tag (error, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1, tag1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select spread (stub agg function and group by influx_time() and tag) (explain)
-- EXPLAIN VERBOSE
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by influx_time() and tag) (result)
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by tag only) (result)
-- SELECT tag1,spread("value1") FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY tag1;
-- sqlite fdw does not have spread()
-- select spread (stub agg function and other aggs) (result)
-- SELECT sum("value1"),spread("value1"),count("value1") FROM s3;
-- sqlite fdw does not have spread()
-- select abs with order by (explain)
--Testcase 16:
EXPLAIN VERBOSE
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by (result)
--Testcase 17:
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by index (result)
--Testcase 18:
SELECT value1, abs(1-value1) FROM s3 order by 2,1;
-- select abs with order by index (result)
--Testcase 19:
SELECT value1, abs(1-value1) FROM s3 order by 1,2;
-- select abs and as
--Testcase 20:
SELECT abs(value3) as abs1 FROM s3;
-- select spread over join query (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread over join query (result, stub call error)
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread with having (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select spread with having (explain, cannot pushdown, stub call error)
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select abs with arithmetic and tag in the middle (explain)
--Testcase 21:
EXPLAIN VERBOSE
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select abs with arithmetic and tag in the middle (result)
--Testcase 22:
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select with order by limit (explain)
--Testcase 23:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select with order by limit (explain)
--Testcase 24:
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select mixing with non pushdown func (all not pushdown, explain)
--Testcase 25:
EXPLAIN VERBOSE
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- select mixing with non pushdown func (result)
--Testcase 26:
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- sqlite data prep
-- sqlite pushdown supported functions (explain)
--Testcase 27:
EXPLAIN VERBOSE
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown supported functions (result)
--Testcase 28:
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown nest functions (explain)
--Testcase 32:
EXPLAIN VERBOSE
SELECT round(abs(value2), 0) FROM s3;
-- sqlite pushdown nest functions (result)
--Testcase 33:
SELECT round(abs(value2), 0) FROM s3;
-- select mod (builtin function, explain)
--Testcase 34:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, result)
--Testcase 35:
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, not pushdown constraints, explain)
--Testcase 36:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, not pushdown constraints, result)
--Testcase 37:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, pushdown constraints, explain)
--Testcase 38:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, pushdown constraints, result)
--Testcase 39:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 40:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 41:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 42:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 43:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod as nest function with agg (pushdown, explain)
--Testcase 44:
EXPLAIN VERBOSE
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest function with agg (pushdown, result)
--Testcase 45:
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, explain)
--Testcase 46:
EXPLAIN VERBOSE
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, result)
--Testcase 47:
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod with non pushdown func and explicit constant (explain)
--Testcase 48:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with non pushdown func and explicit constant (result)
--Testcase 49:
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with order by (explain)
--Testcase 50:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by (result)
--Testcase 51:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by index (result)
--Testcase 52:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 2,1;
-- select mod with order by index (result)
--Testcase 53:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 1,2;
-- select mod with group by (explain)
--Testcase 54:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by (result)
--Testcase 55:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by index (result)
--Testcase 56:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 2,1;
-- select mod with group by index (result)
--Testcase 57:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2;
-- select mod with group by having (explain)
--Testcase 58:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by having (result)
--Testcase 59:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by index having (result)
--Testcase 60:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2 HAVING value1 > 1;
-- select mod and as
--Testcase 61:
SELECT value1, mod(value2, 2) as mod1 FROM s3;
--Testcase 29:
DROP FOREIGN TABLE s3;
--Testcase 30:
DROP SERVER server1;
--Testcase 31:
DROP EXTENSION sqlite_fdw;
================================================
FILE: sql/13.15/sqlite_fdw.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 129:
CREATE EXTENSION sqlite_fdw;
--Testcase 130:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 131:
CREATE FOREIGN TABLE department(department_id int OPTIONS (key 'true'), department_name text) SERVER sqlite_svr;
--Testcase 132:
CREATE FOREIGN TABLE employee(emp_id int OPTIONS (key 'true'), emp_name text, emp_dept_id int) SERVER sqlite_svr;
--Testcase 133:
CREATE FOREIGN TABLE empdata(emp_id int OPTIONS (key 'true'), emp_dat bytea) SERVER sqlite_svr;
--Testcase 134:
CREATE FOREIGN TABLE numbers(a int OPTIONS (key 'true'), b varchar(255)) SERVER sqlite_svr;
--Testcase 135:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 136:
CREATE FOREIGN TABLE noprimary(a int, b text) SERVER sqlite_svr;
--Testcase 137:
CREATE FOREIGN TABLE RO_RW_test(i int OPTIONS (key 'true'), a text, b float, c int) SERVER sqlite_svr;
--Testcase 1:
SELECT * FROM department LIMIT 10;
--Testcase 2:
SELECT * FROM employee LIMIT 10;
--Testcase 3:
SELECT * FROM empdata LIMIT 10;
--Testcase 4:
INSERT INTO department VALUES(generate_series(1,100), 'dept - ' || generate_series(1,100));
--Testcase 5:
INSERT INTO employee VALUES(generate_series(1,100), 'emp - ' || generate_series(1,100), generate_series(1,100));
--Testcase 6:
INSERT INTO empdata VALUES(1, decode ('01234567', 'hex'));
--Testcase 7:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 8:
INSERT INTO numbers VALUES(2, 'Two');
--Testcase 9:
INSERT INTO numbers VALUES(3, 'Three');
--Testcase 10:
INSERT INTO numbers VALUES(4, 'Four');
--Testcase 11:
INSERT INTO numbers VALUES(5, 'Five');
--Testcase 12:
INSERT INTO numbers VALUES(6, 'Six');
--Testcase 13:
INSERT INTO numbers VALUES(7, 'Seven');
--Testcase 14:
INSERT INTO numbers VALUES(8, 'Eight');
--Testcase 15:
INSERT INTO numbers VALUES(9, 'Nine');
--Testcase 16:
SELECT count(*) FROM department;
--Testcase 17:
SELECT count(*) FROM employee;
--Testcase 18:
SELECT count(*) FROM empdata;
--Testcase 19:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 20:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) LIMIT 10;
--Testcase 21:
SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 22:
SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) ORDER BY d.department_id LIMIT 10;
--Testcase 23:
SELECT * FROM empdata;
--Testcase 24:
DELETE FROM employee WHERE emp_id = 10;
--Testcase 25:
SELECT COUNT(*) FROM department LIMIT 10;
--Testcase 26:
SELECT COUNT(*) FROM employee WHERE emp_id = 10;
--Testcase 27:
UPDATE employee SET emp_name = 'UPDATEd emp' WHERE emp_id = 20;
--Testcase 28:
SELECT emp_id, emp_name FROM employee WHERE emp_name like 'UPDATEd emp';
--Testcase 29:
UPDATE empdata SET emp_dat = decode ('0123', 'hex');
--Testcase 30:
SELECT * FROM empdata;
--Testcase 31:
SELECT * FROM employee LIMIT 10;
--Testcase 32:
SELECT * FROM employee WHERE emp_id IN (1);
--Testcase 33:
SELECT * FROM employee WHERE emp_id IN (1,3,4,5);
--Testcase 34:
SELECT * FROM employee WHERE emp_id IN (10000,1000);
--Testcase 35:
SELECT * FROM employee WHERE emp_id NOT IN (1) LIMIT 5;
--Testcase 36:
SELECT * FROM employee WHERE emp_id NOT IN (1,3,4,5) LIMIT 5;
--Testcase 37:
SELECT * FROM employee WHERE emp_id NOT IN (10000,1000) LIMIT 5;
--Testcase 38:
SELECT * FROM employee WHERE emp_id NOT IN (SELECT emp_id FROM employee WHERE emp_id IN (1,10));
--Testcase 39:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 1', 'emp - 2') LIMIT 5;
--Testcase 40:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 10') LIMIT 5;
--Testcase 41:
SELECT * FROM numbers WHERE (CASE WHEN a % 2 = 0 THEN 1 WHEN a % 5 = 0 THEN 1 ELSE 0 END) = 1;
--Testcase 42:
SELECT * FROM numbers WHERE (CASE b WHEN 'Two' THEN 1 WHEN 'Six' THEN 1 ELSE 0 END) = 1;
--Testcase 152:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 153:
SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 137:
create or replace function test_param_WHERE() returns void as $$
DECLARE
n varchar;
BEGIN
FOR x IN 1..9 LOOP
--Testcase 138:
SELECT b INTO n from numbers WHERE a=x;
raise notice 'Found number %', n;
end loop;
return;
END
$$ LANGUAGE plpgsql;
--Testcase 43:
SELECT test_param_WHERE();
--Testcase 44:
SELECT b from numbers WHERE a=1;
--Testcase 45:
EXPLAIN(COSTS OFF) SELECT b from numbers WHERE a=1;
--Testcase 46:
SELECT a FROM numbers WHERE b = (SELECT NULL::text);
--Testcase 47:
PREPARE stmt1 (int, int) AS
SELECT * FROM numbers WHERE a=$1 or a=$2;
--Testcase 48:
EXECUTE stmt1(1,2);
--Testcase 49:
EXECUTE stmt1(2,2);
--Testcase 50:
EXECUTE stmt1(3,2);
--Testcase 51:
EXECUTE stmt1(4,2);
-- generic plan
--Testcase 52:
EXECUTE stmt1(5,2);
--Testcase 53:
EXECUTE stmt1(6,2);
--Testcase 54:
EXECUTE stmt1(7,2);
--Testcase 55:
DELETE FROM employee;
--Testcase 56:
DELETE FROM department;
--Testcase 57:
DELETE FROM empdata;
--Testcase 58:
DELETE FROM numbers;
BEGIN;
--Testcase 59:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 60:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
--Testcase 61:
SELECT * from numbers;
BEGIN;
--Testcase 62:
INSERT INTO numbers VALUES(3, 'Three');
ROLLBACK;
--Testcase 63:
SELECT * from numbers;
BEGIN;
--Testcase 64:
INSERT INTO numbers VALUES(4, 'Four');
SAVEPOINT my_savepoint;
--Testcase 65:
INSERT INTO numbers VALUES(5, 'Five');
ROLLBACK TO SAVEPOINT my_savepoint;
--Testcase 66:
INSERT INTO numbers VALUES(6, 'Six');
COMMIT;
--Testcase 67:
SELECT * from numbers;
-- duplicate key
--Testcase 68:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 69:
DELETE from numbers;
BEGIN;
--Testcase 70:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 71:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
-- violate unique constraint
--Testcase 72:
UPDATE numbers SET b='Two' WHERE a = 1;
--Testcase 73:
SELECT * from numbers;
-- push down
--Testcase 74:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
-- (1,2,3) is pushed down
--Testcase 75:
explain (verbose, costs off) SELECT * from numbers WHERE a in (1,2,3) AND (1,2) < (a,5);
--Testcase 76:
explain (verbose, costs off) SELECT * from numbers WHERE a in (a+2*a,5);
--Testcase 77:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
--Testcase 78:
SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
--Testcase 79:
SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
-- ANY with ARRAY expression
--Testcase 154:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 155:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 156:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 157:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 158:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 159:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 160:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 161:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 162:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 163:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 164:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
--Testcase 165:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
-- ANY with ARRAY const
--Testcase 166:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 167:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 168:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 169:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 170:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 171:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 172:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 173:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 174:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 175:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 176:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 177:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 210:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 211:
SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 212:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
--Testcase 213:
SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
-- ALL with ARRAY expression
--Testcase 178:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 179:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 180:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 181:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 182:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 183:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 184:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 185:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 186:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 187:
SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 188:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
--Testcase 189:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
-- ALL with ARRAY const
--Testcase 190:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 191:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 192:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 193:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 194:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 195:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 196:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 197:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 198:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 199:
SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 200:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
--Testcase 201:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
-- ANY/ALL with TEXT ARRAY const
--Testcase 202:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 203:
SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 204:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 205:
SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 206:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 207:
SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 208:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 209:
SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 80:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 81:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 82:
UPDATE multiprimary SET b = 10 WHERE c = 3;
--Testcase 83:
SELECT * from multiprimary;
--Testcase 84:
UPDATE multiprimary SET a = 10 WHERE a = 1;
--Testcase 85:
SELECT * from multiprimary;
--Testcase 86:
UPDATE multiprimary SET a = 100, b=200, c=300 WHERE a=10 AND b=10;
--Testcase 87:
SELECT * from multiprimary;
--Testcase 88:
UPDATE multiprimary SET a = 1234;
--Testcase 89:
SELECT * from multiprimary;
--Testcase 90:
UPDATE multiprimary SET a = a+1, b=b+1 WHERE b=200 AND c=300;
--Testcase 91:
SELECT * from multiprimary;
--Testcase 92:
DELETE from multiprimary WHERE a = 1235;
--Testcase 93:
SELECT * from multiprimary;
--Testcase 94:
DELETE from multiprimary WHERE b = 2;
--Testcase 95:
SELECT * from multiprimary;
--Testcase 96:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 97:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 98:
INSERT INTO multiprimary VALUES(1,10,20);
--Testcase 99:
INSERT INTO multiprimary VALUES(2,20,40);
--Testcase 100:
SELECT count(distinct a) from multiprimary;
--Testcase 101:
SELECT sum(b),max(b), min(b) from multiprimary;
--Testcase 102:
SELECT sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 103:
SELECT sum(a) from multiprimary group by b having sum(a) > 0 order by sum(a);
--Testcase 104:
SELECT sum(a) A from multiprimary group by b having avg(abs(a)) > 0 AND sum(a) > 0 order by A;
--Testcase 105:
SELECT count(nullif(a, 1)) FROM multiprimary;
--Testcase 106:
SELECT a,a FROM multiprimary group by 1,2;
--Testcase 107:
SELECT * from multiprimary, numbers WHERE multiprimary.a=numbers.a;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 109:
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 110:
INSERT INTO numbers VALUES(4, 'Four');
-- All where clauses are pushed down
--Testcase 111:
SELECT * FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
--Testcase 112:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
-- Only "length(b) = 4" are pushed down
--Testcase 113:
SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 114:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
-- Aggregates in subquery are pushed down.
--Testcase 214:
explain (verbose, costs off)
select count(x.a), sum(x.a) from (select a a, sum(a) b from numbers group by a, abs(a) order by 1, 2) x;
--Testcase 215:
select count(x.a), sum(x.a) from (select a a, sum(a) b from numbers group by a, abs(a) order by 1, 2) x;
--Testcase 115:
INSERT INTO multiprimary (b,c) VALUES (99, 100);
--Testcase 116:
SELECT c FROM multiprimary WHERE COALESCE(a,b,c) = 99;
--Testcase 139:
CREATE FOREIGN TABLE multiprimary2(a int, b int, c int OPTIONS(column_name 'b')) SERVER sqlite_svr OPTIONS (table 'multiprimary');
--Testcase 117:
SELECT * FROM multiprimary2;
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN a OPTIONS(ADD column_name 'b');
--Testcase 118:
SELECT * FROM multiprimary2;
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN b OPTIONS (column_name 'nosuch column');
--Testcase 119:
SELECT * FROM multiprimary2;
--Testcase 140:
EXPLAIN (VERBOSE) SELECT * FROM multiprimary2;
--Testcase 120:
SELECT a FROM multiprimary2 WHERE b = 1;
--Testcase 141:
CREATE FOREIGN TABLE columntest(a int OPTIONS(column_name 'a a', key 'true'), "b b" int OPTIONS(key 'true'), c int OPTIONS(column_name 'c c')) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO columntest VALUES(1,2,3);
--Testcase 122:
UPDATE columntest SET c=10 WHERE a = 1;
--Testcase 123:
SELECT * FROM columntest;
--Testcase 124:
UPDATE columntest SET a=100 WHERE c = 10;
--Testcase 125:
SELECT * FROM columntest;
--Testcase 126:
INSERT INTO noprimary VALUES(1,'2');
--Testcase 127:
INSERT INTO noprimary SELECT * FROM noprimary;
--Testcase 128:
SELECT * FROM noprimary;
--get version
--Testcase 153:
\df sqlite*
--Testcase 154:
SELECT * FROM public.sqlite_fdw_version();
--Testcase 155:
SELECT sqlite_fdw_version();
-- issue #44 github
--Testcase 156:
CREATE FOREIGN TABLE fts_table (name text, description text) SERVER sqlite_svr;
--Testcase 157:
INSERT INTO fts_table VALUES ('this is name', 'this is description');
--Testcase 158:
SELECT * FROM fts_table; -- should work
--Testcase 159:
ALTER TABLE fts_table ALTER COLUMN name TYPE int;
--Testcase 160:
SELECT * FROM fts_table; -- should fail
-- issue #62 github
--Testcase 236:
INSERT INTO noprimary VALUES (4, 'Test''s');
--Testcase 237:
INSERT INTO noprimary VALUES (5, 'Test');
--Testcase 238:
SELECT * FROM noprimary;
--Testcase 239:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 240:
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 241:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b in ('Test''s', 'Test');
--Testcase 242:
SELECT * FROM noprimary where b in ('Test''s', 'Test');
-- Executable test case for pushdown CASE expressions (results)
--Testcase 224:
CREATE FOREIGN TABLE case_exp(c1 int OPTIONS (key 'true'), c3 text, c6 varchar(10)) SERVER sqlite_svr;
--Testcase 225:
INSERT INTO case_exp
SELECT id,
to_char(id, 'FM00000'),
id % 10
FROM generate_series(1, 10) id;
--Testcase 226:
SELECT * FROM case_exp;
-- CASE arg WHEN
--Testcase 227:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
--Testcase 228:
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 229:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 230:
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 232:
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 233:
SELECT * FROM case_exp WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 234:
DELETE FROM case_exp;
-- readonly/readwrite tests
-- Full combinations
-- force_RO default SERVER default TABLE default
-- force_RO default SERVER true TABLE default
-- force_RO default SERVER false TABLE default
-- force_RO default SERVER default TABLE true
-- force_RO default SERVER default TABLE false
-- force_RO default SERVER true TABLE true
-- force_RO default SERVER false TABLE true
-- force_RO default SERVER false TABLE false
-- force_RO default SERVER true TABLE false
-- force_RO false SERVER default TABLE default
-- force_RO false SERVER true TABLE default
-- force_RO false SERVER false TABLE default
-- force_RO false SERVER default TABLE true
-- force_RO false SERVER default TABLE false
-- force_RO false SERVER true TABLE true
-- force_RO false SERVER false TABLE true
-- force_RO false SERVER false TABLE false
-- force_RO false SERVER true TABLE false
-- force_RO true SERVER default TABLE default
-- force_RO true SERVER true TABLE default
-- force_RO true SERVER false TABLE default
-- force_RO true SERVER default TABLE true
-- force_RO true SERVER default TABLE false
-- force_RO true SERVER true TABLE true
-- force_RO true SERVER false TABLE true
-- force_RO true SERVER false TABLE false
-- force_RO true SERVER true TABLE false
-- force_RO default SERVER default TABLE default
--Testcase 235:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 236:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 237:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO default SERVER true TABLE default
--Testcase 238:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 239:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 240:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 241:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 242:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO default SERVER false TABLE default
--Testcase 243:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 244:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 245:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 246:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER default TABLE true
--Testcase 247:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 248:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 249:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 250:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 251:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO default SERVER default TABLE false
--Testcase 252:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 253:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 254:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 255:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER true TABLE true
--Testcase 256:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 257:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 258:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 258:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 260:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 261:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO default SERVER false TABLE true
--Testcase 262:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 263:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 264:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 265:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO default SERVER false TABLE false
--Testcase 266:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 267:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 268:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 269:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO default SERVER true TABLE false
--Testcase 270:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 271:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 272:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 273:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 274:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 275:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 276:
SELECT * FROM RO_RW_test ORDER BY i;
--Bind error message test for some unsupported data type
--Testcase 277:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 278:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 279:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 277:
DELETE FROM RO_RW_test;
--Testcase 278:
ALTER SERVER sqlite_svr OPTIONS (ADD force_readonly 'false');
-- force_RO false SERVER default TABLE default
--Testcase 279:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 280:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 281:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO false SERVER true TABLE default
--Testcase 282:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 283:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 284:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 285:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 286:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO false SERVER false TABLE default
--Testcase 287:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 288:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 289:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 290:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER default TABLE true
--Testcase 291:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 292:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 293:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 294:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 295:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO false SERVER default TABLE false
--Testcase 296:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 297:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 298:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 299:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER true TABLE true
--Testcase 300:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 301:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 302:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 303:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 304:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 305:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO false SERVER false TABLE true
--Testcase 306:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 307:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 308:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 309:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO false SERVER false TABLE false
--Testcase 310:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 311:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 312:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 313:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO false SERVER true TABLE false
--Testcase 314:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 315:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 316:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 317:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 318:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 319:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 320:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 321:
DELETE FROM RO_RW_test;
--Testcase 322:
ALTER SERVER sqlite_svr OPTIONS (SET force_readonly 'true');
-- force_RO true SERVER default TABLE default
--Testcase 323:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- ERR
--Testcase 324:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- ERR
--Testcase 325:
DELETE FROM RO_RW_test WHERE i=2; -- ERR
-- force_RO true SERVER true TABLE default
--Testcase 326:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 327:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- ERR
--Testcase 328:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- ERR
--Testcase 329:
DELETE FROM RO_RW_test WHERE i=3; -- ERR
--Testcase 330:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- ERR
-- force_RO true SERVER false TABLE default
--Testcase 331:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 332:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 333:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 334:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER default TABLE true
--Testcase 335:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 336:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 337:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- ERR
--Testcase 338:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- ERR
--Testcase 339:
DELETE FROM RO_RW_test WHERE i=6; -- ERR
-- force_RO true SERVER default TABLE false
--Testcase 340:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 341:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 342:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 343:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER true TABLE true
--Testcase 344:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true'); -- ERR
--Testcase 345:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true'); -- ERR
--Testcase 346:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- ERR
--Testcase 347:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 348:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 349:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- ERR
-- force_RO true SERVER false TABLE true
--Testcase 350:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 351:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- ERR
--Testcase 352:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- ERR
--Testcase 353:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER false TABLE false
--Testcase 354:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 355:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 356:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 357:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER true TABLE false
--Testcase 358:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 359:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 360:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 361:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 362:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 363:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 364:
ALTER SERVER sqlite_svr OPTIONS (DROP force_readonly);
--Testcase 365:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 366:
DROP FOREIGN TABLE RO_RW_test;
-- End of RO/RW test
--Bind error message test for some unsupported data type
--Testcase 366:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 367:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 368:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 142:
DROP FUNCTION test_param_WHERE();
--Testcase 143:
DROP FOREIGN TABLE numbers;
--Testcase 144:
DROP FOREIGN TABLE department;
--Testcase 145:
DROP FOREIGN TABLE employee;
--Testcase 146:
DROP FOREIGN TABLE empdata;
--Testcase 147:
DROP FOREIGN TABLE multiprimary;
--Testcase 148:
DROP FOREIGN TABLE multiprimary2;
--Testcase 149:
DROP FOREIGN TABLE columntest;
--Testcase 150:
DROP FOREIGN TABLE noprimary;
--Testcase 161:
DROP FOREIGN TABLE fts_table;
--Testcase 235:
DROP FOREIGN TABLE case_exp;
--Testcase 151:
DROP SERVER sqlite_svr;
--Testcase 152:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/bitstring.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 02:
CREATE FOREIGN TABLE "type_BIT"( "i" int OPTIONS (key 'true'), "b" bit(6)) SERVER sqlite_svr OPTIONS (table 'type_BIT');
--Testcase 03:
DROP FOREIGN TABLE IF EXISTS "type_BIT+";
--Testcase 04:
CREATE FOREIGN TABLE "type_BIT+"( "i" int OPTIONS (key 'true'), "b" bit(6), "t" text, "l" smallint, "bi" bigint OPTIONS (column_name 'b')) SERVER sqlite_svr OPTIONS (table 'type_BIT+');
--Testcase 05: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (1, 1);
--Testcase 06: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (2, 2);
--Testcase 07: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (3, '1');
--Testcase 08: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (4, '10');
--Testcase 09: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (5, '101');
--Testcase 10:
INSERT INTO "type_BIT" ("i", "b") VALUES (6, '110110');
--Testcase 11:
INSERT INTO "type_BIT" ("i", "b") VALUES (7, '111001');
--Testcase 12:
INSERT INTO "type_BIT" ("i", "b") VALUES (8, '110000');
--Testcase 13:
INSERT INTO "type_BIT" ("i", "b") VALUES (9, '100001');
--Testcase 14: type mismatch with proper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (10, 53);
--Testcase 15:
SELECT * FROM "type_BIT+";
--Testcase 16:
SELECT * FROM "type_BIT" WHERE b < '110110';
--Testcase 17:
SELECT * FROM "type_BIT" WHERE b > '110110';
--Testcase 18:
SELECT * FROM "type_BIT" WHERE b = '110110';
--Testcase 20:
CREATE FOREIGN TABLE "type_VARBIT"( "i" int OPTIONS (key 'true'), "b" varbit(70)) SERVER sqlite_svr OPTIONS (table 'type_VARBIT');
--Testcase 21:
DROP FOREIGN TABLE IF EXISTS "type_VARBIT+";
--Testcase 22:
CREATE FOREIGN TABLE "type_VARBIT+"( "i" int OPTIONS (key 'true'), "b" varbit(70), "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_VARBIT+');
--Testcase 23:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (1, '1');
--Testcase 24:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (2, '10');
--Testcase 25:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (3, '11');
--Testcase 26:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (4, '100');
--Testcase 27:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (5, '101');
--Testcase 28:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (6, '110110');
--Testcase 29:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (7, '111001');
--Testcase 30:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (8, '110000');
--Testcase 31:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (9, '100001');
--Testcase 32:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (10, '0100100101011001010010101000111110110101101101111011000101010');
--Testcase 33:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (11, '01001001010110010100101010001111101101011011011110110001010101');
--Testcase 34:
SELECT * FROM "type_VARBIT+";
--Testcase 35:
SELECT * FROM "type_VARBIT+" WHERE b < '110110';
--Testcase 36:
SELECT * FROM "type_VARBIT+" WHERE b > '110110';
--Testcase 37:
SELECT * FROM "type_VARBIT+" WHERE b = '110110';
--Testcase 38:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (12, '010010010101100101001010100011111011010110110111101100010101010');
--Testcase 39:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (13, '0100100101011001010010101000111110110101101101111011000101010101');
--Testcase 40: very long bit string, expected ERROR, 65 bits
INSERT INTO "type_VARBIT" ("i", "b") VALUES (14, '01001001010110010100101010001111101101011011011110110001010101010');
--Testcase 41:
SELECT * FROM "type_VARBIT+" WHERE "i" > 10;
--Testcase 42:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 43:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 44:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 45:
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 46:
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 47:
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 48:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 49:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 50:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 51:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 52:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 53:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 54:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 55:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 56:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 57:
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 58:
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 59:
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 60:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 61:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 62:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 63:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 64:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 65:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 66:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 67:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 68:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 69:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 70:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 71:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 72:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 73:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 74:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 75:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 76:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 77:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 78:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 79:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 80:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 81:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 82:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 83:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 84:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 85:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 86:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 87:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 88:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 89:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 90:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 91:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 92:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 93:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 94:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 95:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 005:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/bool.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 000:
CREATE EXTENSION sqlite_fdw;
--Testcase 001:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 01:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int OPTIONS (key 'true'), b bool) SERVER sqlite_svr;
--Testcase 02:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (1, TRUE);
--Testcase 03:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (2, FALSE);
--Testcase 04:
CREATE FOREIGN TABLE "type_BOOLEAN+"( "i" int, "b" bool, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN+');
--Testcase 05:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE text;
--Testcase 06:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (3, TRUE);
--Testcase 07:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (4, FALSE);
--Testcase 08:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (5, true);
--Testcase 09:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (6, false);
--Testcase 10:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (7, 'Yes');
--Testcase 11:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (8, 'YeS');
--Testcase 12:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (9, 'yes');
--Testcase 13:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (10, 'no');
--Testcase 14:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (11, 'No');
--Testcase 15:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (12, 'nO');
--Testcase 16:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (13, 'off');
--Testcase 17:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (14, 'oFf');
--Testcase 18:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (15, 'on');
--Testcase 19:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (16, 'ON');
--Testcase 20:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (17, 't');
--Testcase 21:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (18, 'T');
--Testcase 22:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (19, 'Y');
--Testcase 23:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (20, 'y');
--Testcase 24:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (21, 'F');
--Testcase 25:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (22, 'f');
--Testcase 26:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (23, 'x');
--Testcase 27:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (24, '0');
--Testcase 28:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (25, '1');
--Testcase 29:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (26, NULL);
--Testcase 30:
SELECT * FROM "type_BOOLEAN";
--Testcase 31:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 32:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN";
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN+";
--Testcase 34: ERR - invalid text affinity because not ISO:SQL text input
SELECT * FROM "type_BOOLEAN+";
--Testcase 35
DELETE FROM "type_BOOLEAN" WHERE i = 23;
--Testcase 36:
SELECT * FROM "type_BOOLEAN+";
--Testcase 37:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NULL;
--Testcase 38:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NOT NULL;
--Testcase 39:
SELECT * FROM "type_BOOLEAN+" WHERE b;
--Testcase 40:
SELECT * FROM "type_BOOLEAN+" WHERE NOT b;
--Testcase 41:
CREATE FOREIGN TABLE "type_BOOLEANpk" (col bool OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 42:
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 43:
INSERT INTO "type_BOOLEANpk" VALUES (FALSE);
--Testcase 44: ERR - primary key
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 45:
DELETE FROM "type_BOOLEANpk";
--Testcase 46:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE float8;
--Testcase 47:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (27, 3.14159265358979);
--Testcase 48:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 49: ERR - invalid float for bool column
SELECT * FROM "type_BOOLEAN+";
--Testcase 50
DELETE FROM "type_BOOLEAN" WHERE i = 27;
--Testcase 51:
SELECT * FROM "type_BOOLEAN+";
--Testcase 52:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE b;
--Testcase 53:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE NOT b;
--Testcase 54:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE b;
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE NOT b;
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 57:
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 58:
CREATE FOREIGN TABLE "type_BOOLEAN_oper"( "i" int OPTIONS (key 'true'), i1 smallint, b1 boolean, i2 smallint, b2 boolean) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN_oper');
--Testcase 59: see INIT.SQL with mixed affinity boolean data
SELECT * FROM "type_BOOLEAN_oper";
--Testcase 60:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 61:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 62:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 63:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 64:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 65:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 66:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 67:
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 68:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 69:
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 70:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 71:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 72:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 73:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 74:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 75:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b2;
--Testcase 76:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 77:
DELETE FROM "type_BOOLEAN_oper" WHERE b2;
--Testcase 78:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 79:
DELETE FROM "type_BOOLEAN";
--Testcase 003:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/float4.sql
================================================
--
-- FLOAT4
--
--Testcase 46:
CREATE EXTENSION sqlite_fdw;
--Testcase 47:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 48:
CREATE FOREIGN TABLE FLOAT4_TBL(f1 float4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 49:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0');
--Testcase 2:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 ');
--Testcase 4:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20');
--Testcase 5:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20');
-- test for over and under flow
--Testcase 6:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70');
--Testcase 7:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
--Testcase 8:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
--Testcase 9:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
--Testcase 50:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8);
--Testcase 51:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8);
--Testcase 52:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8);
--Testcase 53:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8);
--Testcase 54:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
--Testcase 55:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
--Testcase 56:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
--Testcase 57:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
-- bad input
--Testcase 10:
INSERT INTO FLOAT4_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
--Testcase 17:
INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
-- special inputs
--Testcase 18:
DELETE FROM FLOAT4_TMP;
--Testcase 58:
INSERT INTO FLOAT4_TMP VALUES ('NaN'::float4);
--Testcase 59:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 20:
DELETE FROM FLOAT4_TMP;
--Testcase 60:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4);
--Testcase 61:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 21:
DELETE FROM FLOAT4_TMP;
--Testcase 62:
INSERT INTO FLOAT4_TMP VALUES (' NAN '::float4);
--Testcase 63:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 22:
DELETE FROM FLOAT4_TMP;
--Testcase 64:
INSERT INTO FLOAT4_TMP VALUES ('infinity'::float4);
--Testcase 65:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 23:
DELETE FROM FLOAT4_TMP;
--Testcase 66:
INSERT INTO FLOAT4_TMP VALUES (' -INFINiTY '::float4);
--Testcase 67:
SELECT f1 FROM FLOAT4_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT4_TMP;
--Testcase 68:
INSERT INTO FLOAT4_TMP VALUES ('N A N'::float4);
--Testcase 69:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 26:
DELETE FROM FLOAT4_TMP;
--Testcase 70:
INSERT INTO FLOAT4_TMP VALUES ('NaN x'::float4);
--Testcase 71:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 27:
DELETE FROM FLOAT4_TMP;
--Testcase 72:
INSERT INTO FLOAT4_TMP VALUES (' INFINITY x'::float4);
--Testcase 73:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 28:
DELETE FROM FLOAT4_TMP;
--Testcase 74:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 + 100.0);
--Testcase 75:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 30:
DELETE FROM FLOAT4_TMP;
--Testcase 76:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 / 'Infinity'::float4);
--Testcase 77:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 31:
DELETE FROM FLOAT4_TMP;
--Testcase 78:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / 'nan'::float4);
--Testcase 79:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 32:
DELETE FROM FLOAT4_TMP;
--Testcase 80:
INSERT INTO FLOAT4_TMP VALUES ('nan'::numeric::float4);
--Testcase 81:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 34:
SELECT '' AS five, * FROM FLOAT4_TBL;
--SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3';
--SELECT '' AS one, f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3';
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1;
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3';
--Testcase 35:
SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1;
--Testcase 36:
SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3';
--Testcase 37:
SELECT '' AS three, f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 38:
SELECT '' AS three, f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 39:
SELECT '' AS three, f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 40:
SELECT '' AS three, f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
-- test divide by zero
--Testcase 41:
SELECT '' AS bad, f.f1 / '0.0' from FLOAT4_TBL f;
--Testcase 42:
SELECT '' AS five, * FROM FLOAT4_TBL;
-- test the unary float4abs operator
--Testcase 43:
SELECT '' AS five, f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f;
--Testcase 44:
UPDATE FLOAT4_TBL
SET f1 = FLOAT4_TBL.f1 * '-1'
WHERE FLOAT4_TBL.f1 > '0.0';
--Testcase 45:
SELECT '' AS five, * FROM FLOAT4_TBL;
-- test edge-case coercions to integer
--Testcase 82:
DELETE FROM FLOAT4_TMP;
--Testcase 83:
INSERT INTO FLOAT4_TMP VALUES ('32767.4'::float4);
--Testcase 84:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 85:
DELETE FROM FLOAT4_TMP;
--Testcase 86:
INSERT INTO FLOAT4_TMP VALUES ('32767.6'::float4);
--Testcase 87:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 88:
DELETE FROM FLOAT4_TMP;
--Testcase 89:
INSERT INTO FLOAT4_TMP VALUES ('-32768.4'::float4);
--Testcase 90:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 91:
DELETE FROM FLOAT4_TMP;
--Testcase 92:
INSERT INTO FLOAT4_TMP VALUES ('-32768.6'::float4);
--Testcase 93:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 94:
DELETE FROM FLOAT4_TMP;
--Testcase 95:
INSERT INTO FLOAT4_TMP VALUES ('2147483520'::float4);
--Testcase 96:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 97:
DELETE FROM FLOAT4_TMP;
--Testcase 98:
INSERT INTO FLOAT4_TMP VALUES ('2147483647'::float4);
--Testcase 99:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 100:
DELETE FROM FLOAT4_TMP;
--Testcase 101:
INSERT INTO FLOAT4_TMP VALUES ('-2147483648.5'::float4);
--Testcase 102:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 103:
DELETE FROM FLOAT4_TMP;
--Testcase 104:
INSERT INTO FLOAT4_TMP VALUES ('-2147483900'::float4);
--Testcase 105:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 106:
DELETE FROM FLOAT4_TMP;
--Testcase 107:
INSERT INTO FLOAT4_TMP VALUES ('9223369837831520256'::float4);
--Testcase 108:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 109:
DELETE FROM FLOAT4_TMP;
--Testcase 110:
INSERT INTO FLOAT4_TMP VALUES ('9223372036854775807'::float4);
--Testcase 111:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 112:
DELETE FROM FLOAT4_TMP;
--Testcase 113:
INSERT INTO FLOAT4_TMP VALUES ('-9223372036854775808.5'::float4);
--Testcase 114:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 115:
DELETE FROM FLOAT4_TMP;
--Testcase 116:
INSERT INTO FLOAT4_TMP VALUES ('-9223380000000000000'::float4);
--Testcase 117:
SELECT f1::int8 FROM FLOAT4_TMP;
-- Test for correct input rounding in edge cases.
-- These lists are from Paxson 1991, excluding subnormals and
-- inputs of over 9 sig. digits.
--Testcase 118:
DELETE FROM FLOAT4_TMP;
--Testcase 119:
INSERT INTO FLOAT4_TMP VALUES ('5e-20'::float4);
--Testcase 120:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 121:
DELETE FROM FLOAT4_TMP;
--Testcase 122:
INSERT INTO FLOAT4_TMP VALUES ('67e14'::float4);
--Testcase 123:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 124:
DELETE FROM FLOAT4_TMP;
--Testcase 125:
INSERT INTO FLOAT4_TMP VALUES ('985e15'::float4);
--Testcase 126:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 127:
DELETE FROM FLOAT4_TMP;
--Testcase 128:
INSERT INTO FLOAT4_TMP VALUES ('55895e-16'::float4);
--Testcase 129:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 130:
DELETE FROM FLOAT4_TMP;
--Testcase 131:
INSERT INTO FLOAT4_TMP VALUES ('7038531e-32'::float4);
--Testcase 132:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 133:
DELETE FROM FLOAT4_TMP;
--Testcase 134:
INSERT INTO FLOAT4_TMP VALUES ('702990899e-20'::float4);
--Testcase 135:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 136:
DELETE FROM FLOAT4_TMP;
--Testcase 137:
INSERT INTO FLOAT4_TMP VALUES ('3e-23'::float4);
--Testcase 138:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 139:
DELETE FROM FLOAT4_TMP;
--Testcase 140:
INSERT INTO FLOAT4_TMP VALUES ('57e18'::float4);
--Testcase 141:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 142:
DELETE FROM FLOAT4_TMP;
--Testcase 143:
INSERT INTO FLOAT4_TMP VALUES ('789e-35'::float4);
--Testcase 144:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 145:
DELETE FROM FLOAT4_TMP;
--Testcase 146:
INSERT INTO FLOAT4_TMP VALUES ('2539e-18'::float4);
--Testcase 147:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 148:
DELETE FROM FLOAT4_TMP;
--Testcase 149:
INSERT INTO FLOAT4_TMP VALUES ('76173e28'::float4);
--Testcase 150:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 151:
DELETE FROM FLOAT4_TMP;
--Testcase 152:
INSERT INTO FLOAT4_TMP VALUES ('887745e-11'::float4);
--Testcase 153:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 154:
DELETE FROM FLOAT4_TMP;
--Testcase 155:
INSERT INTO FLOAT4_TMP VALUES ('5382571e-37'::float4);
--Testcase 156:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 157:
DELETE FROM FLOAT4_TMP;
--Testcase 158:
INSERT INTO FLOAT4_TMP VALUES ('82381273e-35'::float4);
--Testcase 159:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 160:
DELETE FROM FLOAT4_TMP;
--Testcase 161:
INSERT INTO FLOAT4_TMP VALUES ('750486563e-38'::float4);
--Testcase 162:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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...
--Testcase 163:
DELETE FROM FLOAT4_TMP;
--Testcase 164:
INSERT INTO FLOAT4_TMP VALUES ('1.17549435e-38'::float4);
--Testcase 165:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 166:
DELETE FROM FLOAT4_TMP;
--Testcase 167:
INSERT INTO FLOAT4_TMP VALUES('1.1754944e-38'::float4);
--Testcase 168:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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).
--Testcase 169:
create type xfloat4;
--Testcase 170:
create function xfloat4in(cstring) returns xfloat4 immutable strict
language internal as 'int4in';
--Testcase 171:
create function xfloat4out(xfloat4) returns cstring immutable strict
language internal as 'int4out';
--Testcase 172:
create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4);
--Testcase 173:
create cast (xfloat4 as float4) without function;
--Testcase 174:
create cast (float4 as xfloat4) without function;
--Testcase 175:
create cast (xfloat4 as integer) without function;
--Testcase 176:
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.
--Testcase 177:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 178:
insert into testdata(bits) 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');
--Testcase 179:
select float4send(flt) as ibits,
flt
from (select bits::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
begin;
--Testcase 180:
insert into testdata(bits) 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');
--Testcase 181:
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::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 182:
drop type xfloat4 cascade;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/float8.sql
================================================
--
-- FLOAT8
--
--Testcase 113:
CREATE EXTENSION sqlite_fdw;
--Testcase 114:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 115:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 116:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 2:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 4:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 5:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- test for underflow and overflow handling
--Testcase 6:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e400'::float8);
--Testcase 7:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e400'::float8);
--Testcase 8:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e-400'::float8);
--Testcase 9:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e-400'::float8);
-- test smallest normalized input
--Testcase 117:
INSERT INTO FLOAT8_TMP(f1) VALUES ('2.2250738585072014E-308'::float8);
--Testcase 118:
SELECT float8send(f1) FROM FLOAT8_TMP;
-- bad input
--Testcase 10:
INSERT INTO FLOAT8_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
--Testcase 17:
INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
-- special inputs
--Testcase 19:
DELETE FROM FLOAT8_TMP;
--Testcase 119:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8);
--Testcase 120:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 20:
DELETE FROM FLOAT8_TMP;
--Testcase 121:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8);
--Testcase 122:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 21:
DELETE FROM FLOAT8_TMP;
--Testcase 123:
INSERT INTO FLOAT8_TMP VALUES (' NAN '::float8);
--Testcase 124:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 22:
DELETE FROM FLOAT8_TMP;
--Testcase 125:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8);
--Testcase 126:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 23:
DELETE FROM FLOAT8_TMP;
--Testcase 127:
INSERT INTO FLOAT8_TMP VALUES (' -INFINiTY '::float8);
--Testcase 128:
SELECT f1 FROM FLOAT8_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT8_TMP;
--Testcase 129:
INSERT INTO FLOAT8_TMP VALUES ('N A N'::float8);
--Testcase 130:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 26:
DELETE FROM FLOAT8_TMP;
--Testcase 131:
INSERT INTO FLOAT8_TMP VALUES ('NaN x'::float8);
--Testcase 132:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 27:
DELETE FROM FLOAT8_TMP;
--Testcase 133:
INSERT INTO FLOAT8_TMP VALUES (' INFINITY x'::float8);
--Testcase 134:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 28:
DELETE FROM FLOAT8_TMP;
--Testcase 135:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 + 100.0);
--Testcase 136:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 30:
DELETE FROM FLOAT8_TMP;
--Testcase 137:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 / 'Infinity'::float8);
--Testcase 138:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 31:
DELETE FROM FLOAT8_TMP;
--Testcase 139:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / 'nan'::float8);
--Testcase 140:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 32:
DELETE FROM FLOAT8_TMP;
--Testcase 141:
INSERT INTO FLOAT8_TMP VALUES ('nan'::numeric::float8);
--Testcase 142:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 34:
SELECT '' AS five, * FROM FLOAT8_TBL;
--Testcase 35:
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
--Testcase 36:
SELECT '' AS one, f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
--Testcase 37:
SELECT '' AS three, f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
--Testcase 38:
SELECT '' AS three, f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
--Testcase 39:
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
--Testcase 40:
SELECT '' AS four, f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
--Testcase 41:
SELECT '' AS three, f.f1, f.f1 * '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 42:
SELECT '' AS three, f.f1, f.f1 + '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 43:
SELECT '' AS three, f.f1, f.f1 / '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 44:
SELECT '' AS three, f.f1, f.f1 - '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 45:
SELECT '' AS one, f.f1 ^ '2.0' AS square_f1
FROM FLOAT8_TBL f where f.f1 = '1004.3';
-- absolute value
--Testcase 46:
SELECT '' AS five, f.f1, @f.f1 AS abs_f1
FROM FLOAT8_TBL f;
-- truncate
--Testcase 47:
SELECT '' AS five, f.f1, trunc(f.f1) AS trunc_f1
FROM FLOAT8_TBL f;
-- round
--Testcase 48:
SELECT '' AS five, f.f1, round(f.f1) AS round_f1
FROM FLOAT8_TBL f;
-- ceil / ceiling
--Testcase 49:
select ceil(f1) as ceil_f1 from float8_tbl f;
--Testcase 50:
select ceiling(f1) as ceiling_f1 from float8_tbl f;
-- floor
--Testcase 51:
select floor(f1) as floor_f1 from float8_tbl f;
-- sign
--Testcase 52:
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
BEGIN;
--Testcase 53:
DELETE FROM FLOAT8_TBL;
--Testcase 54:
INSERT INTO FLOAT8_TBL VALUES ('64'::float8);
--Testcase 55:
SELECT sqrt(f1) as eight FROM FLOAT8_TBL;
--Testcase 56:
SELECT |/f1 as eight FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 57:
SELECT '' AS three, f.f1, |/f.f1 AS sqrt_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
-- power
--Testcase 58:
DELETE FROM FLOAT8_TMP;
--Testcase 143:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, '0.5'::float8);
--Testcase 144:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 60:
DELETE FROM FLOAT8_TMP;
--Testcase 145:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, '0.5'::float8);
--Testcase 146:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 61:
DELETE FROM FLOAT8_TMP;
--Testcase 147:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, 'NaN'::float8);
--Testcase 148:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 62:
DELETE FROM FLOAT8_TMP;
--Testcase 149:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, 'NaN'::float8);
--Testcase 150:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 63:
DELETE FROM FLOAT8_TMP;
--Testcase 151:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'NaN'::float8);
--Testcase 152:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 64:
DELETE FROM FLOAT8_TMP;
--Testcase 153:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'NaN'::float8);
--Testcase 154:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 65:
DELETE FROM FLOAT8_TMP;
--Testcase 155:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8 , '0'::float8);
--Testcase 156:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- take exp of ln(f.f1)
--Testcase 67:
SELECT '' AS three, f.f1, exp(ln(f.f1)) AS exp_ln_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
-- cube root
BEGIN;
--Testcase 68:
DELETE FROM FLOAT8_TBL;
--Testcase 69:
INSERT INTO FLOAT8_TBL VALUES ('27'::float8);
--Testcase 70:
SELECT ||/f1 as three FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 71:
SELECT '' AS five, f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
--Testcase 72:
SELECT '' AS five, * FROM FLOAT8_TBL;
--Testcase 73:
UPDATE FLOAT8_TBL
SET f1 = FLOAT8_TBL.f1 * '-1'
WHERE FLOAT8_TBL.f1 > '0.0';
--Testcase 74:
SELECT '' AS bad, f.f1 * '1e200' from FLOAT8_TBL f;
--Testcase 75:
SELECT '' AS bad, f.f1 ^ '1e200' from FLOAT8_TBL f;
BEGIN;
--Testcase 76:
DELETE FROM FLOAT8_TBL;
--Testcase 77:
INSERT INTO FLOAT8_TBL VALUES (0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5);
--Testcase 78:
SELECT * FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 79:
SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
--Testcase 80:
SELECT '' AS bad, ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
--Testcase 81:
SELECT '' AS bad, exp(f.f1) from FLOAT8_TBL f;
--Testcase 82:
SELECT '' AS bad, f.f1 / '0.0' from FLOAT8_TBL f;
--Testcase 83:
SELECT '' AS five, * 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.
--Testcase 157:
DELETE FROM FLOAT8_TMP;
--Testcase 158:
INSERT INTO FLOAT8_TMP(f1) VALUES (1);
--Testcase 159:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 160:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 161:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 162:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 163:
DELETE FROM FLOAT8_TMP;
--Testcase 164:
INSERT INTO FLOAT8_TMP(f1) VALUES (2);
--Testcase 165:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 166:
DELETE FROM FLOAT8_TMP;
--Testcase 167:
INSERT INTO FLOAT8_TMP(f1) VALUES (0.5);
--Testcase 168:
SELECT atanh(f1) FROM FLOAT8_TMP;
-- test Inf/NaN cases for hyperbolic functions
--Testcase 169:
DELETE FROM FLOAT8_TMP;
--Testcase 170:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 171:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 172:
DELETE FROM FLOAT8_TMP;
--Testcase 173:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 174:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 175:
DELETE FROM FLOAT8_TMP;
--Testcase 176:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 177:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 178:
DELETE FROM FLOAT8_TMP;
--Testcase 179:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 180:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 181:
DELETE FROM FLOAT8_TMP;
--Testcase 182:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 183:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 184:
DELETE FROM FLOAT8_TMP;
--Testcase 185:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 186:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 187:
DELETE FROM FLOAT8_TMP;
--Testcase 188:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 189:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 190:
DELETE FROM FLOAT8_TMP;
--Testcase 191:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 192:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 193:
DELETE FROM FLOAT8_TMP;
--Testcase 194:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 195:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 196:
DELETE FROM FLOAT8_TMP;
--Testcase 197:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 198:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 199:
DELETE FROM FLOAT8_TMP;
--Testcase 200:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 201:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 202:
DELETE FROM FLOAT8_TMP;
--Testcase 203:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 204:
SELECT asinh(f1) FROM FLOAT8_TMP;
-- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test
-- SELECT acosh(float8 'infinity');
--Testcase 205:
DELETE FROM FLOAT8_TMP;
--Testcase 206:
INSERT INTO FLOAT8_TMP VALUES (float8 '-infinity');
--Testcase 207:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 208:
DELETE FROM FLOAT8_TMP;
--Testcase 209:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 210:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 211:
DELETE FROM FLOAT8_TMP;
--Testcase 212:
INSERT INTO FLOAT8_TMP VALUES ((float8 'infinity'));
--Testcase 213:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 214:
DELETE FROM FLOAT8_TMP;
--Testcase 215:
INSERT INTO FLOAT8_TMP VALUES ((float8 '-infinity'));
--Testcase 216:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 217:
DELETE FROM FLOAT8_TMP;
--Testcase 218:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 219:
SELECT atanh(f1) FROM FLOAT8_TMP;
RESET extra_float_digits;
-- test for over- and underflow
--Testcase 84:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
--Testcase 85:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
--Testcase 86:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
--Testcase 87:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
-- maintain external table consistency across platforms
-- delete all values and reinsert well-behaved ones
--Testcase 88:
DELETE FROM FLOAT8_TBL;
--Testcase 89:
INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
--Testcase 90:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
--Testcase 91:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
--Testcase 92:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
--Testcase 93:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
--Testcase 94:
SELECT '' AS five, * FROM FLOAT8_TBL;
-- test edge-case coercions to integer
--Testcase 220:
DELETE FROM FLOAT8_TMP;
--Testcase 221:
INSERT INTO FLOAT8_TMP VALUES ('32767.4'::float8);
--Testcase 222:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 223:
DELETE FROM FLOAT8_TMP;
--Testcase 224:
INSERT INTO FLOAT8_TMP VALUES ('32767.6'::float8);
--Testcase 225:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 226:
DELETE FROM FLOAT8_TMP;
--Testcase 227:
INSERT INTO FLOAT8_TMP VALUES ('-32768.4'::float8);
--Testcase 228:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 229:
DELETE FROM FLOAT8_TMP;
--Testcase 230:
INSERT INTO FLOAT8_TMP VALUES ('-32768.6'::float8);
--Testcase 231:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 232:
DELETE FROM FLOAT8_TMP;
--Testcase 233:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.4'::float8);
--Testcase 234:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 235:
DELETE FROM FLOAT8_TMP;
--Testcase 236:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.6'::float8);
--Testcase 237:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 238:
DELETE FROM FLOAT8_TMP;
--Testcase 239:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.4'::float8);
--Testcase 240:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 241:
DELETE FROM FLOAT8_TMP;
--Testcase 242:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.6'::float8);
--Testcase 243:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 244:
DELETE FROM FLOAT8_TMP;
--Testcase 245:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854773760'::float8);
--Testcase 246:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 247:
DELETE FROM FLOAT8_TMP;
--Testcase 248:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854775807'::float8);
--Testcase 249:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 250:
DELETE FROM FLOAT8_TMP;
--Testcase 251:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854775808.5'::float8);
--Testcase 252:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 253:
DELETE FROM FLOAT8_TMP;
--Testcase 254:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854780000'::float8);
--Testcase 255:
SELECT f1::int8 FROM FLOAT8_TMP;
-- test exact cases for trigonometric functions in degrees
BEGIN;
--Testcase 95:
DELETE FROM FLOAT8_TBL;
--Testcase 96:
INSERT INTO FLOAT8_TBL VALUES (0), (30), (90), (150), (180),
(210), (270), (330), (360);
--Testcase 97:
SELECT f1,
sind(f1),
sind(f1) IN (-1,-0.5,0,0.5,1) AS sind_exact
FROM FLOAT8_TBL;
--Testcase 98:
DELETE FROM FLOAT8_TBL;
--Testcase 99:
INSERT INTO FLOAT8_TBL VALUES (0), (60), (90), (120), (180),
(240), (270), (300), (360);
--Testcase 100:
SELECT f1,
cosd(f1),
cosd(f1) IN (-1,-0.5,0,0.5,1) AS cosd_exact
FROM FLOAT8_TBL;
--Testcase 101:
DELETE FROM FLOAT8_TBL;
--Testcase 102:
INSERT INTO FLOAT8_TBL VALUES (0), (45), (90), (135), (180),
(225), (270), (315), (360);
--Testcase 103:
SELECT f1,
tand(f1),
tand(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS tand_exact,
cotd(f1),
cotd(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS cotd_exact
FROM FLOAT8_TBL;
--Testcase 104:
DELETE FROM FLOAT8_TBL;
--Testcase 105:
INSERT INTO FLOAT8_TBL VALUES (-1), (-0.5), (0), (0.5), (1);
--Testcase 106:
SELECT f1,
asind(f1),
asind(f1) IN (-90,-30,0,30,90) AS asind_exact,
acosd(f1),
acosd(f1) IN (0,60,90,120,180) AS acosd_exact
FROM FLOAT8_TBL;
--Testcase 107:
DELETE FROM FLOAT8_TBL;
--Testcase 108:
INSERT INTO FLOAT8_TBL VALUES ('-Infinity'::float8), (-1), (0), (1),
('Infinity'::float8);
--Testcase 109:
SELECT f1,
atand(f1),
atand(f1) IN (-90,-45,0,45,90) AS atand_exact
FROM FLOAT8_TBL;
--Testcase 110:
DELETE FROM FLOAT8_TBL;
--Testcase 111:
INSERT INTO FLOAT8_TBL SELECT * FROM generate_series(0, 360, 90);
--Testcase 112:
SELECT x, y,
atan2d(y, x),
atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact
FROM (SELECT 10*cosd(f1), 10*sind(f1)
FROM FLOAT8_TBL) AS t(x,y);
ROLLBACK;
--
-- 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).
--Testcase 256:
create type xfloat8;
--Testcase 257:
create function xfloat8in(cstring) returns xfloat8 immutable strict
language internal as 'int8in';
--Testcase 258:
create function xfloat8out(xfloat8) returns cstring immutable strict
language internal as 'int8out';
--Testcase 259:
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
--Testcase 260:
create cast (xfloat8 as float8) without function;
--Testcase 261:
create cast (float8 as xfloat8) without function;
--Testcase 262:
create cast (xfloat8 as bigint) without function;
--Testcase 263:
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.
--Testcase 264:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 265:
insert into testdata(bits) 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');
--Testcase 266:
select float8send(flt) as ibits,
flt
from (select bits::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- round-trip tests
begin;
--Testcase 267:
insert into testdata(bits) 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');
--Testcase 268:
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::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 269:
drop type xfloat8 cascade;
--Testcase 272:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/int4.sql
================================================
--
-- INT4 Based on PostgreSQL tests, please don't add additional tests here, use other test files
--
--Testcase 61:
CREATE EXTENSION sqlite_fdw;
--Testcase 62:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 63:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 64:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 2:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 3:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 4:
INSERT INTO INT4_TBL(f1) VALUES ('34.5');
-- largest and smallest values
--Testcase 5:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 6:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
-- bad input values -- should give errors
--Testcase 7:
INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
--Testcase 8:
INSERT INTO INT4_TBL(f1) VALUES ('asdf');
--Testcase 9:
INSERT INTO INT4_TBL(f1) VALUES (' ');
--Testcase 10:
INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
--Testcase 11:
INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
--Testcase 12:
INSERT INTO INT4_TBL(f1) VALUES ('123 5');
--Testcase 13:
INSERT INTO INT4_TBL(f1) VALUES ('');
--Testcase 14:
SELECT '' AS five, * FROM INT4_TBL;
--Testcase 15:
SELECT '' AS four, i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0';
--Testcase 16:
SELECT '' AS four, i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0';
--Testcase 17:
SELECT '' AS one, i.* FROM INT4_TBL i WHERE i.f1 = int2 '0';
--Testcase 18:
SELECT '' AS one, i.* FROM INT4_TBL i WHERE i.f1 = int4 '0';
--Testcase 19:
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 < int2 '0';
--Testcase 20:
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 < int4 '0';
--Testcase 21:
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0';
--Testcase 22:
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0';
--Testcase 23:
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 > int2 '0';
--Testcase 24:
SELECT '' AS two, i.* FROM INT4_TBL i WHERE i.f1 > int4 '0';
--Testcase 25:
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0';
--Testcase 26:
SELECT '' AS three, i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0';
-- positive odds
--Testcase 27:
SELECT '' AS one, i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
-- any evens
--Testcase 28:
SELECT '' AS three, i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
--Testcase 29:
SELECT '' AS five, i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i;
--Testcase 30:
SELECT '' AS five, i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 31:
SELECT '' AS five, i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i;
--Testcase 32:
SELECT '' AS five, i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 33:
SELECT '' AS five, i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i;
--Testcase 34:
SELECT '' AS five, i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 35:
SELECT '' AS five, i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i;
--Testcase 36:
SELECT '' AS five, i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 37:
SELECT '' AS five, i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i;
--Testcase 38:
SELECT '' AS five, i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 39:
SELECT '' AS five, i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i;
--Testcase 40:
SELECT '' AS five, i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 41:
SELECT '' AS five, i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i;
--Testcase 42:
SELECT '' AS five, i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i;
--
-- more complex expressions
--
-- variations on unary minus parsing
--Testcase 65:
DELETE FROM INT4_TMP;
--Testcase 66:
INSERT INTO INT4_TMP VALUES (-2, 3);
--Testcase 67:
SELECT f1 + f2 as one FROM INT4_TMP;
--Testcase 68:
DELETE FROM INT4_TMP;
--Testcase 69:
INSERT INTO INT4_TMP VALUES (4, 2);
--Testcase 70:
SELECT f1 - f2 as two FROM INT4_TMP;
--Testcase 46:
DELETE FROM INT4_TMP;
--Testcase 71:
INSERT INTO INT4_TMP VALUES (2, 1);
--Testcase 72:
SELECT f1- -f2 as three FROM INT4_TMP;
--Testcase 47:
DELETE FROM INT4_TMP;
--Testcase 73:
INSERT INTO INT4_TMP VALUES (2, 2);
--Testcase 74:
SELECT f1 - -f2 as four FROM INT4_TMP;
--Testcase 75:
DELETE FROM INT4_TMP;
--Testcase 76:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int2, '16'::int2 / '4'::int2);
--Testcase 77:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 78:
DELETE FROM INT4_TMP;
--Testcase 79:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int4, '16'::int2 / '4'::int4);
--Testcase 80:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 81:
DELETE FROM INT4_TMP;
--Testcase 82:
INSERT INTO INT4_TMP VALUES ('2'::int4 * '2'::int2, '16'::int4 / '4'::int2);
--Testcase 83:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 84:
DELETE FROM INT4_TMP;
--Testcase 85:
INSERT INTO INT4_TMP VALUES ('1000'::int4, '999'::int4);
--Testcase 86:
SELECT f1 < f2 AS false FROM INT4_TMP;
--Testcase 48:
DELETE FROM INT4_TMP;
--Testcase 87:
INSERT INTO INT4_TMP VALUES (4!);
--Testcase 88:
SELECT f1 as twenty_four FROM INT4_TMP;
--Testcase 49:
DELETE FROM INT4_TMP;
--Testcase 89:
INSERT INTO INT4_TMP VALUES (!!3);
--Testcase 90:
SELECT f1 as six FROM INT4_TMP;
--Testcase 50:
DELETE FROM INT4_TMP;
--Testcase 91:
INSERT INTO INT4_TMP VALUES (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1);
--Testcase 92:
SELECT f1 as ten FROM INT4_TMP;
--Testcase 51:
DELETE FROM INT4_TMP;
--Testcase 93:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 94:
SELECT f1 + f1/f2 as three FROM INT4_TMP;
--Testcase 52:
DELETE FROM INT4_TMP;
--Testcase 95:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 96:
SELECT (f1 + f2)/f2 as two FROM INT4_TMP;
-- corner case
--Testcase 54:
DELETE FROM INT4_TMP;
--Testcase 97:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 98:
SELECT (f1<<31)::text FROM INT4_TMP;
--Testcase 56:
DELETE FROM INT4_TMP;
--Testcase 99:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 100:
SELECT ((f1<<31)+1)::text FROM INT4_TMP;
-- check sane handling of INT_MIN overflow cases
--Testcase 58:
DELETE FROM INT4_TMP;
--Testcase 101:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int4);
--Testcase 102:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 103:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 104:
SELECT f1 % f2 FROM INT4_TMP;
--Testcase 60:
DELETE FROM INT4_TMP;
--Testcase 105:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int2);
--Testcase 106:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 107:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 108:
SELECT f1 % f2 FROM INT4_TMP;
-- check rounding when casting from float
--Testcase 109:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 110:
DELETE FROM FLOAT8_TMP;
--Testcase 111:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 112:
SELECT f1 as x, f1::int4 as int4_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 113:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 114:
DELETE FROM NUMERIC_TMP;
--Testcase 115:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 116:
SELECT f1 as x, f1::int4 as int4_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 117:
DELETE FROM INT4_TMP;
--Testcase 118:
INSERT INTO INT4_TMP 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);
--Testcase 119:
SELECT f1, f2, gcd(f1, f2), gcd(f1, -f2), gcd(f2, f1), gcd(-f2, f1) FROM INT4_TMP;
--Testcase 120:
DELETE FROM INT4_TMP;
--Testcase 121:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 0::int4);
--Testcase 122:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 123:
DELETE FROM INT4_TMP;
--Testcase 124:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-2147483648)::int4);
--Testcase 125:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
-- test lcm()
--Testcase 126:
DELETE FROM INT4_TMP;
--Testcase 127:
INSERT INTO INT4_TMP 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);
--Testcase 128:
SELECT f1, f2, lcm(f1, f2), lcm(f1, -f2), lcm(f2, f1), lcm(-f2, f1) FROM INT4_TMP;
--Testcase 129:
DELETE FROM INT4_TMP;
--Testcase 130:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 1::int4);
--Testcase 131:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 132:
DELETE FROM INT4_TMP;
--Testcase 133:
INSERT INTO INT4_TMP VALUES (2147483647::int4, 2147483646::int4);
--Testcase 134:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 137:
DELETE FROM INT4_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 135:
DROP SERVER sqlite_svr;
--Testcase 136:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/int8.sql
================================================
--
-- INT8
-- Test int8 64-bit integers.
--
--Testcase 140:
CREATE EXTENSION sqlite_fdw;
--Testcase 141:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 142:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 143:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 2:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 3:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 4:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 5:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
-- bad inputs
--Testcase 6:
INSERT INTO INT8_TBL(q1) VALUES (' ');
--Testcase 7:
INSERT INTO INT8_TBL(q1) VALUES ('xxx');
--Testcase 8:
INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485');
--Testcase 9:
INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934');
--Testcase 10:
INSERT INTO INT8_TBL(q1) VALUES ('- 123');
--Testcase 11:
INSERT INTO INT8_TBL(q1) VALUES (' 345 5');
--Testcase 12:
INSERT INTO INT8_TBL(q1) VALUES ('');
--Testcase 13:
SELECT * FROM INT8_TBL;
-- int8/int8 cmp
--Testcase 14:
SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
--Testcase 15:
SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
--Testcase 16:
SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
--Testcase 17:
SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
--Testcase 18:
SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
--Testcase 19:
SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
-- int8/int4 cmp
--Testcase 20:
SELECT * FROM INT8_TBL WHERE q2 = 456;
--Testcase 21:
SELECT * FROM INT8_TBL WHERE q2 <> 456;
--Testcase 22:
SELECT * FROM INT8_TBL WHERE q2 < 456;
--Testcase 23:
SELECT * FROM INT8_TBL WHERE q2 > 456;
--Testcase 24:
SELECT * FROM INT8_TBL WHERE q2 <= 456;
--Testcase 25:
SELECT * FROM INT8_TBL WHERE q2 >= 456;
-- int4/int8 cmp
--Testcase 26:
SELECT * FROM INT8_TBL WHERE 123 = q1;
--Testcase 27:
SELECT * FROM INT8_TBL WHERE 123 <> q1;
--Testcase 28:
SELECT * FROM INT8_TBL WHERE 123 < q1;
--Testcase 29:
SELECT * FROM INT8_TBL WHERE 123 > q1;
--Testcase 30:
SELECT * FROM INT8_TBL WHERE 123 <= q1;
--Testcase 31:
SELECT * FROM INT8_TBL WHERE 123 >= q1;
-- int8/int2 cmp
--Testcase 32:
SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
--Testcase 33:
SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
--Testcase 34:
SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
--Testcase 35:
SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
--Testcase 36:
SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
--Testcase 37:
SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
-- int2/int8 cmp
--Testcase 38:
SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
--Testcase 39:
SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
--Testcase 40:
SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
--Testcase 41:
SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
--Testcase 42:
SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
--Testcase 43:
SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
--Testcase 44:
SELECT '' AS five, q1 AS plus, -q1 AS minus FROM INT8_TBL;
--Testcase 45:
SELECT '' AS five, q1, q2, q1 + q2 AS plus FROM INT8_TBL;
--Testcase 46:
SELECT '' AS five, q1, q2, q1 - q2 AS minus FROM INT8_TBL;
--Testcase 47:
SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
--Testcase 48:
SELECT '' AS three, q1, q2, q1 * q2 AS multiply FROM INT8_TBL
WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
--Testcase 49:
SELECT '' AS five, q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
--Testcase 50:
SELECT '' AS five, q1, float8(q1) FROM INT8_TBL;
--Testcase 51:
SELECT '' AS five, q2, float8(q2) FROM INT8_TBL;
--Testcase 52:
SELECT 37 + q1 AS plus4 FROM INT8_TBL;
--Testcase 53:
SELECT 37 - q1 AS minus4 FROM INT8_TBL;
--Testcase 54:
SELECT '' AS five, 2 * q1 AS "twice int4" FROM INT8_TBL;
--Testcase 55:
SELECT '' AS five, q1 * 2 AS "twice int4" FROM INT8_TBL;
-- int8 op int4
--Testcase 56:
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
--Testcase 57:
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
--Testcase 58:
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
--Testcase 59:
SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
--Testcase 60:
SELECT q2, abs(q2) FROM INT8_TBL;
--Testcase 61:
SELECT min(q1), min(q2) FROM INT8_TBL;
--Testcase 62:
SELECT max(q1), max(q2) FROM INT8_TBL;
-- TO_CHAR()
--
--Testcase 63:
SELECT '' AS to_char_1, to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999')
FROM INT8_TBL;
--Testcase 64:
SELECT '' AS to_char_2, to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999')
FROM INT8_TBL;
--Testcase 65:
SELECT '' AS to_char_3, to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR')
FROM INT8_TBL;
--Testcase 66:
SELECT '' AS to_char_4, to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999')
FROM INT8_TBL;
--Testcase 67:
SELECT '' AS to_char_5, to_char(q2, 'MI9999999999999999') FROM INT8_TBL;
--Testcase 68:
SELECT '' AS to_char_6, to_char(q2, 'FMS9999999999999999') FROM INT8_TBL;
--Testcase 69:
SELECT '' AS to_char_7, to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL;
--Testcase 70:
SELECT '' AS to_char_8, to_char(q2, 'SG9999999999999999th') FROM INT8_TBL;
--Testcase 71:
SELECT '' AS to_char_9, to_char(q2, '0999999999999999') FROM INT8_TBL;
--Testcase 72:
SELECT '' AS to_char_10, to_char(q2, 'S0999999999999999') FROM INT8_TBL;
--Testcase 73:
SELECT '' AS to_char_11, to_char(q2, 'FM0999999999999999') FROM INT8_TBL;
--Testcase 74:
SELECT '' AS to_char_12, to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL;
--Testcase 75:
SELECT '' AS to_char_13, to_char(q2, 'L9999999999999999.000') FROM INT8_TBL;
--Testcase 76:
SELECT '' AS to_char_14, to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL;
--Testcase 77:
SELECT '' AS to_char_15, 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;
--Testcase 78:
SELECT '' AS to_char_16, to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
--Testcase 79:
SELECT '' AS to_char_17, to_char(q2, '999999SG9999999999') FROM INT8_TBL;
-- check min/max values and overflow behavior
--Testcase 80:
DELETE FROM INT8_TMP;
--Testcase 144:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 145:
SELECT q1 FROM INT8_TMP;
--Testcase 81:
DELETE FROM INT8_TMP;
--Testcase 146:
INSERT INTO INT8_TMP VALUES ('-9223372036854775809'::int8);
--Testcase 147:
SELECT q1 FROM INT8_TMP;
--Testcase 82:
DELETE FROM INT8_TMP;
--Testcase 148:
INSERT INTO INT8_TMP VALUES ('9223372036854775807'::int8);
--Testcase 149:
SELECT q1 FROM INT8_TMP;
--Testcase 83:
DELETE FROM INT8_TMP;
--Testcase 150:
INSERT INTO INT8_TMP VALUES ('9223372036854775808'::int8);
--Testcase 151:
SELECT q1 FROM INT8_TMP;
--Testcase 84:
DELETE FROM INT8_TMP;
--Testcase 152:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775807'::int8));
--Testcase 153:
SELECT q1 FROM INT8_TMP;
--Testcase 86:
DELETE FROM INT8_TMP;
--Testcase 154:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775808'::int8));
--Testcase 155:
SELECT q1 FROM INT8_TMP;
--Testcase 87:
DELETE FROM INT8_TMP;
--Testcase 156:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 157:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 88:
DELETE FROM INT8_TMP;
--Testcase 158:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 159:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 89:
DELETE FROM INT8_TMP;
--Testcase 160:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 161:
SELECT q1-q2 FROM INT8_TMP;
--Testcase 90:
DELETE FROM INT8_TMP;
--Testcase 162:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 163:
SELECT q1 - q2 FROM INT8_TMP;
--Testcase 91:
DELETE FROM INT8_TMP;
--Testcase 164:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 165:
SELECT q1 * q2 FROM INT8_TMP;
--Testcase 92:
DELETE FROM INT8_TMP;
--Testcase 166:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 167:
SELECT q1 / q2 FROM INT8_TMP;
--Testcase 93:
DELETE FROM INT8_TMP;
--Testcase 168:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 169:
SELECT q1 % q2 FROM INT8_TMP;
--Testcase 94:
DELETE FROM INT8_TMP;
--Testcase 170:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 171:
SELECT abs(q1) FROM INT8_TMP;
--Testcase 95:
DELETE FROM INT8_TMP;
--Testcase 172:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 173:
SELECT q1 + q3 FROM INT8_TMP;
--Testcase 96:
DELETE FROM INT8_TMP;
--Testcase 174:
INSERT INTO INT8_TMP(q1, q3) VALUES ('-9223372036854775800'::int8 , '100'::int4);
--Testcase 175:
SELECT q1 - q3 FROM INT8_TMP;
--Testcase 97:
DELETE FROM INT8_TMP;
--Testcase 176:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 177:
SELECT q1 * q3 FROM INT8_TMP;
--Testcase 98:
DELETE FROM INT8_TMP;
--Testcase 178:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 179:
SELECT q3 + q1 FROM INT8_TMP;
--Testcase 99:
DELETE FROM INT8_TMP;
--Testcase 180:
INSERT INTO INT8_TMP(q3, q1) VALUES ('-100'::int4 , '9223372036854775800'::int8);
--Testcase 181:
SELECT q3 - q1 FROM INT8_TMP;
--Testcase 100:
DELETE FROM INT8_TMP;
--Testcase 182:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 183:
SELECT q3 * q1 FROM INT8_TMP;
--Testcase 101:
DELETE FROM INT8_TMP;
--Testcase 184:
INSERT INTO INT8_TMP(q1, q4) VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 185:
SELECT q1 + q4 FROM INT8_TMP;
--Testcase 102:
DELETE FROM INT8_TMP;
--Testcase 186:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775800'::int8 , '100'::int2);
--Testcase 187:
SELECT q1 - q4 FROM INT8_TMP;
--Testcase 103:
DELETE FROM INT8_TMP;
--Testcase 188:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 189:
SELECT q1 * q4 FROM INT8_TMP;
--Testcase 104:
DELETE FROM INT8_TMP;
--Testcase 190:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775808'::int8 , '0'::int2);
--Testcase 191:
SELECT q1 / q4 FROM INT8_TMP;
--Testcase 105:
DELETE FROM INT8_TMP;
--Testcase 192:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 193:
SELECT q4 + q1 FROM INT8_TMP;
--Testcase 106:
DELETE FROM INT8_TMP;
--Testcase 194:
INSERT INTO INT8_TMP(q4, q1) VALUES ('-100'::int2 , '9223372036854775800'::int8);
--Testcase 195:
SELECT q4 - q1 FROM INT8_TMP;
--Testcase 107:
DELETE FROM INT8_TMP;
--Testcase 196:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 197:
SELECT q4 * q1 FROM INT8_TMP;
--Testcase 108:
DELETE FROM INT8_TMP;
--Testcase 198:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '0'::int8);
--Testcase 199:
SELECT q4 / q1 FROM INT8_TMP;
--Testcase 110:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
--Testcase 111:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
--Testcase 112:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
--Testcase 113:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
--Testcase 200:
DELETE FROM INT8_TMP;
--Testcase 201:
INSERT INTO INT8_TMP(q5) VALUES ('42'), ('-37');
--Testcase 202:
SELECT CAST(q5::int2 as int8) FROM INT8_TMP;
--Testcase 114:
SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
--Testcase 203:
DELETE FROM INT8_TMP;
--Testcase 204:
INSERT INTO INT8_TMP(q5) VALUES ('36854775807.0');
--Testcase 205:
SELECT CAST(q5::float4 AS int8) FROM INT8_TMP;
--Testcase 206:
DELETE FROM INT8_TMP;
--Testcase 207:
INSERT INTO INT8_TMP(q5) VALUES ('922337203685477580700.0');
--Testcase 208:
SELECT CAST(q5::float8 AS int8) FROM INT8_TMP;
--Testcase 115:
SELECT CAST(q1 AS oid) FROM INT8_TBL;
--Testcase 209:
SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
-- bit operations
--Testcase 116:
SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
--Testcase 117:
SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
-- generate_series
--Testcase 118:
DELETE FROM INT8_TMP;
--Testcase 210:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8) q1;
--Testcase 211:
SELECT q1 FROM INT8_TMP;
--Testcase 120:
DELETE FROM INT8_TMP;
--Testcase 212:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0) q1; -- should error
--Testcase 213:
SELECT q1 FROM INT8_TMP;
--Testcase 122:
DELETE FROM INT8_TMP;
--Testcase 214:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2) q1;
--Testcase 215:
SELECT q1 FROM INT8_TMP;
-- corner case
--Testcase 216:
DELETE FROM INT8_TMP;
--Testcase 217:
INSERT INTO INT8_TMP VALUES (-1::int8<<63);
--Testcase 218:
SELECT q1::text FROM INT8_TMP;
--Testcase 219:
DELETE FROM INT8_TMP;
--Testcase 220:
INSERT INTO INT8_TMP VALUES ((-1::int8<<63)+1);
--Testcase 221:
SELECT q1::text FROM INT8_TMP;
-- check sane handling of INT64_MIN overflow cases
--Testcase 125:
DELETE FROM INT8_TMP;
--Testcase 222:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int8, 888);
--Testcase 126:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int8, 888);
--Testcase 127:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int8, 888);
--Testcase 128:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 129:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 130:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int4, 888);
--Testcase 131:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int4, 888);
--Testcase 132:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int4, 888);
--Testcase 133:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 134:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 135:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int2, 888);
--Testcase 136:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int2, 888);
--Testcase 137:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int2, 888);
--Testcase 138:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 139:
DELETE FROM INT8_TMP WHERE q2 = 888;
-- check rounding when casting from float
--Testcase 223:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 224:
DELETE FROM FLOAT8_TMP;
--Testcase 225:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 226:
SELECT f1 as x, f1::int8 as int8_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 227:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 228:
DELETE FROM NUMERIC_TMP;
--Testcase 229:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 230:
SELECT f1 as x, f1::int8 as int8_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 231:
DELETE FROM INT8_TMP;
--Testcase 232:
INSERT INTO INT8_TMP 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);
--Testcase 233:
SELECT q1, q2, gcd(q1, q2), gcd(q1, -q2), gcd(q2, q1), gcd(-q2, q1) FROM INT8_TMP;
--Testcase 234:
DELETE FROM INT8_TMP;
--Testcase 235:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 0::int8);
--Testcase 236:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 237:
DELETE FROM INT8_TMP;
--Testcase 238:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, (-9223372036854775808)::int8);
--Testcase 239:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
-- test lcm()
--Testcase 240:
DELETE FROM INT8_TMP;
--Testcase 241:
INSERT INTO INT8_TMP 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);
--Testcase 242:
SELECT q1, q2, lcm(q1, q2), lcm(q1, -q2), lcm(q2, q1), lcm(-q2, q1) FROM INT8_TMP;
--Testcase 243:
DELETE FROM INT8_TMP;
--Testcase 244:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 1::int8);
--Testcase 245:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 246:
DELETE FROM INT8_TMP;
--Testcase 247:
INSERT INTO INT8_TMP VALUES ((9223372036854775807)::int8, (9223372036854775806)::int8);
--Testcase 248:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 251:
DELETE FROM INT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 249:
DROP SERVER sqlite_svr;
--Testcase 250:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/json.sql
================================================
-- SET log_min_messages TO DEBUG3;
-- SET client_min_messages TO DEBUG3;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 010:
CREATE FOREIGN TABLE "type_JSON" (
"i" int OPTIONS (key 'true'),
"j" json,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" json
) SERVER sqlite_svr OPTIONS (table 'type_JSON');
--Testcase 011:
CREATE FOREIGN TABLE "type_JSONB" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB');
--Testcase 012:
CREATE FOREIGN TABLE "type_JSONB+" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
l int, t varchar(16), tx text,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB+');
--Testcase 013:
INSERT INTO "type_JSON" ("i", "j", ot, ot1, oi, oi1) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}],"a+u":47,"5":true,"cc3":["a", "b", "c"], "c3":[true, false]}',
'c', 'c3', 2, 1),
(2, '[11,22,33,44,55,66,77,88,99,10,11,12,13,14]',
'1', '29', 3, 1),
(3, '{"a":"xyz", "π":3.1415926535, "aπ":false }',
'a', 'π', 1, NULL),
(4, '{"a":null, "a22":22.0, "a2":2 }',
'a', '22', 4, NULL),
(5, '[9,null,7,6,5,4,3,2,1,0]',
'1', '5', -4, 5),
(6, '[0.0,1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,null,true]',
'1', '21', -2, 5);
--Testcase 014:
INSERT INTO "type_JSONB" SELECT * FROM "type_JSON";
--Testcase 015: check some SQLite JSONb initial bytes
SELECT i, tx FROM "type_JSONB+";
--Testcase 020:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 021: SQLite queries to type_JSON will be without normalization for j column
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN j OPTIONS (ADD column_type 'text');
--Testcase 022:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 023:
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 024:
SELECT "i", "j", j."j"->'a' res FROM "type_JSON" j;
--Testcase 025:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 026:
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 027:
SELECT "i", "j", j."j"->'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 028:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 029:
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 030:
SELECT "i", "j", j."j"->>'a' res FROM "type_JSON" j;
--Testcase 031:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 032:
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 033:
SELECT "i", "j", j."j"->>'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 034:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 035:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 036:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 037:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 038:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 039:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 040:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 041:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 042:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 044:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 045:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 046:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 047:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 048:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSON" j;
--Testcase 049:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 050:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 051:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSONB" j;
--Testcase 052:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 053:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 054:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSON" j;
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 056:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 057:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSONB" j;
--Testcase 058:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 059:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 060:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 061:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 062:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 063:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 064:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 065:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 066:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 067:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 068:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 069:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 071:
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 072:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 073:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 074:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 075:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 077:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 078:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 079:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 081:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 082:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 083:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 085:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 086:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 087:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 088:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 089:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 090:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 091:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 093:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 095:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 096:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 097:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 099:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
-- extraction with arithmetical an other expressions
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 101:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 103:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 105:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 107:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 109:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 111:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 113:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 115:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 117:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 119:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 120:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 121:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 123:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 125:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 127:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 129:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 131:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 133:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 135:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 137:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 139:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 141:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 143:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 144:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 145:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 146:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 147:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 148:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 149:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 151:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 153:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 155:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 157:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 159:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 161:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 163:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 165:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 167:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 169:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 171:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 172:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 173:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 174:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 175:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 176:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 177:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 178:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 179:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--TCs for SQLite JSON -> format, no sense in PostgreSQL itself
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 201:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 203:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 204:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 205:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 206:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 207:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 208:
DELETE FROM "type_JSON";
--Testcase 209:
DELETE FROM "type_JSONB";
--Testcase 210:
INSERT INTO "type_JSON" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 211:
INSERT INTO "type_JSONB" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 212:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 213:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 214:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 215:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 216:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 217:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 218:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 219:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 220:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 221:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 222:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 223:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 224:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 225:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 226:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
--Testcase 227:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
-- end of SQLite right -> ->> operand test
-- Operators -> ->> in SELECT context
--Testcase 230:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 231:
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 232:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 233:
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 234:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 235:
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 236:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 237:
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 238:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 239:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 240:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 241:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 250:
DELETE FROM "type_JSON";
--Testcase 251:
DELETE FROM "type_JSONB";
--Testcase 252:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text;
--Testcase 253:
INSERT INTO "type_JSON" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 254:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text[];
--Testcase 255:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text;
--Testcase 256:
INSERT INTO "type_JSONB" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 257:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text[];
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 261:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 262:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 263:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 265
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 267:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 269:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 270:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 271:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 272:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 273
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 274:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 275:
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 276:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 277: no such - even wrong JSON gives false
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 278:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 279:
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 280:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 281: no such - even wrong JSON gives false
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 282:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 283:
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 284:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 285: no such
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 286:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 287:
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 288:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 289: no such
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 290:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 291:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 292:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 293:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 294:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 295:
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 296:
SELECT * FROM "type_JSONB+";
--Testcase 297:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 298:
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 299:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Testcase 300: no such
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Multievel extraction chains
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 302:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 304:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 306:
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
--Testcase 308:
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
-- UPDATE tests
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 310:
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 311:
SELECT * FROM "type_JSON" WHERE "i" = 1;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 313:
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 314:
SELECT * FROM "type_JSONB+" WHERE "i" = 1;
-- Real GIS data test, data from https://www.wikidata.org/wiki/Q118122043
-- https://commons.wikimedia.org/wiki/Category:Private_Garden_(Pavlovsk)
-- License of testing data in json_osm_test table: ODbL, © OpenStreetMap contributors
--Testcase 400:
CREATE FOREIGN TABLE json_osm_test (
wkt text NOT NULL,
osm_type varchar(8) OPTIONS (key 'true') NOT NULL,
osm_id int8 OPTIONS (key 'true') NOT NULL,
t json OPTIONS (column_name 'tags') NULL,
way_nodes text NULL
) SERVER sqlite_svr;
--Testcase 401:
INSERT INTO json_osm_test VALUES ('SRID=4326;POINT(30.4536193 59.6847624)', 'node', 1198356775, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4522474 59.6851858)', 'node', 1198357028, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4532025 59.6850113)', 'node', 1738381537, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "description": "Ваза в дендрарии Собственного садика", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529584 59.6849417)', 'node', 3968068680, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526407 59.68497)', 'node', 4487385447, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "late C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4524943 59.6854502)', 'node', 4912270255, '{"fee": "yes", "access": "customers", "barrier": "gate", "vehicle": "no", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "barrier:personnel": "additional"}', NULL),
('SRID=4326;POINT(30.452977 59.6847621)', 'node', 7484858507, '{"name": "Неизвестный мужчина", "ref:okn": "781610399040516", "tourism": "artwork", "alt_name": "Спутник Одиссея", "heritage": "2", "historic": "yes", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6522/"}', NULL),
('SRID=4326;POINT(30.452909 59.6847573)', 'node', 7484858508, '{"name": "Антиной", "ref:okn": "781610399040526", "tourism": "artwork", "alt_name": "Дионис", "heritage": "2", "historic": "yes", "material": "stone", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6521/"}', NULL),
('SRID=4326;POINT(30.4529561 59.6848095)', 'node', 8114975053, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528946 59.6848042)', 'node', 8114975054, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528732 59.6848762)', 'node', 8114975055, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529364 59.6848802)', 'node', 8114975056, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528444 59.6851765)', 'node', 8289295956, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527798 59.6851726)', 'node', 8289295957, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528665 59.6850957)', 'node', 8289295958, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528046 59.685091)', 'node', 8289295959, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528947 59.6850172)', 'node', 8289295960, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528301 59.6850118)', 'node', 8289295961, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529101 59.6849636)', 'node', 8289295962, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528496 59.684959)', 'node', 8289295963, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528359 59.6852187)', 'node', 8331430659, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527605 59.685213)', 'node', 8331430660, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4523414 59.6851726)', 'node', 8331430663, '{"name": "Сатир", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4523561 59.685141)', 'node', 8331430664, '{"name": "Сатиресса", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4527994 59.6847007)', 'node', 8566916332, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4528945 59.6847497)', 'node', 8566916333, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529784 59.6853519)', 'node', 8895996426, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4529255 59.6853861)', 'node', 8895996427, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4525278 59.685471)', 'node', 8895996643, '{"genus": "Tilia", "height": "6", "natural": "tree", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4534153 59.6851412)', 'node', 8899249758, '{"genus": "Elaeagnus", "taxon": "Elaeagnus commutata", "natural": "shrub", "genus:ru": "Лох", "taxon:ru": "Лох серебристый", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4535524 59.6848638)', 'node', 8899249764, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4535202 59.6849613)', 'node', 8899249765, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534934 59.6850486)', 'node', 8899249766, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534679 59.685136)', 'node', 8899249767, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4528899 59.6851725)', 'node', 8899249768, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530448 59.6850046)', 'node', 8899249769, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4533465 59.6850216)', 'node', 8899249770, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4532205 59.6849417)', 'node', 8899249771, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531776 59.6850839)', 'node', 8899249772, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4534136 59.6851265)', 'node', 8899249773, '{"genus": "Malus", "taxon": "Malus niedzwetzkyana", "height": "5", "natural": "tree", "genus:ru": "Яблоня", "taxon:ru": "Яблоня Недзвецкого", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533043 59.6851928)', 'node', 8899249779, '{"height": "4", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.452916 59.6849894)', 'node', 8899249796, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4528248 59.684983)', 'node', 8899249797, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531527 59.685139)', 'node', 8899299127, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529549 59.6850382)', 'node', 8902082041, '{"genus": "Syrínga", "taxon": "Syringa vulgaris", "natural": "shrub", "genus:ru": "Сирень", "taxon:ru": "Сирень обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530139 59.6850101)', 'node', 8902082042, '{"genus": "Amelanchier", "taxon": "Amelanchier canadensis", "natural": "shrub", "genus:ru": "Ирга", "taxon:ru": "Ирга канадская", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530089 59.6850564)', 'node', 8902082048, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529982 59.685072)', 'node', 8902082055, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530213 59.6850872)', 'node', 8902082060, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529918 59.6851617)', 'node', 8902082061, '{"genus": "Berberis", "taxon": "Berberis vulgaris", "natural": "shrub", "genus:ru": "Барбарис", "taxon:ru": "Барбарис обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530615 59.685137)', 'node', 8902082071, '{"genus": "Paeonia", "taxon": "Paeonia suffruticosa", "natural": "shrub", "genus:ru": "Пион", "taxon:ru": "Пион древовидный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531031 59.6851282)', 'node', 8902082072, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530991 59.6851451)', 'node', 8902082073, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531977 59.6851532)', 'node', 8902082074, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453207 59.6851336)', 'node', 8902082075, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532426 59.6850926)', 'node', 8902082171, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532694 59.6851157)', 'node', 8902082172, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533707 59.6851035)', 'node', 8902082173, '{"genus": "Hydrangea", "taxon": "Hydrangea paniculata", "natural": "shrub", "genus:ru": "Гортензия", "taxon:ru": "Гортензия метельчатая"}', NULL),
('SRID=4326;POINT(30.4528986 59.6851502)', 'node', 8902082174, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4530486 59.6848994)', 'node', 8904992674, '{"genus": "Viburnum", "taxon": "Viburnum opulus", "natural": "shrub", "genus:ru": "Калина", "taxon:ru": "Калина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532396 59.6848373)', 'node', 8905335421, '{"genus": "Corylus", "taxon": "Corylus avellana", "natural": "shrub", "genus:ru": "Лещина", "taxon:ru": "Лещина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532946 59.684841)', 'node', 8905335422, '{"genus": "Spiraea", "taxon": "Spiraea chamaedryfolia", "natural": "shrub", "genus:ru": "Спирея", "taxon:ru": "Спирея дубравколистная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533857 59.6849271)', 'node', 8905335423, '{"genus": "Euonymus", "taxon": "Euonymus europaeus", "natural": "shrub", "genus:ru": "Бересклет", "taxon:ru": "Бересклет европейский", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534136 59.6849004)', 'node', 8905335424, '{"genus": "Prunus", "taxon": "Prunus sachalinensis", "height": "5", "natural": "tree", "genus:ru": "Вишня", "taxon:ru": "Вишня сахалинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533998 59.6848611)', 'node', 8905335425, '{"genus": "Buxus", "taxon": "Buxus sempervirens", "height": "1", "natural": "shrub", "genus:ru": "Самшит", "taxon:ru": "Самшит вечнозелёный", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4534776 59.6848679)', 'node', 8905335426, '{"genus": "Rhamnus", "taxon": "Rhamnus cathartica", "height": "4", "natural": "tree", "genus:ru": "Жостер", "taxon:ru": "Жостер слабительный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534324 59.6849515)', 'node', 8905335427, '{"genus": "Lonicera", "taxon": "Lonicera caerulea", "natural": "shrub", "genus:ru": "Жимолость", "taxon:ru": "Жимолость синяя", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453365 59.684981)', 'node', 8905335428, '{"genus": "Philadelphus", "taxon": "Philadelphus coronarius", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник венечный"}', NULL),
('SRID=4326;POINT(30.4533874 59.6849671)', 'node', 8905335429, '{"genus": "Juniperus", "taxon": "Juniperus sabina", "height": "0.5", "natural": "shrub", "genus:ru": "Можжевельник", "taxon:ru": "Можжевельник казацкий", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4531319 59.6849356)', 'node', 8905335430, '{"genus": "Picea", "taxon": "Picea abies", "height": "0.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель европейская", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532466 59.6848527)', 'node', 8905335431, '{"genus": "Ginkgo", "taxon": "Ginkgo biloba", "height": "2.5", "natural": "tree", "genus:ru": "Гингко", "taxon:ru": "Гинкго двулопастный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "label"}', NULL),
('SRID=4326;POINT(30.4532184 59.6848635)', 'node', 8905335468, '{"genus": "Daphne", "taxon": "Daphne mezereum", "natural": "shrub", "genus:ru": "Волчеягодник", "taxon:ru": "Волчеягодник обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532392 59.6848902)', 'node', 8905335469, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526679 59.6846912)', 'node', 8905558225, '{"height": "3", "highway": "street_lamp", "man_made": "surveillance", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530347 59.6849253)', 'node', 8906857477, '{"genus": "Philadelphus lemoinei", "taxon": "Philadelphus lemoinei", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник Лемуана", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530224 59.6849455)', 'node', 8906857478, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530015 59.6847554)', 'node', 8906857479, '{"natural": "tree_stump"}', NULL),
('SRID=4326;LINESTRING(30.4522584 59.6851734,30.4522474 59.6851858)', 'way', 103807093, '{"highway": "footway", "surface": "compacted"}', '{3968068679,1198357028}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525041 59.6846527,30.4522364 59.6845601,30.4516531 59.6843525,30.4513385 59.6842533,30.4513511 59.6841667)', 'way', 103807103, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{8566824024,12023699867,8114975022,1195141497,4014269128,3186425168}'),
('SRID=4326;LINESTRING(30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456)', 'way', 103807114, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{1198357004,303515662,8566916345,1198356771,8566916346,1198356889,1198357009,8906857470}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529382 59.6847803,30.4528051 59.6851927,30.4527793 59.6852746,30.4527609 59.6853349,30.4527422 59.6853961,30.4527263 59.6854482,30.4527224 59.6854618)', 'way', 153761053, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068681,8114975050,8114975107,8895975844,8895975845,8895975847,4912270253,1664064412}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4532459 59.6852254,30.45322 59.6852491)', 'way', 153761054, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975105,3968068669}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4528762 59.6851274,30.4530118 59.6851874)', 'way', 153947121, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381541,1665582246}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4529574 59.6848702,30.4531238 59.6848204)', 'way', 153947122, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1738381532,1665582234}'),
('SRID=4326;LINESTRING(30.4533888 59.6848413,30.4535109 59.6849058,30.4534919 59.684967)', 'way', 153947123, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582235,1738381534,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533267 59.6852228,30.4533391 59.6851996,30.4533483 59.6851876,30.4533556 59.6851828,30.4533653 59.6851769,30.4533784 59.6851717,30.4533901 59.6851678,30.4534147 59.6851629,30.4534315 59.6851615,30.4534524 59.6850941)', 'way', 153947124, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975034,8899249793,8114975035,8902027910,8899249794,8902027909,8899249795,1738381544,8114975036,1665582244}'),
('SRID=4326;LINESTRING(30.4531795 59.685129,30.4533062 59.6850846,30.4534722 59.6850303,30.4534919 59.684967)', 'way', 153947125, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975075,1665582243,1738381539,1665582240}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4530483 59.6850678,30.4529356 59.6849912)', 'way', 153947126, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,1665582242,8902082170}'),
('SRID=4326;LINESTRING(30.4529356 59.6849912,30.4530873 59.6849398,30.453213 59.6848988)', 'way', 153947127, '{"highway": "footway", "surface": "fine_gravel"}', '{8902082170,1665582238,8904992643}'),
('SRID=4326;LINESTRING(30.4532598 59.6849025,30.4533508 59.6849575,30.4534722 59.6850303,30.4534524 59.6850941)', 'way', 153947128, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992648,1665582239,1738381539,1665582244}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4531238 59.6848204,30.4533888 59.6848413,30.4535282 59.6848524)', 'way', 153947130, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1665582234,1665582235,1665582236}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4530873 59.6849398,30.4532201 59.6849487,30.4533508 59.6849575,30.4534919 59.684967)', 'way', 153947131, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1665582238,8902082149,1665582239,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533062 59.6850846,30.4533306 59.6850189,30.4533508 59.6849575,30.4533888 59.6848413)', 'way', 153947132, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,1665582243,8902082150,1665582239,1665582235}'),
('SRID=4326;LINESTRING(30.4534524 59.6850941,30.4533062 59.6850846,30.4531801 59.6850762,30.4530483 59.6850678,30.452898 59.6850578)', 'way', 153947133, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582244,1665582243,8902082168,1665582242,1665582241}'),
('SRID=4326;LINESTRING(30.4532234 59.6850226,30.4533062 59.6850846,30.4534147 59.6851629)', 'way', 153947134, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975088,1665582243,1738381544}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4530483 59.6850678,30.4530675 59.6850048,30.4530873 59.6849398,30.4531238 59.6848204)', 'way', 153947135, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,1665582242,8902082151,1665582238,1665582234}'),
('SRID=4326;LINESTRING(30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858)', 'way', 312745383, '{"barrier": "fence"}', '{1439053672,4912270255,4438910482,8895996664,4438910480,3234125031,4438910477,8893386635,4438910475,8895996665,4438910473,8114975112,8114975111,1198357028}'),
('SRID=4326;LINESTRING(30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554)', 'way', 315626926, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053649,8895996432,8895996430,1439053648,1439053645,8895996431,1439053641,1439053639}'),
('SRID=4326;LINESTRING(30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577)', 'way', 317173782, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{1653641713,8114975028,8114975027,8566824024}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.4526304 59.6847065,30.4529536 59.6847313,30.453482 59.6847765,30.4535921 59.6847856,30.4535778 59.6848316,30.4534654 59.685163)', 'way', 393601662, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774427,8905543616,3968068681,7927774426,3968068674,8114975049,3968068687}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4530118 59.6851874,30.4532501 59.6852048,30.4532657 59.6852057)', 'way', 393601664, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1665582246,8899299159,1665582248}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4528762 59.6851274,30.4530483 59.6850678,30.4531752 59.6850205)', 'way', 393601667, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1738381541,1665582242,8114975100}'),
('SRID=4326;LINESTRING(30.452545 59.6854429,30.4525305 59.6854105,30.4525224 59.6853929,30.4525133 59.6853758,30.4525036 59.6853597,30.4524909 59.6853438,30.4524775 59.6853279,30.4524583 59.6853083,30.4524437 59.6852938,30.4524165 59.6852717,30.4523957 59.6852568,30.452375 59.6852427,30.4523461 59.6852243,30.4523179 59.6852068)', 'way', 393620818, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975116,8895996660,8895996640,4438927787,8895996641,8895996659,8895996642,4438927782,8114975115,8895996661,8895996639,4438927777,8895996638,8114975114}'),
('SRID=4326;LINESTRING(30.45322 59.6852491,30.4530263 59.6852336,30.4529402 59.6852275,30.4528645 59.6852217)', 'way', 393620820, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068669,8895975857,8895975877,8895975841}'),
('SRID=4326;LINESTRING(30.4527686 59.6854977,30.4528746 59.6855048)', 'way', 446650486, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053671,1439053674}'),
('SRID=4326;LINESTRING(30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905)', 'way', 446650506, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053619,8914843795,8895996424,8914843796,1439053616,8914843797,8895996423,8914843798,1439053613,8914843799,8895996422,8895996441,8914843802,8895996421,8914843801,1439053611,8914843800,8895996420,1439053614}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522278 59.6851794)', 'way', 446651403, '{"barrier": "fence"}', '{1198357028,1653641713}'),
('SRID=4326;LINESTRING(30.4524943 59.6854502,30.452545 59.6854429,30.4525879 59.6854383,30.4527263 59.6854482,30.4528729 59.6854587)', 'way', 500077282, '{"highway": "footway", "surface": "fine_gravel"}', '{4912270255,8114975116,4438928092,4912270253,4438928093}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522167 59.6853009)', 'way', 758868053, '{"highway": "footway"}', '{1198357028,1406921754}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529562 59.6847243)', 'way', 849729200, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068681,8905543615}'),
('SRID=4326;LINESTRING(30.453482 59.6847765,30.4534851 59.684767)', 'way', 849729201, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774426,8905543614}'),
('SRID=4326;LINESTRING(30.452599 59.6846895,30.4525675 59.6846756,30.45256 59.6846723,30.452568 59.6846486,30.4535014 59.6847265,30.4534976 59.6847368)', 'way', 849729202, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068677,12023732269,8566916344,8566916343,8566916342,7927774425}'),
('SRID=4326;LINESTRING(30.4528543 59.6851747,30.4529071 59.6850026,30.4529249 59.685004,30.4529333 59.6849769,30.452917 59.6849756,30.4529721 59.6847963)', 'way', 871154683, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8114975041,8899249805,8899249804,8899249803,8899249802,8114975042}'),
('SRID=4326;LINESTRING(30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274,30.4526587 59.6847165)', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8114975046,8114975047,8906857474,8906857473,8114975046}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4531264 59.6851489)', 'way', 871154687, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,8114975076}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257)', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,8114975073,8114975074,8114975057,8114975058,8114975059,8114975075,8114975060,8114975061,8114975067,8114975068,8114975069,8114975077,8114975070,8114975062,8114975063,8114975064,8114975076,8114975065,8114975066,8114975071,8114975072,8114975078}'),
('SRID=4326;LINESTRING(30.4532501 59.6852048,30.4531713 59.6851525)', 'way', 871154689, '{"highway": "footway", "surface": "fine_gravel"}', '{8899299159,8114975077}'),
('SRID=4326;LINESTRING(30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998)', 'way', 871154691, '{"highway": "footway"}', '{8114975097,8114975079,8114975080,8114975081,8114975082,8114975083,8114975099,8114975084,8114975085,8114975086,8114975087,8114975088,8114975089,8114975090,8114975091,8114975092,8114975100,8114975093,8114975094,8114975095,8114975096,8114975097}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4529574 59.6848702,30.4530873 59.6849398,30.4531787 59.684998)', 'way', 871154694, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1738381532,1665582238,8114975097}'),
('SRID=4326;LINESTRING(30.4532281 59.6850005,30.4533508 59.6849575,30.4535109 59.6849058,30.4535282 59.6848524)', 'way', 871154695, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975099,1665582239,1738381534,1665582236}'),
('SRID=4326;LINESTRING(30.4532459 59.6852254,30.4528051 59.6851927,30.4522785 59.6851511)', 'way', 871154698, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8114975105,8114975107,8114975109}'),
('SRID=4326;LINESTRING(30.4526095 59.6853751,30.4526201 59.6853832,30.4527025 59.6853899,30.4527175 59.6853841,30.4527302 59.6853414,30.4527195 59.685334,30.4526348 59.6853281,30.4526225 59.6853328,30.4526095 59.6853751)', 'way', 871154699, '{"landuse": "flowerbed"}', '{8114975123,8114975124,8114975125,8895996607,8895996606,8114975126,8114975127,8114975181,8114975123}'),
('SRID=4326;LINESTRING(30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686)', 'way', 871154701, '{"landuse": "flowerbed"}', '{8114975136,8114975137,8114975138,8114975139,8114975140,8114975141,8114975142,8114975143,8114975136}'),
('SRID=4326;LINESTRING(30.4525419 59.6853075,30.4525505 59.6853142,30.4526031 59.6853185,30.4526157 59.6853129,30.4526268 59.6852724,30.4526177 59.6852659,30.4525671 59.6852621,30.452555 59.6852672,30.4525419 59.6853075)', 'way', 871154702, '{"landuse": "flowerbed"}', '{8114975144,8114975145,8114975146,8114975147,8114975148,8114975149,8114975150,8114975151,8114975144}'),
('SRID=4326;LINESTRING(30.4526478 59.6852554,30.4526557 59.6852612,30.452739 59.6852678,30.4527533 59.685262,30.452765 59.685222,30.4527443 59.68522,30.4527459 59.685216,30.452673 59.6852102,30.4526587 59.6852148,30.4526478 59.6852554)', 'way', 871154706, '{"landuse": "flowerbed"}', '{8114975172,8114975173,8114975174,8114975175,8114975176,8114975177,8114975178,8114975179,8114975180,8114975172}'),
('SRID=4326;LINESTRING(30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)', 'way', 872998899, '{"landuse": "flowerbed"}', '{8129422266,8129422267,8129422268,8129422269,8129422270,8129422271,8129422272,8895996472,8129422273,8895996471,8129422266}'),
('SRID=4326;LINESTRING(30.4536402 59.684764,30.4536193 59.6847624,30.4536067 59.6847614)', 'way', 891865282, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{1635198216,1198356775,8289295975}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232)', 'way', 922841960, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824024,1653641402,8566824025,8566824026}'),
('SRID=4326;LINESTRING(30.453531 59.6847593,30.4531199 59.6847256)', 'way', 922854851, '{"height": "8", "natural": "tree_row", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{5002059748,5002059751}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.452599 59.6846895)', 'way', 922854852, '{"highway": "steps"}', '{7927774427,3968068677}'),
('SRID=4326;LINESTRING(30.4536067 59.6847614,30.4535894 59.6847601)', 'way', 922854853, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{8289295975,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4526552 59.6847274,30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274)))', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398)))', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102)))', 'way', 871154691, '{"highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526095 59.6853751,30.4526225 59.6853328,30.4526348 59.6853281,30.4527195 59.685334,30.4527302 59.6853414,30.4527175 59.6853841,30.4527025 59.6853899,30.4526201 59.6853832,30.4526095 59.6853751)))', 'way', 871154699, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139)))', 'way', 871154701, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525419 59.6853075,30.452555 59.6852672,30.4525671 59.6852621,30.4526177 59.6852659,30.4526268 59.6852724,30.4526157 59.6853129,30.4526031 59.6853185,30.4525505 59.6853142,30.4525419 59.6853075)))', 'way', 871154702, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526478 59.6852554,30.4526587 59.6852148,30.452673 59.6852102,30.4527459 59.685216,30.4527443 59.68522,30.452765 59.685222,30.4527533 59.685262,30.452739 59.6852678,30.4526557 59.6852612,30.4526478 59.6852554)))', 'way', 871154706, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)))', 'way', 872998899, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;LINESTRING(30.4521596 59.6854203,30.4524943 59.6854502)', 'way', 961421780, '{"highway": "footway", "surface": "fine_gravel"}', '{8893386627,4912270255}'),
('SRID=4326;LINESTRING(30.4533818 59.6852214,30.4533763 59.68521)', 'way', 961717566, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053598,1439053596}'),
('SRID=4326;LINESTRING(30.4534979 59.6851951,30.4535038 59.6852069)', 'way', 961717567, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053589,1439053591}'),
('SRID=4326;LINESTRING(30.4533763 59.68521,30.4534979 59.6851951)', 'way', 961717568, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053596,1439053589}'),
('SRID=4326;LINESTRING(30.4527378 59.6852117,30.4526559 59.6852052,30.4525684 59.6851982,30.4524641 59.6851898,30.4522584 59.6851734)', 'way', 961717569, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975842,8895975876,8895975873,8895975858,3968068679}'),
('SRID=4326;LINESTRING(30.4530032 59.685292,30.453022 59.6852839,30.4530407 59.6852758,30.4530635 59.68527,30.4530877 59.685267,30.4531091 59.6852663,30.4531333 59.6852683,30.4531547 59.6852744,30.45322 59.6852491)', 'way', 961717570, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975875,8895975856,8895975855,8895975850,8895975854,8895975853,8895975852,8895975851,3968068669}'),
('SRID=4326;LINESTRING(30.4524419 59.6852441,30.452456 59.6851977,30.4524483 59.6851915,30.4523702 59.6851856,30.4523568 59.6851898,30.4523826 59.6852055,30.4524088 59.6852218,30.4524248 59.6852328,30.4524419 59.6852441)', 'way', 961717571, '{"landuse": "flowerbed"}', '{8895975865,8895975864,8895975863,8895975862,8895975859,8895975861,8895975860,8895975838,8895975865}'),
('SRID=4326;LINESTRING(30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946)', 'way', 961717572, '{"landuse": "flowerbed"}', '{8895975872,8895975871,8895975870,8895975869,8895975868,8895975867,8895975866,8895975872}'),
('SRID=4326;LINESTRING(30.4530263 59.6852336,30.4530032 59.685292,30.4529231 59.6852858,30.4527793 59.6852746,30.452638 59.6852636,30.4525513 59.6852568,30.4524466 59.6852487,30.4524641 59.6851898)', 'way', 961717573, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975857,8895975875,8895975843,8895975844,8895975848,8895975846,8895975874,8895975858}'),
('SRID=4326;LINESTRING(30.4529402 59.6852275,30.4529231 59.6852858,30.4529053 59.6853463,30.4528865 59.6854078)', 'way', 961717574, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975877,8895975843,8895975880,8895975878}'),
('SRID=4326;LINESTRING(30.4526559 59.6852052,30.452638 59.6852636,30.4526195 59.6853238,30.4526009 59.6853847,30.4527422 59.6853961,30.4528865 59.6854078)', 'way', 961717575, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975876,8895975848,8895975849,8895975879,8895975847,8895975878}'),
('SRID=4326;LINESTRING(30.4525684 59.6851982,30.4525513 59.6852568,30.4525338 59.685317,30.4526195 59.6853238,30.4527609 59.6853349,30.4529053 59.6853463)', 'way', 961717576, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975873,8895975846,8895975881,8895975849,8895975845,8895975880}'),
('SRID=4326;LINESTRING(30.4527487 59.6852082,30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082)', 'way', 961717577, '{"landuse": "flowerbed"}', '{8895975885,8895975884,8895975883,8895975882,8895975885}'),
('SRID=4326;LINESTRING(30.4532064 59.6852443,30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443)', 'way', 961717578, '{"landuse": "flowerbed"}', '{8895975889,8895975888,8895975887,8895975886,8895975889}'),
('SRID=4326;LINESTRING(30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696)', 'way', 961717579, '{"landuse": "flowerbed"}', '{8895975901,8895975902,8895975900,8895975903,8895975891,8895975890,8895975901}'),
('SRID=4326;LINESTRING(30.4530554 59.6852658,30.4530414 59.6852392,30.453028 59.6852429,30.4530143 59.6852802,30.4530288 59.6852733,30.453041 59.6852693,30.4530554 59.6852658)', 'way', 961717580, '{"landuse": "flowerbed"}', '{8895975898,8895975895,8895975896,8895975907,8895975897,8895975906,8895975898}'),
('SRID=4326;LINESTRING(30.4530632 59.6852641,30.4530782 59.6852621,30.4530921 59.6852616,30.4531031 59.6852618,30.4531172 59.6852446,30.4530501 59.6852392,30.4530632 59.6852641)', 'way', 961717581, '{"landuse": "flowerbed"}', '{8895975905,8895975899,8895975904,8895975892,8895975893,8895975894,8895975905}'),
('SRID=4326;LINESTRING(30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204)', 'way', 961717582, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053627,8914843793,8895996425,8914843794,1439053619}'),
('SRID=4326;LINESTRING(30.4525812 59.6854845,30.4526564 59.6854895)', 'way', 961717593, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{8895996555,1439053669}'),
('SRID=4326;LINESTRING(30.4527747 59.6854387,30.4528506 59.685445,30.4528681 59.6854402,30.4528755 59.6854172,30.4528654 59.6854091,30.4527852 59.6854026,30.4527687 59.6854078,30.4527618 59.6854305,30.4527747 59.6854387)', 'way', 961717594, '{"landuse": "flowerbed"}', '{8895996465,8895996464,8895996463,8895996462,8895996461,8895996460,8895996459,8895996458,8895996465}'),
('SRID=4326;LINESTRING(30.4525201 59.6853123,30.4525328 59.6853069,30.4525442 59.6852666,30.4525351 59.6852597,30.4524557 59.6852538,30.4524775 59.6852724,30.4524969 59.6852906,30.4525201 59.6853123)', 'way', 961717595, '{"landuse": "flowerbed"}', '{8895996470,8895996469,8895996468,8895996467,8895996466,8895996428,8895996429,8895996470}'),
('SRID=4326;LINESTRING(30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969,30.4523418 59.6851889)', 'way', 961717596, '{"landuse": "grass"}', '{8895996495,8895975839,8895996483,8895996484,8895996485,8895996486,8895996487,8895996488,8895996489,8895996490,8895996491,8895996492,8895996493,8895996494,8895996496,8895996473,8895996479,8895996480,8895996474,8895996509,8895996508,8895996507,8895996506,8895996505,8895996504,8895996503,8895996502,8895996501,8895996500,8895996499,8895996498,8895996497,8895996478,8895996495}'),
('SRID=4326;LINESTRING(30.4523081 59.6852118,30.4522803 59.6851945,30.4522795 59.6852157,30.4523143 59.6852356,30.4523427 59.6852536,30.4523628 59.6852673,30.4523827 59.6852816,30.4524087 59.6853027,30.4524225 59.6853163,30.4524411 59.6853354,30.452454 59.6853507,30.452466 59.6853657,30.4524751 59.6853808,30.4524839 59.6853973,30.4524918 59.6854125,30.4524982 59.6854272,30.452501 59.6854325,30.4525097 59.6854362,30.4525224 59.6854348,30.4525257 59.6854303,30.4525231 59.6854242,30.4525171 59.6854097,30.4525091 59.6853943,30.4525002 59.6853776,30.4524909 59.685362,30.4524785 59.6853465,30.4524653 59.6853309,30.4524465 59.6853116,30.4524322 59.6852976,30.4524056 59.685276,30.4523853 59.6852614,30.4523649 59.6852475,30.4523362 59.6852293,30.4523081 59.6852118)', 'way', 961717597, '{"landuse": "grass"}', '{8895996522,8895996477,8895996536,8895996524,8895996525,8895996526,8895996527,8895996528,8895996529,8895996530,8895996531,8895996532,8895996533,8895996534,8895996535,8895996537,8895996482,8895996476,8895996481,8895996523,8895996475,8895996521,8895996520,8895996519,8895996518,8895996517,8895996516,8895996515,8895996514,8895996513,8895996512,8895996511,8895996510,8895996522}'),
('SRID=4326;LINESTRING(30.4526076 59.685425,30.4526842 59.6854313,30.4527032 59.6854269,30.4527112 59.6854034,30.4527003 59.6853955,30.4526196 59.6853891,30.4526042 59.6853942,30.4525975 59.6854176,30.4526076 59.685425)', 'way', 961717598, '{"landuse": "flowerbed"}', '{8895996545,8895996544,8895996543,8895996542,8895996541,8895996540,8895996539,8895996538,8895996545}'),
('SRID=4326;LINESTRING(30.4528639 59.685494,30.4528702 59.6854731,30.4527911 59.6854671,30.4527849 59.685488,30.4528639 59.685494)', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996549,8895996548,8895996547,8895996546,8895996549}'),
('SRID=4326;LINESTRING(30.4526433 59.6854773,30.4526495 59.6854564,30.4525705 59.6854504,30.4525642 59.6854713,30.4526433 59.6854773)', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996553,8895996552,8895996551,8895996550,8895996553}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528709 59.6855164)', 'way', 961717601, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,8895996554}'),
('SRID=4326;LINESTRING(30.4529138 59.6853368,30.4529235 59.6853445,30.4529678 59.6853472,30.4529853 59.6853413,30.4529963 59.6853005,30.4529866 59.6852936,30.4529427 59.6852903,30.4529263 59.6852951,30.4529138 59.6853368)', 'way', 961717602, '{"landuse": "flowerbed"}', '{8895996564,8895996563,8895996562,8895996561,8895996560,8895996559,8895996558,8895996557,8895996564}'),
('SRID=4326;LINESTRING(30.452933 59.6852753,30.4529441 59.6852838,30.4529886 59.6852873,30.453002 59.6852821,30.4530171 59.6852433,30.4530088 59.6852371,30.4529582 59.685233,30.4529444 59.6852374,30.452933 59.6852753)', 'way', 961717603, '{"landuse": "flowerbed"}', '{8895996572,8895996571,8895996570,8895996569,8895996568,8895996567,8895996566,8895996565,8895996572}'),
('SRID=4326;LINESTRING(30.4525595 59.6852465,30.4525692 59.6852544,30.4526207 59.6852585,30.4526333 59.6852538,30.452645 59.6852146,30.4526353 59.6852076,30.4525847 59.6852036,30.4525709 59.685208,30.4525595 59.6852465)', 'way', 961717604, '{"landuse": "flowerbed"}', '{8895996580,8895996579,8895996578,8895996577,8895996576,8895996575,8895996574,8895996573,8895996580}'),
('SRID=4326;LINESTRING(30.452817 59.6852667,30.4528288 59.6852748,30.4529066 59.6852809,30.45292 59.6852751,30.4529319 59.6852358,30.4529216 59.6852291,30.452851 59.685224,30.4528493 59.6852281,30.452831 59.6852267,30.452817 59.6852667)', 'way', 961717605, '{"landuse": "flowerbed"}', '{8895996589,8895996588,8895996587,8895996586,8895996585,8895996584,8895996581,8895996583,8895996582,8895996589}'),
('SRID=4326;LINESTRING(30.4527946 59.6853272,30.4528053 59.6853349,30.4528878 59.6853416,30.4529031 59.6853359,30.4529154 59.6852941,30.4529042 59.6852874,30.4528247 59.6852816,30.4528087 59.6852864,30.4527946 59.6853272)', 'way', 961717606, '{"landuse": "flowerbed"}', '{8895996597,8895996596,8895996595,8895996594,8895996593,8895996592,8895996591,8895996590,8895996597}'),
('SRID=4326;LINESTRING(30.4527745 59.6853889,30.4527865 59.6853969,30.4528677 59.6854032,30.4528839 59.6853982,30.4528953 59.6853552,30.4528845 59.6853477,30.4528052 59.6853419,30.4527899 59.6853454,30.4527745 59.6853889)', 'way', 961717607, '{"landuse": "flowerbed"}', '{8895996605,8895996604,8895996603,8895996602,8895996601,8895996600,8895996599,8895996598,8895996605}'),
('SRID=4326;LINESTRING(30.452565 59.6854206,30.4525598 59.6854071,30.4525516 59.6853892,30.4525422 59.6853716,30.4525319 59.6853544,30.4525184 59.6853376,30.4525045 59.6853211,30.4524848 59.6853009,30.4524693 59.6852857,30.4524408 59.6852624,30.4524192 59.685247,30.4523979 59.6852324,30.4523685 59.6852137,30.4523402 59.6851962)', 'way', 961717608, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996623,8895996621,8895996620,8895996619,8895996618,8895996617,8895996616,8895996615,8895996614,8895996613,8895996612,8895996611,8895996610,8895996622}'),
('SRID=4326;LINESTRING(30.4525109 59.6854262,30.4525044 59.6854114,30.4524965 59.6853961,30.4524877 59.6853796,30.4524784 59.6853642,30.4524662 59.6853489,30.4524532 59.6853335,30.4524345 59.6853143,30.4524204 59.6853005,30.4523942 59.6852791,30.452374 59.6852647,30.4523538 59.6852509,30.4523252 59.6852327,30.4522972 59.6852153)', 'way', 961717609, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996637,8895996635,8895996634,8895996633,8895996632,8895996631,8895996630,8895996629,8895996628,8895996627,8895996626,8895996625,8895996624,8895996636}'),
('SRID=4326;LINESTRING(30.4523179 59.6852068,30.4522881 59.6851891,30.4522584 59.6851734,30.4522785 59.6851511,30.4525958 59.6847532,30.4529382 59.6847803,30.4535778 59.6848316)', 'way', 961717610, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975114,8895996608,3968068679,8114975109,8114975051,8114975050,8114975049}'),
('SRID=4326;LINESTRING(30.4527224 59.6854618,30.4527166 59.6854798)', 'way', 961717612, '{"highway": "steps", "incline": "up", "surface": "paving_stones"}', '{1664064412,8895996662}'),
('SRID=4326;LINESTRING(30.4534116 59.6851536,30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536)', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249763,8899249762,8899249761,8899249760,8899249759,8899249763}'),
('SRID=4326;LINESTRING(30.4535137 59.6851734,30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437)', 'way', 962062988, '{"source:taxon": "board"}', '{8899249777,8899249776,8899249775,8899249774}'),
('SRID=4326;LINESTRING(30.4534505 59.6851512,30.4535484 59.6848425)', 'way', 962062989, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.5", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8899249781,8899249780}'),
('SRID=4326;LINESTRING(30.4532761 59.6852013,30.4533137 59.6852128,30.453319 59.6851999,30.4533257 59.6851898,30.4533338 59.6851796,30.4533458 59.6851715,30.4533606 59.6851647,30.453378 59.6851586,30.4533941 59.6851559,30.4533211 59.6851024,30.4533083 59.6851038,30.4532761 59.6852013)', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249792,8899249791,8899249790,8899249789,8899249788,8899249787,8899249786,8899249785,8899249784,8899249783,8899249782,8899249792}'),
('SRID=4326;LINESTRING(30.4534315 59.6851615,30.4534654 59.685163)', 'way', 962062991, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975036,3968068687}'),
('SRID=4326;LINESTRING(30.45277 59.6851675,30.4528221 59.6849965,30.4528061 59.6849952,30.4528148 59.6849678,30.4528309 59.6849691,30.4528877 59.684789)', 'way', 962062992, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8899249807,8899249801,8899249800,8899249799,8899249798,8899249806}'),
('SRID=4326;LINESTRING(30.4530825 59.6850727,30.4530768 59.6850789,30.4531357 59.6851196,30.4531475 59.6851179,30.4531599 59.6851179,30.4531731 59.6851201,30.4531813 59.685123,30.4532721 59.6850914,30.45327 59.6850856,30.4530825 59.6850727)', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249816,8899249815,8899249814,8899249813,8899249812,8899249811,8899249810,8899249809,8899249808,8899249816}'),
('SRID=4326;LINESTRING(30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148)', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299126,8899299125,8899299124,8899299123,8899299122,8899299121,8899299120,8899299119,8899299118,8899299117,8899299126}'),
('SRID=4326;LINESTRING(30.4531566 59.6851458,30.4531627 59.6851441,30.4531665 59.6851411,30.4531672 59.6851376,30.4531645 59.6851343,30.4531591 59.685132,30.4531523 59.6851313,30.4531455 59.6851322,30.4531404 59.6851346,30.4531381 59.685138,30.4531391 59.6851415,30.4531433 59.6851444,30.4531496 59.6851459,30.4531566 59.6851458)', 'way', 962062995, '{"landuse": "grass"}', '{8899299139,8899299138,8899299137,8899299136,8899299135,8899299134,8899299133,8899299132,8899299131,8899299130,8899299129,8899299128,8899299140,8899299139}'),
('SRID=4326;LINESTRING(30.4531836 59.6851532,30.45325 59.6851972,30.4532587 59.6851977,30.4532923 59.6851023,30.4532804 59.6850981,30.4531914 59.68513,30.4531946 59.6851353,30.453195 59.6851401,30.4531936 59.6851444,30.45319 59.6851488,30.4531836 59.6851532)', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299150,8899299149,8899299141,8899299148,8899299142,8899299147,8899299146,8899299145,8899299144,8899299143,8899299150}'),
('SRID=4326;LINESTRING(30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299158,8899299157,8899299156,8899299155,8899299154,8899299153,8899299152,8899299151,8899249778,8899299158}'),
('SRID=4326;LINESTRING(30.4532162 59.6852145,30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145)', 'way', 962062998, '{"landuse": "grass"}', '{8899299165,8899299164,8899299163,8899299161,8899299160,8899299162,8899299165}'),
('SRID=4326;LINESTRING(30.4532627 59.6852077,30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077)', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', '{8902082028,8902082027,8902082026,8902082025,8902082024,8902082023,8902082022,8902082021,8902082020,8902027911,8902082019,8902082018,8902082017,8902027912,8902027916,8902027913,8902027915,8902027914,8902082028}'),
('SRID=4326;LINESTRING(30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082032,8902082031,8902082030,8902082029,8902082032}'),
('SRID=4326;LINESTRING(30.4529465 59.6849826,30.4530583 59.6849454,30.4530566 59.6849397,30.4529452 59.6849315,30.4529338 59.6849691,30.4529492 59.6849698,30.4529465 59.6849826)', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082038,8902082037,8902082036,8902082035,8902082034,8902082033,8902082038}'),
('SRID=4326;LINESTRING(30.4530344 59.685052,30.4530456 59.6850508,30.4530757 59.684955,30.4530662 59.6849507,30.4529465 59.6849918,30.4530344 59.685052)', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082047,8902082046,8902082045,8902082044,8902082043,8902082047}'),
('SRID=4326;LINESTRING(30.4529083 59.6850544,30.4530153 59.6850613,30.4530221 59.685056,30.4529398 59.6850009,30.4529378 59.6850121,30.4529184 59.6850114,30.4529083 59.6850544)', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082054,8902082053,8902082052,8902082051,8902082050,8902082049,8902082054}'),
('SRID=4326;LINESTRING(30.4528875 59.6851184,30.4530138 59.6850731,30.4530125 59.6850679,30.4529043 59.6850625,30.4528875 59.6851184)', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082059,8902082058,8902082057,8902082056,8902082059}'),
('SRID=4326;LINESTRING(30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789)', 'way', 962382766, '{"landuse": "grass"}', '{8902082065,8902082064,8902082063,8902082062,8902082065}'),
('SRID=4326;LINESTRING(30.4529896 59.6851748,30.4530072 59.6851719,30.4530311 59.6850841,30.4530206 59.6850798,30.4528885 59.6851275,30.4529896 59.6851748)', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082070,8902082069,8902082068,8902082067,8902082066,8902082070}'),
('SRID=4326;LINESTRING(30.4533332 59.6850719,30.4534612 59.68503,30.4533655 59.6849715,30.4533546 59.6849733,30.4533227 59.6850682,30.4533332 59.6850719)', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082080,8902082079,8902082078,8902082077,8902082076,8902082080}'),
('SRID=4326;LINESTRING(30.4533437 59.685083,30.4534444 59.6850899,30.4534619 59.6850382,30.4533411 59.685078,30.4533437 59.685083)', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082084,8902082083,8902082082,8902082081,8902082084}'),
('SRID=4326;LINESTRING(30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173)', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082090,8902082089,8902082088,8902082087,8902082086,8902082085,8902082090}'),
('SRID=4326;LINESTRING(30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113)', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082096,8902082095,8902082094,8902082093,8902082092,8902082091,8902082096}'),
('SRID=4326;LINESTRING(30.4532258 59.6849527,30.4532116 59.6849902,30.4532207 59.684992,30.4532298 59.6849953,30.4533219 59.6849634,30.4533191 59.6849588,30.4532258 59.6849527)', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082102,8902082101,8902082100,8902082099,8902082098,8902082097,8902082102}'),
('SRID=4326;LINESTRING(30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082108,8902082107,8902082106,8902082105,8902082104,8902082103,8902082108}'),
('SRID=4326;LINESTRING(30.4530763 59.6850024,30.4531619 59.6850065,30.4531647 59.6850018,30.4531695 59.6849976,30.4531032 59.6849548,30.453091 59.6849565,30.4530763 59.6850024)', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082109,8902082114,8902082113,8902082112,8902082111,8902082110,8902082109}'),
('SRID=4326;LINESTRING(30.4530716 59.6850547,30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547)', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082120,8902082119,8902082118,8902082117,8902082116,8902082115,8902082120}'),
('SRID=4326;LINESTRING(30.4531735 59.6850722,30.4531863 59.6850287,30.4531799 59.6850271,30.4531749 59.6850252,30.4530791 59.6850599,30.453083 59.685065,30.4531735 59.6850722)', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082126,8902082125,8902082124,8902082123,8902082122,8902082121,8902082126}'),
('SRID=4326;LINESTRING(30.4531903 59.6850727,30.4532727 59.6850781,30.4532816 59.6850715,30.4532223 59.6850274,30.453211 59.6850297,30.453201 59.6850303,30.4531903 59.6850727)', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082132,8902082131,8902082130,8902082129,8902082128,8902082127,8902082132}'),
('SRID=4326;LINESTRING(30.453206 59.6849937,30.4532201 59.6849487)', 'way', 962382778, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975081,8902082149}'),
('SRID=4326;LINESTRING(30.4532335 59.6850137,30.4533306 59.6850189)', 'way', 962382779, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975086,8902082150}'),
('SRID=4326;LINESTRING(30.4531682 59.6850102,30.4530675 59.6850048)', 'way', 962382780, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975094,8902082151}'),
('SRID=4326;LINESTRING(30.4531253 59.6850083,30.4531256 59.6850158,30.4531288 59.6850232,30.4531349 59.6850302,30.4531434 59.6850364,30.4531543 59.6850416,30.4531669 59.6850457,30.4531809 59.6850485,30.4531957 59.6850498,30.4532107 59.6850496,30.4532253 59.685048,30.4532391 59.685045,30.4532514 59.6850406,30.4532618 59.6850352,30.4532699 59.6850288,30.4532753 59.6850217,30.4532779 59.6850143,30.4532776 59.6850067,30.4532744 59.6849993,30.4532684 59.6849924,30.4532598 59.6849862,30.453249 59.6849809,30.4532363 59.6849768,30.4532224 59.6849741,30.4532076 59.6849728,30.4531926 59.6849729,30.4531779 59.6849745,30.4531642 59.6849776,30.4531519 59.6849819,30.4531415 59.6849874,30.4531334 59.6849938,30.4531279 59.6850008,30.4531253 59.6850083)', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082167,8902082134,8902082166,8902082133,8902082165,8902082148,8902082164,8902082147,8902082163,8902082146,8902082162,8902082145,8902082161,8902082144,8902082160,8902082143,8902082159,8902082142,8902082158,8902082141,8902082157,8902082140,8902082156,8902082139,8902082155,8902082138,8902082154,8902082137,8902082153,8902082136,8902082152,8902082135,8902082167}'),
('SRID=4326;LINESTRING(30.4531956 59.6850267,30.4531801 59.6850762)', 'way', 962382782, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975091,8902082168}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4529124 59.6850066,30.4529307 59.6850078,30.4529356 59.6849912,30.4529412 59.6849735,30.4529245 59.6849722,30.4529389 59.6849276)', 'way', 962382783, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381535,8902082040,8902082170,8902082039,8902082169,1665582237}'),
('SRID=4326;LINESTRING(30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877)', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992660,8904992659,8904992658,8904992657,8904992656,8904992655,8904992654,8904992653,8904992652,8904992651,8904992650,8904992649,8904992648,8904992647,8904992646,8904992645,8904992644,8904992643,8904992642,8904992641,8904992640,8904992639,8904992660}'),
('SRID=4326;LINESTRING(30.4532432 59.6848971,30.4532493 59.6848954,30.4532531 59.6848924,30.4532538 59.6848889,30.4532511 59.6848856,30.4532457 59.6848833,30.4532389 59.6848826,30.4532321 59.6848835,30.453227 59.684886,30.4532247 59.6848893,30.4532257 59.6848928,30.4532299 59.6848957,30.4532362 59.6848972,30.4532432 59.6848971)', 'way', 962678726, '{"landuse": "grass"}', '{8904992673,8904992672,8904992671,8904992670,8904992669,8904992668,8904992667,8904992666,8904992665,8904992664,8904992663,8904992662,8904992661,8904992673}'),
('SRID=4326;LINESTRING(30.4530998 59.6849248,30.4531105 59.684928,30.4532056 59.6848974,30.4532029 59.6848932,30.4532023 59.6848877,30.4532043 59.6848829,30.4532098 59.6848776,30.4531384 59.6848341,30.4531253 59.6848349,30.4530998 59.6849248)', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992682,8904992681,8904992680,8904992679,8904992637,8904992678,8904992677,8904992676,8904992675,8904992682}'),
('SRID=4326;LINESTRING(30.4530724 59.6849262,30.4530868 59.6849239,30.4531127 59.6848333,30.4531034 59.6848301,30.4529683 59.6848711,30.4530724 59.6849262)', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992687,8904992686,8904992685,8904992684,8904992683,8904992687}'),
('SRID=4326;LINESTRING(30.4530589 59.6849341,30.4530633 59.6849302,30.452961 59.6848772,30.4529482 59.6849246,30.4530589 59.6849341)', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992691,8904992690,8904992689,8904992688,8904992691}'),
('SRID=4326;LINESTRING(30.4531212 59.684939,30.4533222 59.6849516,30.4533269 59.6849477,30.4532581 59.6849071,30.4532455 59.6849087,30.4532339 59.6849085,30.4532243 59.684907,30.4532133 59.6849034,30.4531185 59.6849335,30.4531212 59.684939)', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992699,8904992698,8904992697,8904992696,8904992692,8904992638,8904992695,8904992694,8904992693,8904992699}'),
('SRID=4326;LINESTRING(30.453536 59.6848401,30.4529797 59.6847958,30.452977 59.6848046,30.4535329 59.6848493,30.453536 59.6848401)', 'way', 962714214, '{"landuse": "flowerbed"}', '{8905335420,8905335419,8905335418,8905335417,8905335420}'),
('SRID=4326;LINESTRING(30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335435,8905335434,8905335433,8905335432,8905335435}'),
('SRID=4326;LINESTRING(30.4533819 59.6849565,30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565)', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335439,8905335438,8905335437,8905335436,8905335439}'),
('SRID=4326;LINESTRING(30.4533623 59.6849431,30.4533739 59.6849464,30.4534994 59.6849065,30.4534038 59.6848537,30.4533921 59.6848545,30.4533623 59.6849431)', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335444,8905335443,8905335442,8905335441,8905335440,8905335444}'),
('SRID=4326;LINESTRING(30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335454,8905335453,8905335452,8905335451,8905335450,8905335449,8905335448,8905335447,8905335446,8905335454}'),
('SRID=4326;LINESTRING(30.4529663 59.6848632,30.4530962 59.6848253,30.4530928 59.6848201,30.4529831 59.6848107,30.4529663 59.6848632)', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335458,8905335457,8905335456,8905335455,8905335458}'),
('SRID=4326;LINESTRING(30.4532195 59.6848732,30.4532263 59.6848712,30.4532379 59.6848698,30.4532504 59.6848704,30.4532619 59.6848729,30.4532706 59.684876,30.4533642 59.6848467,30.4533614 59.6848416,30.453158 59.6848262,30.4531503 59.6848308,30.4532195 59.6848732)', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335467,8905335466,8905335465,8905335464,8905335463,8905335462,8905335461,8905335445,8905335460,8905335459,8905335467}'),
('SRID=4326;LINESTRING(30.4532684 59.6848807,30.4533888 59.6848413)', 'way', 962714221, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992654,1665582235}'),
('SRID=4326;LINESTRING(30.4531238 59.6848204,30.4532177 59.684877)', 'way', 962714222, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582234,8904992660}'),
('SRID=4326;LINESTRING(30.4527677 59.6846399,30.4528579 59.6846477)', 'way', 962735606, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8905543613,1198356896}'),
('SRID=4326;LINESTRING(30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399)', 'way', 962735608, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824026,1198356935,8566824027,8905543613}'),
('SRID=4326;LINESTRING(30.4534851 59.684767,30.4534913 59.6847521,30.4534976 59.6847368)', 'way', 962735609, '{"highway": "steps"}', '{8905543614,12023732271,7927774425}'),
('SRID=4326;LINESTRING(30.4529562 59.6847243,30.4529615 59.6847082,30.4529628 59.6847041)', 'way', 962735610, '{"highway": "steps"}', '{8905543615,12023732270,3968068678}'),
('SRID=4326;LINESTRING(30.4526304 59.6847065,30.4525958 59.6847532)', 'way', 962735611, '{"highway": "footway", "surface": "fine_gravel"}', '{8905543616,8114975051}'),
('SRID=4326;LINESTRING(30.4528676 59.6847547,30.4526341 59.6847357,30.452631 59.6847454,30.4528645 59.6847644,30.4528676 59.6847547)', 'way', 962735612, '{"landuse": "grass"}', '{8905558220,8905558219,8905558218,8905558217,8905558220}'),
('SRID=4326;LINESTRING(30.4535589 59.6848104,30.4530176 59.6847681,30.4530149 59.6847769,30.4535559 59.6848195,30.4535589 59.6848104)', 'way', 962735613, '{"landuse": "grass"}', '{8905558224,8905558223,8905558222,8905558221,8905558224}'),
('SRID=4326;LINESTRING(30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573,30.4530182 59.6847465)', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8905558227,8905558226,8906857476,8906857475,8905558227}'),
('SRID=4326;LINESTRING(30.4523152 59.6851448,30.4526116 59.6847664)', 'way', 962869359, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.7", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857452,8906857451}'),
('SRID=4326;LINESTRING(30.4526277 59.6846803,30.4526365 59.6846782,30.4526406 59.6846738,30.4526381 59.684669,30.4526302 59.6846662,30.4526205 59.6846666,30.4526137 59.6846701,30.4526128 59.684675,30.4526184 59.684679,30.4526277 59.6846803)', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857461,8906857453,8906857460,8906857459,8906857458,8906857457,8906857456,8906857455,8906857454,8906857461}'),
('SRID=4326;LINESTRING(30.4535863 59.6847456,30.4535811 59.6847595)', 'way', 962869365, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8906857470,8289295976}'),
('SRID=4326;MULTIPOLYGON(((30.4513 59.6845239,30.4513105 59.6845148,30.4513253 59.6844972,30.4513336 59.6844848,30.4513473 59.6844699,30.4513568 59.6844555,30.4513653 59.6844381,30.4513738 59.6844262,30.4513936 59.6844093,30.4514013 59.6843976,30.4514225 59.6843888,30.4514444 59.6843812,30.4514614 59.6843629,30.4514704 59.6843445,30.4514736 59.6843262,30.4514828 59.6842988,30.4514912 59.6842865,30.4514975 59.6842799,30.4515117 59.6842705,30.4515428 59.6842625,30.4516031 59.6842549,30.4518408 59.6843394,30.4519523 59.6843794,30.4520216 59.6844035,30.4520874 59.6844268,30.4521402 59.684444,30.4521943 59.6844606,30.452244 59.6844736,30.4522939 59.6844865,30.4523452 59.6844991,30.4524113 59.6845149,30.4524654 59.6845284,30.4525244 59.6845406,30.4525539 59.6845467,30.452566 59.6845558,30.452571 59.6845656,30.4525675 59.6845745,30.4525615 59.68459,30.4525618 59.6845988,30.4525613 59.6846073,30.4525568 59.6846156,30.4525466 59.6846232,30.4525331 59.6846279,30.4525251 59.684634,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4521768 59.6852884,30.4521573 59.685297,30.4521207 59.6853099,30.4520859 59.6853167,30.4520483 59.6853214,30.4520121 59.6853235,30.4519679 59.6853228,30.4519209 59.685316,30.4518731 59.6853033,30.4518364 59.6852869,30.4518016 59.6852646,30.4517747 59.6852436,30.4517546 59.685224,30.4517399 59.685205,30.4517278 59.6851773,30.4517104 59.6851603,30.4516916 59.6851468,30.4516857 59.6851285,30.4516903 59.6851123,30.4517117 59.6851023,30.4517426 59.685094,30.4517784 59.6850892,30.4518103 59.6850908,30.4518403 59.6851005,30.4518731 59.6850949,30.4518771 59.6850809,30.4518692 59.685051,30.4518777 59.6850294,30.4519043 59.6850131,30.4519376 59.6850028,30.4519737 59.684999,30.4520079 59.6849997,30.4520477 59.685012,30.4520887 59.6850223,30.4521435 59.6850216,30.4521948 59.6850093,30.4522112 59.6849969,30.4522301 59.6849727,30.45222 59.6849586,30.4521979 59.6849496,30.4521524 59.6849328,30.452119 59.6849135,30.452105 59.6848849,30.4521099 59.684868,30.4520932 59.684849,30.4520658 59.6848372,30.4520255 59.6848223,30.4520099 59.6848104,30.4519866 59.6847939,30.4519651 59.6847718,30.4519517 59.6847501,30.4519518 59.6847258,30.4519545 59.6847041,30.4519786 59.6846635,30.4520121 59.6846479,30.452051 59.6846256,30.4520604 59.6846161,30.4520537 59.6846046,30.4520175 59.6845829,30.4519692 59.6845613,30.451933 59.684566,30.4519102 59.6845748,30.4518928 59.6845917,30.4518772 59.6846127,30.4518697 59.684638,30.4518561 59.6846587,30.4518347 59.6846794,30.4518136 59.6846859,30.451785 59.6846963,30.4517612 59.6847117,30.4517363 59.6847257,30.4517004 59.6847328,30.4516678 59.6847376,30.4516243 59.6847395,30.4515783 59.6847426,30.4515624 59.6847383,30.451536 59.6847319,30.4515265 59.6847207,30.4515128 59.6847092,30.4515012 59.6846991,30.4514963 59.6846932,30.4515039 59.6846846,30.4515091 59.6846707,30.4515006 59.6846638,30.4514837 59.6846584,30.4514488 59.6846536,30.4514298 59.6846424,30.4514235 59.6846339,30.451434 59.6846216,30.451452 59.6846104,30.4514721 59.684604,30.4514816 59.6845934,30.4514827 59.6845827,30.4514763 59.6845715,30.4514427 59.6845604,30.4514004 59.6845719,30.4513792 59.6845708,30.451356 59.684566,30.4513317 59.6845601,30.4513137 59.6845489,30.4513042 59.6845393,30.4513 59.6845239)))', 'relation', 12444790, '{"natural": "wood", "leaf_type": "mixed", "leaf_cycle": "mixed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523568 59.6851898,30.4523702 59.6851856,30.4524483 59.6851915,30.452456 59.6851977,30.4524419 59.6852441,30.4524248 59.6852328,30.4524088 59.6852218,30.4523826 59.6852055,30.4523568 59.6851898)))', 'way', 961717571, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459)))', 'way', 961717572, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082,30.4523303 59.6851757)))', 'way', 961717577, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443,30.4528543 59.6852169)))', 'way', 961717578, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622)))', 'way', 961717579, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6852802,30.453028 59.6852429,30.4530414 59.6852392,30.4530554 59.6852658,30.453041 59.6852693,30.4530288 59.6852733,30.4530143 59.6852802)))', 'way', 961717580, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530501 59.6852392,30.4531172 59.6852446,30.4531031 59.6852618,30.4530921 59.6852616,30.4530782 59.6852621,30.4530632 59.6852641,30.4530501 59.6852392)))', 'way', 961717581, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.4531138 59.6852988,30.4530897 59.6853096,30.4530682 59.6853211,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168)))', 'relation', 12935642, '{"height": "6", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530106 59.6853114,30.4530161 59.6853019,30.4530244 59.6852922,30.4530375 59.685285,30.4530534 59.685278,30.4530732 59.685274,30.4530931 59.6852723,30.4531124 59.685272,30.4531329 59.6852751,30.4531443 59.685278,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530111 59.6853217,30.4530106 59.6853114)))', 'relation', 12922491, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530012 59.685359,30.4529724 59.685378,30.4529542 59.6853912,30.4529312 59.685409,30.4529136 59.685403)))', 'relation', 12935641, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527618 59.6854305,30.4527687 59.6854078,30.4527852 59.6854026,30.4528654 59.6854091,30.4528755 59.6854172,30.4528681 59.6854402,30.4528506 59.685445,30.4527747 59.6854387,30.4527618 59.6854305)))', 'way', 961717594, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524557 59.6852538,30.4525351 59.6852597,30.4525442 59.6852666,30.4525328 59.6853069,30.4525201 59.6853123,30.4524969 59.6852906,30.4524775 59.6852724,30.4524557 59.6852538)))', 'way', 961717595, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523226 59.6851969,30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969)))', 'way', 961717596, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522795 59.6852157,30.4522803 59.6851945,30.4523081 59.6852118,30.4523362 59.6852293,30.4523649 59.6852475,30.4523853 59.6852614,30.4524056 59.685276,30.4524322 59.6852976,30.4524465 59.6853116,30.4524653 59.6853309,30.4524785 59.6853465,30.4524909 59.685362,30.4525002 59.6853776,30.4525091 59.6853943,30.4525171 59.6854097,30.4525231 59.6854242,30.4525257 59.6854303,30.4525224 59.6854348,30.4525097 59.6854362,30.452501 59.6854325,30.4524982 59.6854272,30.4524918 59.6854125,30.4524839 59.6853973,30.4524751 59.6853808,30.452466 59.6853657,30.452454 59.6853507,30.4524411 59.6853354,30.4524225 59.6853163,30.4524087 59.6853027,30.4523827 59.6852816,30.4523628 59.6852673,30.4523427 59.6852536,30.4523143 59.6852356,30.4522795 59.6852157)))', 'way', 961717597, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525975 59.6854176,30.4526042 59.6853942,30.4526196 59.6853891,30.4527003 59.6853955,30.4527112 59.6854034,30.4527032 59.6854269,30.4526842 59.6854313,30.4526076 59.685425,30.4525975 59.6854176)))', 'way', 961717598, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527849 59.685488,30.4527911 59.6854671,30.4528702 59.6854731,30.4528639 59.685494,30.4527849 59.685488)))', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525642 59.6854713,30.4525705 59.6854504,30.4526495 59.6854564,30.4526433 59.6854773,30.4525642 59.6854713)))', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529138 59.6853368,30.4529263 59.6852951,30.4529427 59.6852903,30.4529866 59.6852936,30.4529963 59.6853005,30.4529853 59.6853413,30.4529678 59.6853472,30.4529235 59.6853445,30.4529138 59.6853368)))', 'way', 961717602, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452933 59.6852753,30.4529444 59.6852374,30.4529582 59.685233,30.4530088 59.6852371,30.4530171 59.6852433,30.453002 59.6852821,30.4529886 59.6852873,30.4529441 59.6852838,30.452933 59.6852753)))', 'way', 961717603, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525595 59.6852465,30.4525709 59.685208,30.4525847 59.6852036,30.4526353 59.6852076,30.452645 59.6852146,30.4526333 59.6852538,30.4526207 59.6852585,30.4525692 59.6852544,30.4525595 59.6852465)))', 'way', 961717604, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452817 59.6852667,30.452831 59.6852267,30.4528493 59.6852281,30.452851 59.685224,30.4529216 59.6852291,30.4529319 59.6852358,30.45292 59.6852751,30.4529066 59.6852809,30.4528288 59.6852748,30.452817 59.6852667)))', 'way', 961717605, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527946 59.6853272,30.4528087 59.6852864,30.4528247 59.6852816,30.4529042 59.6852874,30.4529154 59.6852941,30.4529031 59.6853359,30.4528878 59.6853416,30.4528053 59.6853349,30.4527946 59.6853272)))', 'way', 961717606, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527745 59.6853889,30.4527899 59.6853454,30.4528052 59.6853419,30.4528845 59.6853477,30.4528953 59.6853552,30.4528839 59.6853982,30.4528677 59.6854032,30.4527865 59.6853969,30.4527745 59.6853889)))', 'way', 961717607, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536,30.4533349 59.6850974)))', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437,30.4535137 59.6851734,30.4534909 59.6851715)))', 'relation', 12925809, '{"crop": "grape", "genus": "Vitis", "taxon": "Vitis amurensis", "landuse": "vineyard", "genus:ru": "Виноград", "taxon:ru": "Виноград амурский"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532761 59.6852013,30.4533083 59.6851038,30.4533211 59.6851024,30.4533941 59.6851559,30.453378 59.6851586,30.4533606 59.6851647,30.4533458 59.6851715,30.4533338 59.6851796,30.4533257 59.6851898,30.453319 59.6851999,30.4533137 59.6852128,30.4532761 59.6852013)))', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530768 59.6850789,30.4530825 59.6850727,30.45327 59.6850856,30.4532721 59.6850914,30.4531813 59.685123,30.4531731 59.6851201,30.4531599 59.6851179,30.4531475 59.6851179,30.4531357 59.6851196,30.4530768 59.6850789)))', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728)))', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531381 59.685138,30.4531404 59.6851346,30.4531455 59.6851322,30.4531523 59.6851313,30.4531591 59.685132,30.4531645 59.6851343,30.4531672 59.6851376,30.4531665 59.6851411,30.4531627 59.6851441,30.4531566 59.6851458,30.4531496 59.6851459,30.4531433 59.6851444,30.4531391 59.6851415,30.4531381 59.685138)))', 'way', 962062995, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531836 59.6851532,30.45319 59.6851488,30.4531936 59.6851444,30.453195 59.6851401,30.4531946 59.6851353,30.4531914 59.68513,30.4532804 59.6850981,30.4532923 59.6851023,30.4532587 59.6851977,30.45325 59.6851972,30.4531836 59.6851532)))', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)))', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145,30.4528382 59.6851861)))', 'way', 962062998, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077,30.4528577 59.6851769)))', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)))', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529338 59.6849691,30.4529452 59.6849315,30.4530566 59.6849397,30.4530583 59.6849454,30.4529465 59.6849826,30.4529492 59.6849698,30.4529338 59.6849691)))', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529465 59.6849918,30.4530662 59.6849507,30.4530757 59.684955,30.4530456 59.6850508,30.4530344 59.685052,30.4529465 59.6849918)))', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529083 59.6850544,30.4529184 59.6850114,30.4529378 59.6850121,30.4529398 59.6850009,30.4530221 59.685056,30.4530153 59.6850613,30.4529083 59.6850544)))', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528875 59.6851184,30.4529043 59.6850625,30.4530125 59.6850679,30.4530138 59.6850731,30.4528875 59.6851184)))', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739)))', 'way', 962382766, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528885 59.6851275,30.4530206 59.6850798,30.4530311 59.6850841,30.4530072 59.6851719,30.4529896 59.6851748,30.4528885 59.6851275)))', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533227 59.6850682,30.4533546 59.6849733,30.4533655 59.6849715,30.4534612 59.68503,30.4533332 59.6850719,30.4533227 59.6850682)))', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533411 59.685078,30.4534619 59.6850382,30.4534444 59.6850899,30.4533437 59.685083,30.4533411 59.685078)))', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233)))', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005)))', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532116 59.6849902,30.4532258 59.6849527,30.4533191 59.6849588,30.4533219 59.6849634,30.4532298 59.6849953,30.4532207 59.684992,30.4532116 59.6849902)))', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)))', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530763 59.6850024,30.453091 59.6849565,30.4531032 59.6849548,30.4531695 59.6849976,30.4531647 59.6850018,30.4531619 59.6850065,30.4530763 59.6850024)))', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547,30.4530603 59.6850515)))', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530791 59.6850599,30.4531749 59.6850252,30.4531799 59.6850271,30.4531863 59.6850287,30.4531735 59.6850722,30.453083 59.685065,30.4530791 59.6850599)))', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531903 59.6850727,30.453201 59.6850303,30.453211 59.6850297,30.4532223 59.6850274,30.4532816 59.6850715,30.4532727 59.6850781,30.4531903 59.6850727)))', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531253 59.6850083,30.4531279 59.6850008,30.4531334 59.6849938,30.4531415 59.6849874,30.4531519 59.6849819,30.4531642 59.6849776,30.4531779 59.6849745,30.4531926 59.6849729,30.4532076 59.6849728,30.4532224 59.6849741,30.4532363 59.6849768,30.453249 59.6849809,30.4532598 59.6849862,30.4532684 59.6849924,30.4532744 59.6849993,30.4532776 59.6850067,30.4532779 59.6850143,30.4532753 59.6850217,30.4532699 59.6850288,30.4532618 59.6850352,30.4532514 59.6850406,30.4532391 59.685045,30.4532253 59.685048,30.4532107 59.6850496,30.4531957 59.6850498,30.4531809 59.6850485,30.4531669 59.6850457,30.4531543 59.6850416,30.4531434 59.6850364,30.4531349 59.6850302,30.4531288 59.6850232,30.4531256 59.6850158,30.4531253 59.6850083)))', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903)))', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532247 59.6848893,30.453227 59.684886,30.4532321 59.6848835,30.4532389 59.6848826,30.4532457 59.6848833,30.4532511 59.6848856,30.4532538 59.6848889,30.4532531 59.6848924,30.4532493 59.6848954,30.4532432 59.6848971,30.4532362 59.6848972,30.4532299 59.6848957,30.4532257 59.6848928,30.4532247 59.6848893)))', 'way', 962678726, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530998 59.6849248,30.4531253 59.6848349,30.4531384 59.6848341,30.4532098 59.6848776,30.4532043 59.6848829,30.4532023 59.6848877,30.4532029 59.6848932,30.4532056 59.6848974,30.4531105 59.684928,30.4530998 59.6849248)))', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529683 59.6848711,30.4531034 59.6848301,30.4531127 59.6848333,30.4530868 59.6849239,30.4530724 59.6849262,30.4529683 59.6848711)))', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529482 59.6849246,30.452961 59.6848772,30.4530633 59.6849302,30.4530589 59.6849341,30.4529482 59.6849246)))', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531185 59.6849335,30.4532133 59.6849034,30.4532243 59.684907,30.4532339 59.6849085,30.4532455 59.6849087,30.4532581 59.6849071,30.4533269 59.6849477,30.4533222 59.6849516,30.4531212 59.684939,30.4531185 59.6849335)))', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452977 59.6848046,30.4529797 59.6847958,30.453536 59.6848401,30.4535329 59.6848493,30.452977 59.6848046)))', 'way', 962714214, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)))', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565,30.4533809 59.6849511)))', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533623 59.6849431,30.4533921 59.6848545,30.4534038 59.6848537,30.4534994 59.6849065,30.4533739 59.6849464,30.4533623 59.6849431)))', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)))', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529663 59.6848632,30.4529831 59.6848107,30.4530928 59.6848201,30.4530962 59.6848253,30.4529663 59.6848632)))', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531503 59.6848308,30.453158 59.6848262,30.4533614 59.6848416,30.4533642 59.6848467,30.4532706 59.684876,30.4532619 59.6848729,30.4532504 59.6848704,30.4532379 59.6848698,30.4532263 59.6848712,30.4532195 59.6848732,30.4531503 59.6848308)))', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452631 59.6847454,30.4526341 59.6847357,30.4528676 59.6847547,30.4528645 59.6847644,30.452631 59.6847454)))', 'way', 962735612, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530149 59.6847769,30.4530176 59.6847681,30.4535589 59.6848104,30.4535559 59.6848195,30.4530149 59.6847769)))', 'way', 962735613, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6847573,30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573)))', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523152 59.6851448,30.4526116 59.6847664,30.4528877 59.684789,30.4528309 59.6849691,30.4528148 59.6849678,30.4528061 59.6849952,30.4528221 59.6849965,30.45277 59.6851675,30.4527658 59.68518,30.4523152 59.6851448)))', 'relation', 12933782, '{"ref": "5", "name": "Кенконс", "genus": "Tilia", "name:en": "The Quincunx", "natural": "wood", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526128 59.684675,30.4526137 59.6846701,30.4526205 59.6846666,30.4526302 59.6846662,30.4526381 59.684669,30.4526406 59.6846738,30.4526365 59.6846782,30.4526277 59.6846803,30.4526184 59.684679,30.4526128 59.684675)))', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526042 59.6846709,30.4526082 59.6846655,30.452617 59.6846635,30.4528469 59.6846817,30.452843 59.684694,30.4528376 59.6847122,30.4526498 59.6846973,30.4526123 59.6846817,30.4526042 59.6846709)))', 'relation', 12933783, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530629 59.6847308,30.4530706 59.6847131,30.4530752 59.684699,30.4535863 59.6847456,30.4535811 59.6847595,30.4535752 59.6847748,30.4530629 59.6847308)))', 'relation', 12933784, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4534977 59.6852035,30.4534967 59.6852111,30.453492 59.6852191,30.4534813 59.6852261,30.4534692 59.6852309,30.4534524 59.6852342,30.453435 59.6852355,30.4534193 59.6852337,30.4534045 59.6852307,30.4533914 59.6852248,30.4533831 59.6852182,30.4533763 59.68521,30.4533752 59.6852006)))', 'relation', 12935640, '{"height": "5.5", "roof:shape": "pyramidal", "roof:colour": "#DADDE2", "roof:height": "0.5", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526773 59.6854805,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.4527511 59.6854859,30.4526773 59.6854805)))', 'relation', 12987950, '{"height": "1", "roof:shape": "skillion", "roof:colour": "grey", "roof:height": "1", "building:part": "yes", "roof:direction": "170", "building:colour": "#E4C78F", "roof:orientation": "along"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4526773 59.6854805,30.4527511 59.6854859,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528709 59.6855164,30.4527091 59.6855042,30.4525787 59.6854944)))', 'relation', 12935639, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4522474 59.6851858,30.4522167 59.6853009,30.4522119 59.6853269,30.4521905 59.6853763,30.4521596 59.6854203,30.4521293 59.6854701,30.4520946 59.6855262,30.4520624 59.6855804,30.4520524 59.6856064,30.452047 59.6856386,30.452047 59.6856666,30.4520551 59.685713,30.4520778 59.685798,30.4520997 59.6858613,30.4521127 59.6859046,30.4521047 59.6859432,30.4520825 59.6859825,30.4520478 59.686026,30.4520492 59.6860479,30.4520658 59.6860755,30.4520819 59.6860924,30.4521387 59.6861383,30.4521581 59.6861556,30.4521822 59.6861782,30.45222 59.6862149,30.4522535 59.6862461,30.4522676 59.6862668,30.4522828 59.6862897,30.4522911 59.6863104,30.4522992 59.6863312,30.4523018 59.6863618,30.4522989 59.6863961,30.4522911 59.6864255,30.452286 59.6864496,30.4522787 59.6864747,30.4522743 59.6864925,30.452274 59.6865148,30.4522776 59.6865312,30.4522888 59.6865538,30.4523045 59.686573,30.4523226 59.6865862,30.4523413 59.6865954,30.4523836 59.686613,30.4524214 59.6866244,30.4524614 59.686634,30.4524912 59.6866392,30.4525264 59.6866438,30.4525641 59.6866457,30.4526585 59.6866455,30.4527524 59.6866414,30.4528825 59.6866353,30.4530173 59.6866255,30.4531259 59.6866181,30.4531936 59.6866133,30.453271 59.6866114,30.4533083 59.686614,30.4534028 59.6866228,30.4535229 59.6866363,30.4536201 59.6866455,30.453691 59.6866508,30.4536976 59.6866508,30.4539823 59.6866673,30.4539778 59.6866919,30.4544217 59.6867427,30.4544227 59.6867377,30.4544646 59.686742,30.4544638 59.6867472,30.4545508 59.6867576,30.4545534 59.6867525,30.4545963 59.6867573,30.4546214 59.6867604,30.4546788 59.6867553,30.4548168 59.686752,30.4551163 59.6867835,30.4552388 59.6868093,30.4553945 59.6868602,30.455491 59.6869022,30.4555769 59.68694,30.4556466 59.6869672,30.4557807 59.6870023,30.4558987 59.6870186,30.4559816 59.68702,30.4560875 59.6870601,30.4561508 59.6871091,30.4561831 59.6871675,30.456183 59.687235,30.4561616 59.6872894,30.4561159 59.6873352,30.4560824 59.6873697,30.4560436 59.6874139,30.4560113 59.687453,30.4559765 59.6875127,30.4559804 59.6875356,30.4559953 59.6875601,30.4560395 59.6875816,30.4560838 59.6875938,30.4561467 59.6876019,30.4561991 59.6876021,30.4563573 59.6875979,30.4565289 59.6875961,30.4566782 59.6875933,30.4567611 59.687592,30.4568899 59.687586,30.4570005 59.6875828,30.4570995 59.6875755,30.4572099 59.6875697,30.4573214 59.6875781,30.4574243 59.6875895,30.4575564 59.6876086,30.4576489 59.6876236,30.4577906 59.6876357,30.4578929 59.687656,30.4579737 59.6876911,30.4580413 59.6877282,30.4581225 59.6877678,30.4581817 59.6878027,30.4582341 59.6878291,30.4583152 59.6878863,30.4583478 59.6879193,30.4583877 59.6879673,30.458411 59.6880122,30.4584387 59.6880452,30.4584657 59.6880811,30.4585427 59.6881373,30.4585748 59.6881735,30.4586375 59.6882236,30.4586938 59.6882576,30.4587833 59.6883125,30.45884 59.6883434,30.4588959 59.6883741,30.4589723 59.6884163,30.4590175 59.6884495,30.4590717 59.6884887,30.4591366 59.6885238,30.4591908 59.6885653,30.4592104 59.6886013,30.4592312 59.6886474,30.4592494 59.6886943,30.4592859 59.6887303,30.4593172 59.688773,30.4593556 59.6888131,30.459429 59.6888677,30.459467 59.6889042,30.4594979 59.688929,30.4595172 59.6889694,30.4595266 59.6890044,30.4595285 59.689042,30.4595248 59.6890919,30.4595255 59.6891719,30.4595317 59.6892178,30.4595442 59.6893129,30.4595387 59.689363,30.4595118 59.6894235,30.4594761 59.689469,30.4594014 59.6895068,30.4593069 59.6895588,30.4592476 59.6895966,30.4591945 59.6896312,30.4591511 59.6896562,30.4591092 59.6896944,30.4590843 59.6897378,30.4590826 59.689771,30.4590853 59.6898069,30.4591078 59.6898435,30.4592007 59.6898882,30.4592339 59.6899293,30.4592628 59.6899874,30.4592762 59.6900429,30.45928 59.6901025,30.4592809 59.6901575,30.4592798 59.6902243,30.4593042 59.6902777,30.4593662 59.6903178,30.4594544 59.6903409,30.4595249 59.6903674,30.4595807 59.6903944,30.4596268 59.6904316,30.4596583 59.6904756,30.4596087 59.690551,30.4596006 59.6905905,30.4595977 59.6906403,30.4595904 59.6906903,30.4595826 59.6907418,30.4595821 59.6908019,30.459583 59.6908375,30.459529 59.6908703,30.4594074 59.6909353,30.4592831 59.6909939,30.459213 59.6910431,30.4591817 59.691066,30.4591361 59.6911201,30.4591012 59.6911675,30.4591012 59.691223,30.4591406 59.6912486,30.4592295 59.6912875,30.4592895 59.6913173,30.4593728 59.6913444,30.4594455 59.6913593,30.459517 59.6913682,30.4596037 59.6913935,30.4596491 59.6914211,30.4596908 59.6914522,30.4597319 59.6914924,30.4597559 59.6915361,30.4597745 59.6915821,30.459787 59.6916313,30.4597852 59.6916643,30.4597718 59.6917238,30.4597396 59.6917861,30.4596859 59.6918429,30.4596685 59.6918693,30.4596383 59.6919054,30.4596009 59.6919405,30.4595315 59.6919991,30.4594652 59.6920502,30.4594082 59.6920946,30.4593773 59.6921151,30.4593545 59.6921348,30.4593366 59.6921529,30.4593399 59.6921734,30.4593659 59.6921939,30.4596045 59.6923272,30.4596496 59.6923362,30.4596901 59.6923377,30.4597398 59.6923315,30.4597933 59.6923156,30.4598526 59.6922792,30.4599141 59.692234,30.4600168 59.6921771,30.4600862 59.6921317,30.4601606 59.6921103,30.4602526 59.6920827,30.460323 59.6920633,30.4603814 59.6920333,30.4604812 59.6919715,30.4605362 59.6919506,30.4606073 59.6919499,30.4606743 59.6919675,30.4607467 59.6920081,30.4608017 59.6920284,30.4608728 59.6920473,30.4609935 59.6920595,30.4610726 59.692067,30.4611517 59.6920866,30.4612403 59.6921299,30.4612939 59.6921759,30.4613569 59.6922104,30.4614227 59.6922341,30.4614964 59.6922659,30.4615568 59.6923059,30.4616211 59.6923729,30.4616748 59.6924466,30.4617579 59.6925197,30.4618368 59.6925614,30.461948 59.6926074,30.4620442 59.6926525,30.4621643 59.6927115,30.4622732 59.6927583,30.4623906 59.6927971,30.4625398 59.6928238,30.4626554 59.6928355,30.4627278 59.6928346,30.4627807 59.6928331,30.4629009 59.6928193,30.4629797 59.6928093,30.4630314 59.6928086,30.4630815 59.6928162,30.4631241 59.6928309,30.4631433 59.692849,30.4631354 59.6928782,30.4630918 59.6929178,30.4629933 59.692982,30.4628509 59.6930395,30.4627989 59.693076,30.4627775 59.6931068,30.4627715 59.6931374,30.4627782 59.6931678,30.4628 59.6931938,30.462816 59.6932161,30.4628201 59.6932352,30.4628276 59.6932642,30.4628055 59.6932947,30.462749 59.6933555,30.4627356 59.6934076,30.4627544 59.6934638,30.4627866 59.6935491,30.4628348 59.6936025,30.4628814 59.6936516,30.4629464 59.6936976,30.4630181 59.6937555,30.4631033 59.6938351,30.463194 59.693908,30.4632997 59.6939707,30.4633997 59.6940315,30.4634563 59.6940722,30.4634978 59.6941112,30.4635448 59.6941433,30.4635995 59.6941633,30.4636618 59.6941785,30.4637065 59.6941778,30.4637604 59.694169,30.4638165 59.6941725,30.4638941 59.6941882,30.463945 59.6941973,30.4639826 59.6942136,30.4640155 59.6942304,30.4640341 59.6942422,30.4640539 59.694259,30.4640781 59.6942943,30.4641097 59.6943536,30.4641054 59.6943849,30.4640955 59.6944214,30.4640677 59.6944543,30.4640278 59.694509,30.4639684 59.6945921,30.4639761 59.694632,30.4640196 59.6946691,30.4640928 59.6947215,30.4641504 59.6947644,30.4642414 59.694848,30.4643013 59.6949614,30.4643265 59.6950347,30.4643629 59.6950927,30.464383 59.6951471,30.4644155 59.6951914,30.4644503 59.6952616,30.464467 59.6953187,30.4644779 59.6953885,30.4644493 59.6954307,30.4644137 59.6954645,30.4643477 59.6955048,30.4642827 59.6955528,30.4641331 59.6956106,30.4640324 59.6956546,30.4639589 59.6956973,30.4639054 59.6957548,30.4638826 59.6958068,30.4638917 59.6958626,30.4638959 59.695908,30.4638913 59.6959452,30.4638761 59.6959807,30.4638581 59.6960266,30.4638387 59.6960774,30.4638353 59.6961315,30.4638514 59.6962235,30.4639031 59.6963079,30.4639806 59.6963837,30.4640641 59.696435,30.4641563 59.6964993,30.4642492 59.6965314,30.464353 59.6965624,30.4645112 59.6966079,30.4646909 59.6966431,30.4648519 59.6966796,30.4649082 59.6966992,30.4649645 59.6967256,30.4650316 59.6967635,30.465104 59.6968014,30.4651737 59.6968352,30.4652724 59.696889,30.4653398 59.6969338,30.4653714 59.6969637,30.4653977 59.6970024,30.4654124 59.6970396,30.4654285 59.6970924,30.4654299 59.6971357,30.4654285 59.6971912,30.4654178 59.6972534,30.4654178 59.6973103,30.4654268 59.6973472,30.465443 59.6973849,30.4654739 59.6974306,30.465535 59.6974889,30.4655776 59.6975263,30.4655998 59.6975497,30.4656249 59.6975948,30.4656281 59.6976305,30.4656291 59.6976586,30.465636 59.697698,30.4656478 59.6977439,30.4656559 59.6977839,30.4656639 59.6978247,30.4656741 59.697865,30.4656808 59.6978977,30.4656931 59.6979479,30.4657242 59.6979888,30.4657651 59.6980369,30.4658049 59.6980618,30.4658569 59.6980859,30.4659085 59.6981101,30.4659691 59.6981356,30.4659934 59.6981619,30.4660187 59.6982125,30.4660434 59.6982506,30.4660765 59.6982913,30.46612 59.6983229,30.46618 59.6983645,30.4662324 59.6983954,30.466279 59.6984245,30.4663222 59.6984585,30.4663422 59.6984839,30.4663508 59.6985161,30.466347 59.6985389,30.4663297 59.6985658,30.4662984 59.6986043,30.4662667 59.6986353,30.4662287 59.6986639,30.4662098 59.6986996,30.4662023 59.698738,30.4662177 59.6987814,30.4662476 59.6988217,30.4662941 59.6988595,30.4663218 59.6988897,30.4663703 59.6989336,30.4664066 59.698983,30.4664342 59.6990318,30.46626 59.699006,30.4662245 59.6990009,30.4661986 59.6989985,30.465736 59.6989731,30.465674 59.6989864,30.4656438 59.6989955,30.4656194 59.6990058,30.4655995 59.6990178,30.4655881 59.6990296,30.4655669 59.6990522,30.4655425 59.6990838,30.4655077 59.6991223,30.4654429 59.6991855,30.4653481 59.6992218,30.4652461 59.6992516,30.4651852 59.6992621,30.4651339 59.6992648,30.4650235 59.6992651,30.4649339 59.6992741,30.4648662 59.6992863,30.4647744 59.6993078,30.4647108 59.6993347,30.4646409 59.6993755,30.4645943 59.6994397,30.4645313 59.6994729,30.464447 59.6994976,30.4643342 59.6995189,30.4641272 59.6995513,30.4601 59.6956121,30.4590933 59.6945995,30.4585195 59.6940453,30.4565283 59.6920253,30.4559963 59.6915691,30.455779 59.6913562,30.4555191 59.6911016,30.4536132 59.6892318,30.4533114 59.6893232,30.4532486 59.6892981,30.453085 59.689221,30.4529871 59.689177,30.4528879 59.6891357,30.4528128 59.6891072,30.4524488 59.6889751,30.4524008 59.688958,30.4523038 59.6889045,30.4522723 59.6888961,30.4522552 59.6888858,30.4522361 59.6888724,30.452216 59.68885,30.4521838 59.6888324,30.4521207 59.6887986,30.4520511 59.6887644,30.4518909 59.6886967,30.4517882 59.6886551,30.4516822 59.6886098,30.4515358 59.6885556,30.4514019 59.6885123,30.4513037 59.6884778,30.4512571 59.6884636,30.4512056 59.6884428,30.4511404 59.6884196,30.4510778 59.6883871,30.4510264 59.6883553,30.4509783 59.6883239,30.4508749 59.6882578,30.4508266 59.688226,30.4507678 59.6881981,30.4505943 59.6881208,30.4501869 59.6879433,30.4499736 59.6878632,30.4499334 59.6878503,30.4498881 59.687841,30.4497871 59.6878092,30.4494924 59.6876814,30.4490926 59.6875099,30.4490362 59.6874936,30.4489854 59.6874759,30.4489383 59.6874638,30.448876 59.687449,30.4487626 59.6874338,30.4486346 59.6874221,30.4485214 59.6874142,30.4483648 59.6874032,30.4474691 59.687337,30.4468361 59.6872873,30.4467403 59.6872722,30.446684 59.6872669,30.4463496 59.6872017,30.4463085 59.6871943,30.4462561 59.6871833,30.4462179 59.6871721,30.446187 59.6871613,30.4461557 59.68715,30.4461253 59.6871366,30.4461066 59.6871274,30.4460918 59.6871135,30.4460273 59.6870454,30.4459552 59.6870078,30.4459436 59.6870073,30.4459073 59.6869902,30.4458766 59.6869748,30.445846 59.6869616,30.4458216 59.6869518,30.4457961 59.6869433,30.4457578 59.6869309,30.4457123 59.6869183,30.4456647 59.6869057,30.4455949 59.6868892,30.4455514 59.68688,30.4455232 59.6868726,30.4455129 59.6868665,30.4453868 59.6868434,30.44531 59.6868381,30.4452457 59.6868322,30.44506 59.686812,30.4450028 59.6868076,30.4449557 59.6868041,30.4449237 59.6868029,30.4448943 59.6868019,30.4448734 59.6868039,30.4448512 59.6868054,30.4448212 59.6868026,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017)))', 'relation', 4187886, '{"ref": "II", "name": "Долина реки Славянки", "place": "quarter", "name:az": "Slavyanka çayının vadisi", "name:fr": "Vallée de la rivière Slavianka", "name:hy": "Սլավյանկա գետի հովիտ", "name:uk": "Долина річки Слов''янки", "name:zh": "谷斯拉维亚卡河", "boundary": "protected_area", "int_name": "Vallée de la rivière Slavianka", "wikidata": "Q121809341", "wikipedia": "ru:Павловский парк#Долина реки Славянки", "description": "Район Павловского парка"}', NULL),
('SRID=4326;LINESTRING(30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392)', 'way', 1297781094, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{8289295976,12023732271,12023732270,12023732269,8114975027,12023699867,12023732331,12023732330,12023732337,12023732336}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528788 59.6854915)', 'way', 1093902027, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,1439053668}'),
('SRID=4326;LINESTRING(30.4535894 59.6847601,30.4535811 59.6847595)', 'way', 1297781085, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{12023732332,8289295976}'),
('SRID=4326;LINESTRING(30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601)', 'way', 1297781086, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{12023732335,12023732334,12023732333,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4519927 59.6856654,30.451993 59.6856352,30.4519974 59.6856085,30.4520057 59.6855861,30.452033 59.685533,30.4520717 59.6854725,30.4521073 59.6854196,30.4521538 59.6853554,30.4521646 59.6853419,30.4521729 59.6853289,30.4521751 59.685321,30.4521778 59.6853033,30.4521768 59.6852884,30.4522278 59.6851794,30.4522474 59.6851858,30.4522695 59.6851929,30.4522692 59.6852184,30.452307 59.6852409,30.4523333 59.6852571,30.4523534 59.6852701,30.4523836 59.685295,30.4524088 59.6853175,30.4524395 59.6853504,30.4524616 59.6853789,30.4524735 59.685401,30.4524845 59.6854195,30.4524943 59.6854502,30.452497 59.6854882,30.452346 59.6854768,30.4523217 59.6855588,30.4522802 59.6855556,30.4522258 59.6855515,30.4522191 59.6855742,30.4522002 59.685638,30.4521808 59.6857036,30.4521745 59.6857248,30.4522289 59.6857289,30.4522705 59.6857319,30.4522477 59.6858088,30.4522804 59.6858113,30.4525803 59.6858339,30.4526091 59.6858361,30.4526832 59.6858416,30.4528205 59.685852,30.4528174 59.6858982,30.4527279 59.6859036,30.4527314 59.6859191,30.4527383 59.6859422,30.4527472 59.6859643,30.4527643 59.6859927,30.4527791 59.6860133,30.4527956 59.6860336,30.4528174 59.6860572,30.4528406 59.6860793,30.4528659 59.6861008,30.4528879 59.6861175,30.4529175 59.6861373,30.4529497 59.6861561,30.4529804 59.6861727,30.4530167 59.6861897,30.4530418 59.6861992,30.4530963 59.6861616,30.4531534 59.686184,30.4531278 59.6862023,30.453137 59.6862056,30.4531608 59.6862141,30.4531704 59.6862175,30.453196 59.6861992,30.4531795 59.686249,30.4531642 59.6862975,30.453138 59.686381,30.4531363 59.6863866,30.4532826 59.6863983,30.4532725 59.6864305,30.4532916 59.686432,30.4532869 59.6864462,30.4532998 59.6864473,30.4533248 59.6864494,30.4533485 59.6864515,30.4533611 59.6864525,30.4533659 59.6864383,30.4534768 59.6864467,30.453575 59.6864544,30.4535812 59.6864636,30.4536188 59.68646,30.4536556 59.6864553,30.4536952 59.6864492,30.4537376 59.6864434,30.4537814 59.6864354,30.4538212 59.6864281,30.453863 59.6864194,30.4538817 59.6864353,30.4539287 59.6864214,30.4539454 59.6864356,30.4539576 59.686432,30.4540057 59.6864176,30.4540172 59.6864141,30.4540005 59.6863999,30.4540399 59.6863883,30.4540219 59.6863729,30.4540549 59.6863624,30.4540887 59.6863495,30.4541297 59.6863344,30.4541407 59.6863296,30.4541607 59.6863411,30.4541696 59.6863371,30.4542 59.6863235,30.4542091 59.6863195,30.4541887 59.6863078,30.4541965 59.6863041,30.4542363 59.6862844,30.4542705 59.6862654,30.4542999 59.6862773,30.4544137 59.6862059,30.4543849 59.6861942,30.4544059 59.686181,30.4544395 59.686154,30.4544728 59.6861239,30.4544964 59.6860973,30.4545494 59.6861117,30.4546053 59.6861282,30.4545922 59.6861427,30.4545784 59.6861572,30.4545449 59.6861862,30.4545138 59.6862131,30.4544576 59.6862495,30.4543906 59.6862854,30.4543294 59.6863147,30.4542746 59.6863415,30.454221 59.6863683,30.454115 59.6864133,30.454039 59.6864407,30.4539464 59.6864693,30.4539252 59.6864763,30.4538233 59.6865047,30.4536724 59.6865094,30.4536724 59.6865223,30.4536503 59.6865223,30.4535973 59.686521,30.4535465 59.6865208,30.4535021 59.6865209,30.4534712 59.6865222,30.4534473 59.6865255,30.453429 59.6865331,30.4534215 59.6865438,30.4534132 59.686574,30.4534136 59.6865866,30.453423 59.6865971,30.4534445 59.6866075,30.4534686 59.686613,30.4534579 59.6866461,30.4534073 59.6866421,30.4533332 59.6866345,30.4532837 59.6866305,30.453254 59.6866292,30.4532071 59.6866305,30.4531615 59.686632,30.4531191 59.6866347,30.4531041 59.6865988,30.4531448 59.6865925,30.4531695 59.6865869,30.4531966 59.6865772,30.4532138 59.6865676,30.4532231 59.6865589,30.453199 59.6865568,30.4531811 59.6865532,30.4531596 59.6865468,30.4531373 59.6865396,30.4531219 59.6865326,30.4530964 59.6865196,30.4530733 59.6865042,30.4530555 59.6864887,30.4530367 59.6864681,30.4530227 59.6864499,30.4530105 59.6864274,30.4530012 59.6864103,30.4529945 59.6863933,30.4529919 59.6863759,30.4529905 59.686347,30.4529907 59.6863231,30.4529911 59.6862911,30.4529891 59.686281,30.4529827 59.6862715,30.4529634 59.6862545,30.4529402 59.6862373,30.4529067 59.6862141,30.4528563 59.6861801,30.4528201 59.6861533,30.4527906 59.6861317,30.4527578 59.6861047,30.452731 59.6860823,30.4527092 59.6860609,30.4526947 59.6860457,30.4526816 59.6860278,30.4526652 59.6860011,30.4526541 59.6859782,30.4526337 59.6859283,30.4526256 59.6859159,30.4526103 59.685908,30.4525905 59.6859034,30.4525603 59.6859009,30.452391 59.6858965,30.4523675 59.6858999,30.4523504 59.685904,30.4523333 59.6859114,30.452312 59.685923,30.4522313 59.6859637,30.4521811 59.6859882,30.452085 59.686032,30.4520765 59.6860386,30.4520753 59.6860476,30.4520797 59.6860577,30.4520264 59.6860652,30.4520201 59.6860504,30.4520162 59.6860346,30.4520143 59.6860207,30.4520168 59.6860051,30.4520203 59.685989,30.4520274 59.6859769,30.4520341 59.6859612,30.4520405 59.6859506,30.452047 59.6859415,30.4520537 59.6859259,30.4520544 59.6859134,30.4520523 59.6858956,30.4520465 59.6858708,30.4520254 59.6858069,30.4519995 59.68571,30.4519927 59.6856654),(30.4521704 59.6857398,30.4521704 59.6857513,30.4521744 59.6857635,30.4521811 59.6857763,30.4521945 59.6857899,30.4522187 59.6858021,30.4522414 59.6858088,30.4522629 59.685735,30.4521731 59.6857289,30.4521704 59.6857398),(30.452226 59.6855475,30.4523159 59.6855543,30.4523387 59.6854798,30.4523212 59.6854826,30.4523011 59.6854866,30.452277 59.6854941,30.4522596 59.6855015,30.4522448 59.6855117,30.4522354 59.6855225,30.4522301 59.6855347,30.452226 59.6855475),(30.4522508 59.6858359,30.4525647 59.6858582,30.4525714 59.6858373,30.4522575 59.6858142,30.4522508 59.6858359),(30.4523249 59.685462,30.4523727 59.6854667,30.4523804 59.6854465,30.4523327 59.6854418,30.4523249 59.685462)))', 'relation', 6636677, '{"surface": "fine_gravel", "area:highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533763 59.68521,30.4534979 59.6851951,30.4535038 59.6852069,30.4534995 59.6852209,30.4533878 59.6852355,30.4533818 59.6852214,30.4533763 59.68521)))', 'relation', 12947389, '{"height": "6", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523253 59.6851768,30.4523286 59.6851637,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4525881 59.6854311,30.452574 59.6853959,30.4525486 59.6853522,30.4525291 59.6853286,30.4525137 59.6853106,30.452501 59.6852981,30.4524755 59.6852751,30.452455 59.6852592,30.4524366 59.6852453,30.4524178 59.6852321,30.4523994 59.6852201,30.4523706 59.6852014,30.452339 59.6851839,30.4523253 59.6851768)))', 'relation', 5906400, '{"ref": "2", "name": "Цветочный партер", "leisure": "garden", "name:en": "The Flower Parterre", "ref:okn": "781620399040956", "alt_name": "Цветники Марии Фёдоровны", "wikidata": "Q118122045", "garden:type": "flowerbed", "garden:style": "french"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.4533268 59.6853074,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532343 59.6853363,30.453156 59.6852825)))', 'relation', 17755883, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4531158 59.6853933,30.4531719 59.6854212,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530216 59.6854636,30.4529242 59.6854401,30.4529045 59.6854337)))', 'relation', 17755885, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4532343 59.6853363,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.453238 59.6853862,30.453207 59.6854026,30.4531719 59.6854212,30.4531158 59.6853933,30.4530217 59.6853466)))', 'relation', 17755884, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527677 59.6846399,30.4527719 59.6846286,30.4527799 59.6846212,30.4527933 59.6846157,30.4528134 59.6846137,30.4528403 59.6846144,30.4528537 59.6846178,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399)))', 'relation', 12932608, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 1721132, '{"ref": "3", "name": "Павильон Трёх граций", "note": "Геометрические теги крыши павильона размещены отдельно", "name:es": "Pabellón de las tres gracias", "name:fr": "Pavillon des Trois Grâces", "name:pt": "Pavilhão das Três Graças", "name:zh": "三美人亭", "ref:okn": "781610399040356", "tourism": "attraction", "building": "yes", "heritage": "2", "historic": "yes", "wikidata": "Q112716431", "addr:city": "Павловск", "architect": "Чарльз Камерон", "start_date": "1800", "addr:street": "Садовая улица", "architect:en": "Charles Cameron", "addr:housenumber": "20 литЧ", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6514/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12202573, '{"height": "7", "min_height": "5.5", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "1", "building:part": "yes", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12497925, '{"height": "1.5", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525466 59.6846232,30.4525568 59.6846156,30.4525613 59.6846073,30.4525618 59.6845988,30.4525615 59.68459,30.4525675 59.6845745,30.452571 59.6845656,30.452566 59.6845558,30.4525539 59.6845467,30.4526659 59.6845694,30.4527826 59.6845897,30.4528946 59.6846069,30.4530012 59.6846212,30.4535732 59.6846878,30.4535916 59.6846905,30.453606 59.6846946,30.4536164 59.684701,30.4536208 59.6847085,30.4536214 59.684718,30.4536181 59.6847274,30.4536067 59.6847614,30.4535894 59.6847601,30.4535811 59.6847595,30.4535863 59.6847456,30.4535923 59.6847296,30.4535925 59.6847224,30.4535886 59.6847164,30.4535807 59.6847121,30.4535698 59.6847103,30.4535555 59.6847085,30.4530859 59.6846667,30.4530887 59.6846582,30.4530942 59.6846416,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399,30.4525841 59.6846239,30.4525626 59.6846222,30.4525466 59.6846232)))', 'relation', 12131779, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452047 59.6856386,30.4520524 59.6856064,30.4520624 59.6855804,30.4520946 59.6855262,30.4521293 59.6854701,30.4521596 59.6854203,30.4521905 59.6853763,30.4522119 59.6853269,30.4522167 59.6853009,30.4522474 59.6851858,30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4601554 59.6854805,30.4601767 59.6856005,30.4601793 59.6857568,30.4601468 59.6858374,30.4600081 59.6860973,30.459853 59.68614,30.459704 59.6863415,30.4596832 59.6864086,30.4596712 59.686482,30.4596638 59.6865545,30.459666 59.6866369,30.4596929 59.6867933,30.4597047 59.6868418,30.4597409 59.6869365,30.4598403 59.6871335,30.4599111 59.6872432,30.4599552 59.6873116,30.4600453 59.6874469,30.460134 59.687572,30.4600858 59.6875668,30.4600427 59.6875593,30.4599863 59.6875559,30.4598958 59.6875545,30.4597744 59.6875619,30.4597289 59.6875627,30.4596698 59.687583,30.4596323 59.6876026,30.4595974 59.6876371,30.4595625 59.6876658,30.4595236 59.6876852,30.459478 59.6876967,30.459407 59.6877062,30.4593453 59.6877028,30.4592849 59.6876838,30.4592367 59.6876553,30.4591509 59.6875883,30.4590905 59.6875599,30.4590355 59.6875424,30.4589524 59.6875261,30.4588343 59.6875105,30.4586868 59.6875038,30.4585474 59.6875038,30.4584333 59.6875086,30.4583274 59.6875126,30.4582348 59.6875193,30.4581437 59.6875301,30.4580095 59.6875505,30.4579371 59.6875654,30.4579009 59.6875782,30.4578312 59.6876019,30.4577386 59.6876249,30.4576489 59.6876236,30.4575564 59.6876086,30.4574243 59.6875895,30.4573214 59.6875781,30.4572099 59.6875697,30.4570995 59.6875755,30.4570005 59.6875828,30.4568899 59.687586,30.4567611 59.687592,30.4566782 59.6875933,30.4565289 59.6875961,30.4563573 59.6875979,30.4561991 59.6876021,30.4561467 59.6876019,30.4560838 59.6875938,30.4560395 59.6875816,30.4559953 59.6875601,30.4559804 59.6875356,30.4559765 59.6875127,30.4560113 59.687453,30.4560436 59.6874139,30.4560824 59.6873697,30.4561159 59.6873352,30.4561616 59.6872894,30.456183 59.687235,30.4561831 59.6871675,30.4561508 59.6871091,30.4560875 59.6870601,30.4559816 59.68702,30.4558987 59.6870186,30.4557807 59.6870023,30.4556466 59.6869672,30.4555769 59.68694,30.455491 59.6869022,30.4553945 59.6868602,30.4552388 59.6868093,30.4551163 59.6867835,30.4548168 59.686752,30.4546788 59.6867553,30.4546214 59.6867604,30.4545963 59.6867573,30.4545534 59.6867525,30.4545508 59.6867576,30.4544638 59.6867472,30.4544646 59.686742,30.4544227 59.6867377,30.4544217 59.6867427,30.4539778 59.6866919,30.4539823 59.6866673,30.4536976 59.6866508,30.453691 59.6866508,30.4536201 59.6866455,30.4535229 59.6866363,30.4534028 59.6866228,30.4533083 59.686614,30.453271 59.6866114,30.4531936 59.6866133,30.4531259 59.6866181,30.4530173 59.6866255,30.4528825 59.6866353,30.4527524 59.6866414,30.4526585 59.6866455,30.4525641 59.6866457,30.4525264 59.6866438,30.4524912 59.6866392,30.4524614 59.686634,30.4524214 59.6866244,30.4523836 59.686613,30.4523413 59.6865954,30.4523226 59.6865862,30.4523045 59.686573,30.4522888 59.6865538,30.4522776 59.6865312,30.452274 59.6865148,30.4522743 59.6864925,30.4522787 59.6864747,30.452286 59.6864496,30.4522911 59.6864255,30.4522989 59.6863961,30.4523018 59.6863618,30.4522992 59.6863312,30.4522911 59.6863104,30.4522828 59.6862897,30.4522676 59.6862668,30.4522535 59.6862461,30.45222 59.6862149,30.4521822 59.6861782,30.4521581 59.6861556,30.4521387 59.6861383,30.4520819 59.6860924,30.4520658 59.6860755,30.4520492 59.6860479,30.4520478 59.686026,30.4520825 59.6859825,30.4521047 59.6859432,30.4521127 59.6859046,30.4520997 59.6858613,30.4520778 59.685798,30.4520551 59.685713,30.452047 59.6856666,30.452047 59.6856386)))', 'relation', 4194432, '{"ref": "III", "name": "Придворцовый район", "place": "quarter", "name:fr": "Secteur central", "website": "https://pavlovskmuseum.ru/about/park/layout/36/", "boundary": "protected_area", "wikidata": "Q121809724", "wikipedia": "ru:Павловский парк#Центральный (Придворцовый) район", "description": "Район исторического Павловского парка"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4366882 59.6889898,30.4370373 59.6889668,30.4370736 59.6889644,30.4371138 59.6889367,30.4374634 59.6889115,30.4375002 59.6889088,30.4375427 59.6889059,30.4380171 59.6888738,30.438182 59.6888616,30.4383254 59.6888487,30.4384589 59.6888338,30.4385849 59.6888182,30.4388652 59.6887778,30.4389016 59.6887728,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346802 59.6935317,30.4346817 59.6935045,30.4346729 59.6934955,30.4346017 59.6934439,30.4344133 59.6933106,30.4344523 59.6932882,30.4344971 59.6932601,30.4345233 59.6932407,30.4345424 59.6932254,30.4345634 59.6932027,30.4345863 59.693171,30.4345979 59.6931498,30.4346066 59.6931248,30.4346128 59.6930889,30.434612 59.693054,30.4346077 59.6930245,30.4346019 59.6930124,30.4345969 59.693,30.4345757 59.6929702,30.4345621 59.6929518,30.434542 59.6929299,30.4345091 59.6928998,30.4344756 59.6928775,30.4344413 59.6928581,30.4343883 59.6928337,30.4343603 59.6928224,30.4343198 59.692809,30.4342705 59.6927958,30.4342429 59.6927909,30.4341796 59.6927811,30.4341217 59.6927737,30.4340777 59.6927708,30.4340075 59.6927673,30.4339293 59.6927692,30.4338474 59.6927768,30.433767 59.6927902,30.4337225 59.6928016,30.4335043 59.6926756,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)))', 'relation', 1721131, '{"name": "Павловский парк", "note": "https://wiki.openstreetmap.org/wiki/RU:Павловск/Павловский_парк", "leisure": "park", "name:be": "Паўлаўскі парк", "name:bg": "Павловски парк", "name:ca": "Parc Pàvlovsk", "name:en": "Pavlovsk Park", "name:es": "Parque Pávlovsk", "name:fr": "Parc de Pavlovsk", "name:he": "פארק פבלובסק", "name:hy": "Պավլովսկ պարկը", "name:nl": "Pavlovskpark", "name:ru": "Павловский парк", "name:zh": "巴甫洛夫斯克公园", "ref:okn": "781720399040986", "website": "https://pavlovskmuseum.ru/about/park/", "boundary": "protected_area", "heritage": "2", "historic": "yes", "int_name": "Parc de Pavlovsk", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q2506336", "wikipedia": "ru:Павловский парк", "fee:amount": "100", "start_date": "1777", "opening_hours": "07:00-19:00", "protect_class": "22", "operator:phone": "+7 (812) 452-15-36", "fee:conditional": "yes @ 9:00-17:00", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6407/", "operator:tourism": "museum", "operator:website": "http://www.pavlovskmuseum.ru", "protection_title": "Государственный музей-заповедник"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4368674 59.6896812,30.4373083 59.6896203,30.4383622 59.6894747,30.4383925 59.6894699,30.4387768 59.6894091,30.4389533 59.6893793,30.4395631 59.6892765,30.4395975 59.6896826,30.43963 59.6897841,30.4411104 59.6895883,30.4411759 59.6892872,30.4412059 59.6891298,30.4412229 59.6890714,30.4402547 59.6891154,30.4398722 59.6891396,30.4395358 59.6891608,30.4394903 59.6891472,30.4392717 59.6889536,30.4391469 59.6889286,30.4391174 59.6889211,30.4390705 59.6889062,30.4390316 59.6888852,30.4390007 59.6888636,30.4389819 59.6888446,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346174 59.6935301,30.4346147 59.6935224,30.4346086 59.6935129,30.4345932 59.6935014,30.4344744 59.6934215,30.4344752 59.6934118,30.4344684 59.6934032,30.4343048 59.693294,30.4335858 59.6928433,30.4335672 59.6928378,30.4335491 59.692831,30.4335344 59.6928246,30.4335169 59.6928158,30.4334908 59.6928019,30.4334747 59.6927935,30.4334378 59.6927735,30.4334063 59.6927569,30.4333486 59.6927221,30.4332896 59.6926848,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)),((30.4459925 59.6840515,30.4465029 59.6838166,30.4469327 59.6836721,30.4472874 59.6834226,30.4479163 59.6832392,30.4483415 59.6832476,30.4484247 59.6832514,30.4484595 59.6832547,30.4484884 59.6832585,30.4485108 59.6832641,30.4489705 59.6834352,30.4489993 59.6834563,30.4490069 59.6834636,30.4492468 59.6836887,30.4491255 59.6840718,30.4490543 59.6840686,30.4483928 59.684035,30.4478277 59.6840459,30.4469355 59.6841321,30.4462744 59.6842068,30.4459925 59.6840515)))', 'relation', 17990902, '{"name": "Государственный музей-заповедник «Павловск»", "note": "граница имущественного комплекса организации, не граница парка", "boundary": "protected_area", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q405637"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601,30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698)))', 'relation', 17786995, '{"landuse": "construction", "start_date": "06.204", "description": "реставрация Павильона Трех граций"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522477 59.6858088,30.4522705 59.6857319,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4527091 59.6855042,30.4528709 59.6855164,30.4529043 59.6855189,30.4529835 59.685525,30.4530542 59.6855302,30.4530286 59.6856166,30.4529796 59.6857822,30.4529559 59.6858622,30.4528897 59.6858572,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088)))', 'relation', 6636658, '{"height": "19.650", "architect": "Чарльз Камерон", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2.45", "building:part": "yes", "building:colour": "#FFE19C", "source:building:part": "http://pancer.ru/images/project/012/2.jpg"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4530216 59.6854636,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.453064 59.6855044,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 6636659, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528709 59.6855164,30.4528746 59.6855048,30.4528788 59.6854915,30.4529122 59.6854936,30.4529942 59.6854993,30.4529881 59.6855114,30.4529835 59.685525,30.4529043 59.6855189,30.4528709 59.6855164)))', 'relation', 14572596, '{"height": "6.65", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533818 59.6852214,30.453417 59.6852162,30.4534578 59.6852115,30.4535038 59.6852069,30.4535289 59.6853164,30.4535075 59.6853177,30.4534847 59.6853198,30.4534688 59.6853212,30.4534368 59.6853262,30.453436 59.6853248,30.4534146 59.6852887,30.4533878 59.6852355,30.4533818 59.6852214)))', 'relation', 17755881, '{"height": "13", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.453436 59.6853248,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533268 59.6853074,30.4532684 59.6852465)))', 'relation', 17755882, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.4533836 59.6852944,30.4533532 59.6853009,30.4533268 59.6853074,30.4532946 59.6853162,30.4532665 59.6853249,30.4532343 59.6853363,30.4532132 59.6853445,30.4531881 59.6853553,30.453164 59.6853668,30.4531411 59.6853788,30.4531158 59.6853933,30.4530954 59.6854062,30.4530746 59.6854199,30.4530552 59.6854344,30.4530382 59.6854491,30.4530216 59.6854636,30.4530079 59.6854761,30.4530004 59.6854886,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 17904735, '{"height": "10", "roof:shape": "flat", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.4528469 59.6846817,30.452843 59.684694,30.4529628 59.6847041,30.4530706 59.6847131,30.4530752 59.684699,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4535302 59.6851198,30.4535229 59.6851437,30.4535137 59.6851734,30.4535124 59.6851786,30.4535038 59.6852069,30.4534979 59.6851951,30.4534914 59.6851874,30.4534811 59.6851808,30.4534678 59.6851758,30.4534524 59.6851728,30.453436 59.6851719,30.4534196 59.6851732,30.4534028 59.6851772,30.4533891 59.6851835,30.4533796 59.6851915,30.4533752 59.6852006,30.4533763 59.68521,30.4533818 59.6852214,30.4533524 59.685227,30.4533302 59.6852316,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4528993 59.6854656,30.4528865 59.6854815,30.4528788 59.6854915,30.4528746 59.6855048,30.4527686 59.6854977,30.452777 59.6854654,30.4527565 59.685464,30.4527224 59.6854618,30.4526841 59.6854592,30.4526646 59.6854579,30.4526564 59.6854895,30.4525812 59.6854845,30.4525787 59.6854944,30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858,30.4522278 59.6851794)))', 'relation', 4274530, '{"fee": "yes", "ref": "IIIа", "name": "Собственный сад", "leisure": "garden", "name:fr": "Jardin privé", "ref:okn": "781620399040366", "tourism": "attraction", "alt_name": "Собственный садик", "boundary": "protected_area", "heritage": "2", "wikidata": "Q118122043", "start_date": "1803", "garden:style": "french", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6518/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4521745 59.6857248,30.4521808 59.6857036,30.4522002 59.685638,30.4522191 59.6855742,30.4522258 59.6855515,30.4522802 59.6855556,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533763 59.68521,30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540229 59.6848667,30.4540358 59.6848708,30.454047 59.6848759,30.4540561 59.6848821,30.454063 59.6848889,30.4540674 59.6848962,30.4540691 59.6849039,30.454068 59.6849115,30.4540643 59.6849189,30.454058 59.6849259,30.4540493 59.6849322,30.4540386 59.6849376,30.4540261 59.684942,30.4540122 59.6849452,30.4539975 59.684947,30.4539823 59.6849475,30.4539763 59.6849646,30.453965 59.6849637,30.4539277 59.6849606,30.4538688 59.6849558,30.4538059 59.6849506,30.4537818 59.6849487,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537483 59.6850789,30.4538612 59.6850876,30.4539247 59.6850925,30.4539406 59.6850424,30.4539786 59.6850519,30.4540221 59.685063,30.4540417 59.6850686,30.4540646 59.6850751,30.4541059 59.6850881,30.4541472 59.6851025,30.4541871 59.685118,30.4542254 59.6851343,30.4542622 59.6851516,30.4542942 59.6851377,30.4544115 59.6852076,30.4543838 59.6852203,30.4544141 59.6852392,30.4544426 59.6852588,30.4544691 59.6852791,30.4544972 59.6853031,30.4545225 59.6853279,30.4545451 59.6853534,30.4545829 59.6853462,30.4546442 59.6854282,30.4546081 59.6854351,30.4546263 59.6854611,30.4546407 59.6854917,30.4546513 59.6855211,30.4546577 59.6855509,30.4545667 59.6855569,30.4545695 59.6855677,30.4545502 59.6855689,30.4545521 59.6855762,30.454475 59.6855814,30.454473 59.685574,30.4544524 59.6855754,30.4544496 59.6855646,30.4544349 59.6855656,30.4543687 59.68557,30.4543619 59.6855441,30.4543522 59.6855184,30.4543439 59.6854971,30.4543247 59.685468,30.454307 59.6854434,30.4542866 59.6854194,30.4542636 59.6853959,30.4542381 59.6853732,30.4542062 59.685347,30.4541753 59.6853248,30.4541426 59.6853062,30.4541083 59.6852876,30.4540689 59.6852681,30.4540273 59.6852498,30.4539837 59.6852328,30.4539382 59.685217,30.4538908 59.6852026,30.4538877 59.6852126,30.4539316 59.6852158,30.4539299 59.6852218,30.4539248 59.68524,30.453923 59.6852463,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536921 59.6853643,30.4536766 59.6853631,30.453626 59.6853592,30.4536111 59.6853581,30.4536187 59.6853329,30.4534688 59.6853212,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.4532824 59.685393,30.4532679 59.6854007,30.4532019 59.6854356,30.4531881 59.6854429,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.45306 59.6855156,30.4530542 59.6855302,30.4530286 59.6856166,30.4530752 59.6856201,30.4531272 59.685624,30.4531226 59.6856395,30.4531 59.6857159,30.4530826 59.6857747,30.4530781 59.6857896,30.4530261 59.6857857,30.4529796 59.6857822,30.4529559 59.6858622,30.4529512 59.6858765,30.4529486 59.6858896,30.4529478 59.6859011,30.4529482 59.6859112,30.452952 59.685926,30.4529569 59.6859385,30.4529638 59.6859523,30.4529718 59.6859649,30.4529791 59.6859757,30.4529856 59.6859841,30.4530246 59.6859742,30.4530338 59.6859834,30.4530767 59.6860278,30.4530861 59.6860371,30.4530482 59.6860471,30.4530568 59.6860536,30.4530663 59.6860602,30.4530779 59.6860674,30.4530898 59.6860742,30.4531018 59.6860809,30.4531136 59.6860871,30.4531293 59.6860946,30.453148 59.6861029,30.4531695 59.6861116,30.4532167 59.6861306,30.4533686 59.6861421,30.453376 59.6861189,30.4533898 59.68612,30.4534436 59.6861244,30.453457 59.6861255,30.4534496 59.6861487,30.4536027 59.6861615,30.4535556 59.6863114,30.4535958 59.6863065,30.4536563 59.6862959,30.4537014 59.6862868,30.4537731 59.6862682,30.4538342 59.6862493,30.453879 59.6862345,30.4539364 59.686214,30.4539768 59.686198,30.45402 59.6861768,30.4540703 59.686148,30.4541119 59.6861223,30.4541469 59.6860952,30.4541742 59.6860729,30.4541995 59.6860505,30.4542215 59.6860272,30.4542918 59.6860451,30.4543031 59.6860479,30.4543127 59.6860386,30.45433 59.6860429,30.4543365 59.6860363,30.4544062 59.6860538,30.4543997 59.6860604,30.4544185 59.6860651,30.4544086 59.6860746,30.4544964 59.6860973,30.4544728 59.6861239,30.4544395 59.686154,30.4544059 59.686181,30.4543849 59.6861942,30.4544137 59.6862059,30.4542999 59.6862773,30.4542705 59.6862654,30.4542363 59.6862844,30.4541965 59.6863041,30.4541887 59.6863078,30.4542091 59.6863195,30.4542 59.6863235,30.4541696 59.6863371,30.4541607 59.6863411,30.4541407 59.6863296,30.4541297 59.6863344,30.4540887 59.6863495,30.4540549 59.6863624,30.4540219 59.6863729,30.4540399 59.6863883,30.4540005 59.6863999,30.4540172 59.6864141,30.4540057 59.6864176,30.4539576 59.686432,30.4539454 59.6864356,30.4539287 59.6864214,30.4538817 59.6864353,30.453863 59.6864194,30.4538212 59.6864281,30.4537814 59.6864354,30.4537376 59.6864434,30.4536952 59.6864492,30.4536556 59.6864553,30.4536188 59.68646,30.4535812 59.6864636,30.453575 59.6864544,30.4534768 59.6864467,30.4533659 59.6864383,30.4533611 59.6864525,30.4533485 59.6864515,30.4533248 59.6864494,30.4532998 59.6864473,30.4532869 59.6864462,30.4532916 59.686432,30.4532725 59.6864305,30.4532826 59.6863983,30.4531363 59.6863866,30.453138 59.686381,30.4531642 59.6862975,30.4531215 59.686294,30.4531372 59.6862455,30.4531795 59.686249,30.453196 59.6861992,30.4531704 59.6862175,30.4531608 59.6862141,30.453137 59.6862056,30.4531278 59.6862023,30.4531534 59.686184,30.4530963 59.6861616,30.4530418 59.6861992,30.4530167 59.6861897,30.4529804 59.6861727,30.4529497 59.6861561,30.4529175 59.6861373,30.4528879 59.6861175,30.4528659 59.6861008,30.4528406 59.6860793,30.4528174 59.6860572,30.4527956 59.6860336,30.4527791 59.6860133,30.4527643 59.6859927,30.4527472 59.6859643,30.4527383 59.6859422,30.4527314 59.6859191,30.4527279 59.6859036,30.4528174 59.6858982,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088,30.4522705 59.6857319,30.4522289 59.6857289,30.4521745 59.6857248)))', 'relation', 1759666, '{"name": "Павловский дворец", "name:ca": "Palau Pàvlovsk", "name:en": "Pavlovsk Palace", "name:fi": "Pavlovskin_palatsi", "name:fr": "Palais de Pavlovsk", "name:pt": "Palácio de Pavlovsk", "name:uz": "Pavlovsk saroyi", "name:zh": "巴甫洛夫斯克的宫殿", "ref:okn": "781610399040316", "tourism": "museum", "building": "palace", "historic": "yes", "int_name": "Palais de Pavlovsk", "wikidata": "Q118121947", "wikipedia": "ru:Павловский дворец", "start_date": "1782", "addr:street": "Садовая улица", "roof:colour": "#DADDE2", "building:colour": "#FFE19C", "addr:housenumber": "20 литА"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534688 59.6853212,30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536666 59.6853366,30.4536187 59.6853329,30.4534688 59.6853212)))', 'relation', 6636665, '{"name": "Южный корпус", "height": "15", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4534995 59.6852209)))', 'relation', 14572597, '{"height": "15", "roof:shape": "gabled", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540054 59.6848752,30.4537854 59.6848579,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537003 59.685133,30.453682 59.6851921,30.4535124 59.6851786)))', 'relation', 18019154, '{"height": "13", "roof:shape": "hipped", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL);
--Testcase 402:
SELECT count(*) FROM json_osm_test;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 404: オーク / Sồi
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 406:
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 407:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 408: 落葉性 / Cây rụng lá
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 409:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 410: 常緑植物 / Cây thường xanh
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 411:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 412: XVIII cent.
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 413:
DELETE FROM json_osm_test;
--Testcase 500:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/macaddr.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR"( "i" int OPTIONS (key 'true'), "m" macaddr) SERVER sqlite_svr OPTIONS (table 'type_MACADDR');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (1, '08:00:2b:01:02:03');
--Testcase 012:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (2, '08-00-2b-01-02-03');
--Testcase 013:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (3, '08002b:010203');
--Testcase 014:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (4, '08002b-010203');
--Testcase 015:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (5, '0800.2b01.0203');
--Testcase 016:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (6, '0800-2b01-0203');
--Testcase 017:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (7, '08002b010203');
--Testcase 018:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (8, '08:00:2F:01:02:03');
--Testcase 019:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (9, '08-00-2F-01-02-03');
--Testcase 020:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (10, '08002F:010203');
--Testcase 021:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (11, '08002F-010203');
--Testcase 022:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (12, '0800.2F01.0203');
--Testcase 023:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (13, '0800-2F01-0203');
--Testcase 024:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (14, '08002F010203');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (15, decode('08002F010203', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (16, decode('08002b010203', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE macaddr;
--Testcase 029:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (17, '08:00:2b:01:02:03');
--Testcase 030:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (18, '08-00-2b-01-02-03');
--Testcase 031:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (19, '08002b:010203');
--Testcase 032:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (20, '08002b-010203');
--Testcase 033:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (21, '0800.2b01.0203');
--Testcase 034:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (22, '0800-2b01-0203');
--Testcase 035:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (23, '08002b010203');
--Testcase 036:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (24, '08:00:2F:01:02:03');
--Testcase 037:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (25, '08-00-2F-01-02-03');
--Testcase 038:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (26, '08002F:010203');
--Testcase 039:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (27, '08002F-010203');
--Testcase 040:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (28, '0800.2F01.0203');
--Testcase 041:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (29, '0800-2F01-0203');
--Testcase 042:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (31, '08:00:2b:01:02:03');
--Testcase 046:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (32, '08-00-2b-01-02-03');
--Testcase 047:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (33, '08002b:010203');
--Testcase 048:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (34, '08002b-010203');
--Testcase 049:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (35, '0800.2b01.0203');
--Testcase 050:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (36, '0800-2b01-0203');
--Testcase 051:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (37, '08002b010203');
--Testcase 052:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (38, '08:00:2F:01:02:03');
--Testcase 053:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (39, '08-00-2F-01-02-03');
--Testcase 054:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (40, '08002F:010203');
--Testcase 055:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (41, '08002F-010203');
--Testcase 056:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (42, '0800.2F01.0203');
--Testcase 057:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (43, '0800-2F01-0203');
--Testcase 058:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (45, '08:00:2b:01:02:03');
--Testcase 062:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (46, '08-00-2b-01-02-03');
--Testcase 063:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (47, '08002b:010203');
--Testcase 064:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (48, '08002b-010203');
--Testcase 065:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (49, '0800.2b01.0203');
--Testcase 066:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (50, '0800-2b01-0203');
--Testcase 067:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (51, '08002b010203');
--Testcase 068:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (52, '08:00:2F:01:02:03');
--Testcase 069:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (53, '08-00-2F-01-02-03');
--Testcase 070:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (54, '08002F:010203');
--Testcase 071:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (55, '08002F-010203');
--Testcase 072:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (56, '0800.2F01.0203');
--Testcase 073:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (57, '0800-2F01-0203');
--Testcase 074:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR+"( "i" int OPTIONS (key 'true'), "m" macaddr, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR+');
--Testcase 077:
SELECT * FROM "type_MACADDR+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 084:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 088:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 091:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17; -- 9527026057731
--Testcase 098:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 106:
SELECT * FROM "type_MACADDR+";
--Testcase 107:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (59, '08:AA:2F:01:02:04');
--Testcase 108:
SELECT * FROM "type_MACADDR+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 111:
SELECT * FROM "type_MACADDR+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 115:
SELECT * FROM "type_MACADDR+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 119:
SELECT * FROM "type_MACADDR+";
--Testcase 120:
DELETE FROM "type_MACADDR";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (60, '01:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (61, '02:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (62, '03:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (63, '00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (64, '00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (65, '00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (66, '00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (67, '00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (68, '00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDRpk" (col macaddr OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDRpk" VALUES ('01-02-03-04-05-06');
--Testcase 159:
SELECT * FROM "type_MACADDRpk";
--Testcase 160:
DELETE FROM "type_MACADDRpk";
--no macaddr operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/macaddr8.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR8"( "i" int OPTIONS (key 'true'), "m" macaddr8) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (1, '08:00:2b:01:02:03:04:05');
--Testcase 012:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (2, '08-00-2b-01-02-03-04-05');
--Testcase 013:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (3, '08002b01:02030405');
--Testcase 014:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (4, '08002b01-02030405');
--Testcase 015:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (5, '0800.2b01.0203.0405');
--Testcase 016:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (6, '0800-2b01-0203-0405');
--Testcase 017:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (7, '08002b0102030405');
--Testcase 018:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (8, '08:00:2F:01:02:03:04:05');
--Testcase 019:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (9, '08-00-2F-01-02-03-04-05');
--Testcase 020:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (10, '08002F01:02030405');
--Testcase 021:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (11, '08002F01-02030405');
--Testcase 022:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (12, '0800.2F01.0203.0405');
--Testcase 023:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (13, '0800-2F01-0203-0405');
--Testcase 024:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (14, '08002F0102030405');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (15, decode('08002F0102030405', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (16, decode('08002b0102030405', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE macaddr8;
--Testcase 029:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (17, '08:00:2b:01:02:03:04:05');
--Testcase 030:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (18, '08-00-2b-01-02-03-04-05');
--Testcase 031:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (19, '08002b01:02030405');
--Testcase 032:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (20, '08002b01-02030405');
--Testcase 033:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (21, '0800.2b01.0203.0405');
--Testcase 034:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (22, '0800-2b01-0203-0405');
--Testcase 035:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (23, '08002b0102030405');
--Testcase 036:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (24, '08:00:2F:01:02:03:04:05');
--Testcase 037:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (25, '08-00-2F-01-02-03-04-05');
--Testcase 038:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (26, '08002F01:02030405');
--Testcase 039:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (27, '08002F01-02030405');
--Testcase 040:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (28, '0800.2F01.0203.0405');
--Testcase 041:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (29, '0800-2F01-0203-0405');
--Testcase 042:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (31, '08:00:2b:01:02:03:04:05');
--Testcase 046:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (32, '08-00-2b-01-02-03-04-05');
--Testcase 047:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (33, '08002b01:02030405');
--Testcase 048:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (34, '08002b01-02030405');
--Testcase 049:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (35, '0800.2b01.0203.0405');
--Testcase 050:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (36, '0800-2b01-0203-0405');
--Testcase 051:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (37, '08002b0102030405');
--Testcase 052:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (38, '08:00:2F:01:02:03:04:05');
--Testcase 053:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (39, '08-00-2F-01-02-03-04-05');
--Testcase 054:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (40, '08002F01:02030405');
--Testcase 055:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (41, '08002F01-02030405');
--Testcase 056:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (42, '0800.2F01.0203.0405');
--Testcase 057:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (43, '0800-2F01-0203-0405');
--Testcase 058:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (45, '08:00:2b:01:02:03:04:05');
--Testcase 062:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (46, '08-00-2b-01-02-03-04-05');
--Testcase 063:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (47, '08002b01:02030405');
--Testcase 064:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (48, '08002b01-02030405');
--Testcase 065:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (49, '0800.2b01.0203.0405');
--Testcase 066:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (50, '0800-2b01-0203-0405');
--Testcase 067:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (51, '08002b0102030405');
--Testcase 068:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (52, '08:00:2F:01:02:03:04:05');
--Testcase 069:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (53, '08-00-2F-01-02-03-04-05');
--Testcase 070:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (54, '08002F01:02030405');
--Testcase 071:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (55, '08002F01-02030405');
--Testcase 072:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (56, '0800.2F01.0203.0405');
--Testcase 073:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (57, '0800-2F01-0203-0405');
--Testcase 074:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR8+"( "i" int OPTIONS (key 'true'), "m" macaddr8, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8+');
--Testcase 077:
SELECT * FROM "type_MACADDR8+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 084:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 088:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 091:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 098:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 106:
SELECT * FROM "type_MACADDR8+";
--Testcase 107:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (59, '08:AA:2F:01:02:04:04:05');
--Testcase 108:
SELECT * FROM "type_MACADDR8+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 111:
SELECT * FROM "type_MACADDR8+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 115:
SELECT * FROM "type_MACADDR8+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 119:
SELECT * FROM "type_MACADDR8+";
--Testcase 120:
DELETE FROM "type_MACADDR8";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (60, '01:00:00:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (61, '02:00:00:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (62, '03:00:00:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (63, '00:00:00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (64, '00:00:00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (65, '00:00:00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (66, '00:00:00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (67, '00:00:00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (68, '00:00:00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR8" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR8" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDR8pk" (col macaddr8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDR8pk" VALUES ('01-02-03-04-05-06-07-08');
--Testcase 159:
SELECT * FROM "type_MACADDR8pk";
--Testcase 160:
DELETE FROM "type_MACADDR8pk";
--no macaddr8 operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR8";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/numeric.sql
================================================
--
-- NUMERIC
--
--Testcase 567:
CREATE EXTENSION sqlite_fdw;
--Testcase 568:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 569:
CREATE FOREIGN TABLE num_data (id int4 OPTIONS (key 'true'), val numeric(210,10)) SERVER sqlite_svr;
--Testcase 570:
CREATE FOREIGN TABLE num_exp_add (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 571:
CREATE FOREIGN TABLE num_exp_sub (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 572:
CREATE FOREIGN TABLE num_exp_div (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 573:
CREATE FOREIGN TABLE num_exp_mul (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 574:
CREATE FOREIGN TABLE num_exp_sqrt (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 575:
CREATE FOREIGN TABLE num_exp_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 576:
CREATE FOREIGN TABLE num_exp_log10 (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 577:
CREATE FOREIGN TABLE num_exp_power_10_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 578:
CREATE FOREIGN TABLE num_result (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), result numeric(210,10)) SERVER sqlite_svr;
-- ******************************
-- * The following EXPECTED results are computed by bc(1)
-- * with a scale of 200
-- ******************************
BEGIN TRANSACTION;
--Testcase 1:
INSERT INTO num_exp_add VALUES (0,0,'0');
--Testcase 2:
INSERT INTO num_exp_sub VALUES (0,0,'0');
--Testcase 3:
INSERT INTO num_exp_mul VALUES (0,0,'0');
--Testcase 4:
INSERT INTO num_exp_div VALUES (0,0,'NaN');
--Testcase 5:
INSERT INTO num_exp_add VALUES (0,1,'0');
--Testcase 6:
INSERT INTO num_exp_sub VALUES (0,1,'0');
--Testcase 7:
INSERT INTO num_exp_mul VALUES (0,1,'0');
--Testcase 8:
INSERT INTO num_exp_div VALUES (0,1,'NaN');
--Testcase 9:
INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047');
--Testcase 10:
INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047');
--Testcase 11:
INSERT INTO num_exp_mul VALUES (0,2,'0');
--Testcase 12:
INSERT INTO num_exp_div VALUES (0,2,'0');
--Testcase 13:
INSERT INTO num_exp_add VALUES (0,3,'4.31');
--Testcase 14:
INSERT INTO num_exp_sub VALUES (0,3,'-4.31');
--Testcase 15:
INSERT INTO num_exp_mul VALUES (0,3,'0');
--Testcase 16:
INSERT INTO num_exp_div VALUES (0,3,'0');
--Testcase 17:
INSERT INTO num_exp_add VALUES (0,4,'7799461.4119');
--Testcase 18:
INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119');
--Testcase 19:
INSERT INTO num_exp_mul VALUES (0,4,'0');
--Testcase 20:
INSERT INTO num_exp_div VALUES (0,4,'0');
--Testcase 21:
INSERT INTO num_exp_add VALUES (0,5,'16397.038491');
--Testcase 22:
INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491');
--Testcase 23:
INSERT INTO num_exp_mul VALUES (0,5,'0');
--Testcase 24:
INSERT INTO num_exp_div VALUES (0,5,'0');
--Testcase 25:
INSERT INTO num_exp_add VALUES (0,6,'93901.57763026');
--Testcase 26:
INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026');
--Testcase 27:
INSERT INTO num_exp_mul VALUES (0,6,'0');
--Testcase 28:
INSERT INTO num_exp_div VALUES (0,6,'0');
--Testcase 29:
INSERT INTO num_exp_add VALUES (0,7,'-83028485');
--Testcase 30:
INSERT INTO num_exp_sub VALUES (0,7,'83028485');
--Testcase 31:
INSERT INTO num_exp_mul VALUES (0,7,'0');
--Testcase 32:
INSERT INTO num_exp_div VALUES (0,7,'0');
--Testcase 33:
INSERT INTO num_exp_add VALUES (0,8,'74881');
--Testcase 34:
INSERT INTO num_exp_sub VALUES (0,8,'-74881');
--Testcase 35:
INSERT INTO num_exp_mul VALUES (0,8,'0');
--Testcase 36:
INSERT INTO num_exp_div VALUES (0,8,'0');
--Testcase 37:
INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420');
--Testcase 38:
INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420');
--Testcase 39:
INSERT INTO num_exp_mul VALUES (0,9,'0');
--Testcase 40:
INSERT INTO num_exp_div VALUES (0,9,'0');
--Testcase 41:
INSERT INTO num_exp_add VALUES (1,0,'0');
--Testcase 42:
INSERT INTO num_exp_sub VALUES (1,0,'0');
--Testcase 43:
INSERT INTO num_exp_mul VALUES (1,0,'0');
--Testcase 44:
INSERT INTO num_exp_div VALUES (1,0,'NaN');
--Testcase 45:
INSERT INTO num_exp_add VALUES (1,1,'0');
--Testcase 46:
INSERT INTO num_exp_sub VALUES (1,1,'0');
--Testcase 47:
INSERT INTO num_exp_mul VALUES (1,1,'0');
--Testcase 48:
INSERT INTO num_exp_div VALUES (1,1,'NaN');
--Testcase 49:
INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047');
--Testcase 50:
INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047');
--Testcase 51:
INSERT INTO num_exp_mul VALUES (1,2,'0');
--Testcase 52:
INSERT INTO num_exp_div VALUES (1,2,'0');
--Testcase 53:
INSERT INTO num_exp_add VALUES (1,3,'4.31');
--Testcase 54:
INSERT INTO num_exp_sub VALUES (1,3,'-4.31');
--Testcase 55:
INSERT INTO num_exp_mul VALUES (1,3,'0');
--Testcase 56:
INSERT INTO num_exp_div VALUES (1,3,'0');
--Testcase 57:
INSERT INTO num_exp_add VALUES (1,4,'7799461.4119');
--Testcase 58:
INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119');
--Testcase 59:
INSERT INTO num_exp_mul VALUES (1,4,'0');
--Testcase 60:
INSERT INTO num_exp_div VALUES (1,4,'0');
--Testcase 61:
INSERT INTO num_exp_add VALUES (1,5,'16397.038491');
--Testcase 62:
INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491');
--Testcase 63:
INSERT INTO num_exp_mul VALUES (1,5,'0');
--Testcase 64:
INSERT INTO num_exp_div VALUES (1,5,'0');
--Testcase 65:
INSERT INTO num_exp_add VALUES (1,6,'93901.57763026');
--Testcase 66:
INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026');
--Testcase 67:
INSERT INTO num_exp_mul VALUES (1,6,'0');
--Testcase 68:
INSERT INTO num_exp_div VALUES (1,6,'0');
--Testcase 69:
INSERT INTO num_exp_add VALUES (1,7,'-83028485');
--Testcase 70:
INSERT INTO num_exp_sub VALUES (1,7,'83028485');
--Testcase 71:
INSERT INTO num_exp_mul VALUES (1,7,'0');
--Testcase 72:
INSERT INTO num_exp_div VALUES (1,7,'0');
--Testcase 73:
INSERT INTO num_exp_add VALUES (1,8,'74881');
--Testcase 74:
INSERT INTO num_exp_sub VALUES (1,8,'-74881');
--Testcase 75:
INSERT INTO num_exp_mul VALUES (1,8,'0');
--Testcase 76:
INSERT INTO num_exp_div VALUES (1,8,'0');
--Testcase 77:
INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420');
--Testcase 78:
INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420');
--Testcase 79:
INSERT INTO num_exp_mul VALUES (1,9,'0');
--Testcase 80:
INSERT INTO num_exp_div VALUES (1,9,'0');
--Testcase 81:
INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047');
--Testcase 82:
INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047');
--Testcase 83:
INSERT INTO num_exp_mul VALUES (2,0,'0');
--Testcase 84:
INSERT INTO num_exp_div VALUES (2,0,'NaN');
--Testcase 85:
INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047');
--Testcase 86:
INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047');
--Testcase 87:
INSERT INTO num_exp_mul VALUES (2,1,'0');
--Testcase 88:
INSERT INTO num_exp_div VALUES (2,1,'NaN');
--Testcase 89:
INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094');
--Testcase 90:
INSERT INTO num_exp_sub VALUES (2,2,'0');
--Testcase 91:
INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209');
--Testcase 92:
INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000');
--Testcase 93:
INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047');
--Testcase 94:
INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047');
--Testcase 95:
INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257');
--Testcase 96:
INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266');
--Testcase 97:
INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047');
--Testcase 98:
INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047');
--Testcase 99:
INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593');
--Testcase 100:
INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685');
--Testcase 101:
INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047');
--Testcase 102:
INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047');
--Testcase 103:
INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077');
--Testcase 104:
INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429');
--Testcase 105:
INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787');
--Testcase 106:
INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307');
--Testcase 107:
INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222');
--Testcase 108:
INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940');
--Testcase 109:
INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047');
--Testcase 110:
INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953');
--Testcase 111:
INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795');
--Testcase 112:
INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518');
--Testcase 113:
INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047');
--Testcase 114:
INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047');
--Testcase 115:
INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407');
--Testcase 116:
INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476');
--Testcase 117:
INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467');
--Testcase 118:
INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627');
--Testcase 119:
INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740');
--Testcase 120:
INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811');
--Testcase 121:
INSERT INTO num_exp_add VALUES (3,0,'4.31');
--Testcase 122:
INSERT INTO num_exp_sub VALUES (3,0,'4.31');
--Testcase 123:
INSERT INTO num_exp_mul VALUES (3,0,'0');
--Testcase 124:
INSERT INTO num_exp_div VALUES (3,0,'NaN');
--Testcase 125:
INSERT INTO num_exp_add VALUES (3,1,'4.31');
--Testcase 126:
INSERT INTO num_exp_sub VALUES (3,1,'4.31');
--Testcase 127:
INSERT INTO num_exp_mul VALUES (3,1,'0');
--Testcase 128:
INSERT INTO num_exp_div VALUES (3,1,'NaN');
--Testcase 129:
INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047');
--Testcase 130:
INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047');
--Testcase 131:
INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257');
--Testcase 132:
INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352');
--Testcase 133:
INSERT INTO num_exp_add VALUES (3,3,'8.62');
--Testcase 134:
INSERT INTO num_exp_sub VALUES (3,3,'0');
--Testcase 135:
INSERT INTO num_exp_mul VALUES (3,3,'18.5761');
--Testcase 136:
INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000');
--Testcase 137:
INSERT INTO num_exp_add VALUES (3,4,'7799465.7219');
--Testcase 138:
INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019');
--Testcase 139:
INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289');
--Testcase 140:
INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552');
--Testcase 141:
INSERT INTO num_exp_add VALUES (3,5,'16401.348491');
--Testcase 142:
INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491');
--Testcase 143:
INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621');
--Testcase 144:
INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504');
--Testcase 145:
INSERT INTO num_exp_add VALUES (3,6,'93905.88763026');
--Testcase 146:
INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026');
--Testcase 147:
INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206');
--Testcase 148:
INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595');
--Testcase 149:
INSERT INTO num_exp_add VALUES (3,7,'-83028480.69');
--Testcase 150:
INSERT INTO num_exp_sub VALUES (3,7,'83028489.31');
--Testcase 151:
INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35');
--Testcase 152:
INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240');
--Testcase 153:
INSERT INTO num_exp_add VALUES (3,8,'74885.31');
--Testcase 154:
INSERT INTO num_exp_sub VALUES (3,8,'-74876.69');
--Testcase 155:
INSERT INTO num_exp_mul VALUES (3,8,'322737.11');
--Testcase 156:
INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553');
--Testcase 157:
INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420');
--Testcase 158:
INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420');
--Testcase 159:
INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020');
--Testcase 160:
INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854');
--Testcase 161:
INSERT INTO num_exp_add VALUES (4,0,'7799461.4119');
--Testcase 162:
INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119');
--Testcase 163:
INSERT INTO num_exp_mul VALUES (4,0,'0');
--Testcase 164:
INSERT INTO num_exp_div VALUES (4,0,'NaN');
--Testcase 165:
INSERT INTO num_exp_add VALUES (4,1,'7799461.4119');
--Testcase 166:
INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119');
--Testcase 167:
INSERT INTO num_exp_mul VALUES (4,1,'0');
--Testcase 168:
INSERT INTO num_exp_div VALUES (4,1,'NaN');
--Testcase 169:
INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047');
--Testcase 170:
INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047');
--Testcase 171:
INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593');
--Testcase 172:
INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385');
--Testcase 173:
INSERT INTO num_exp_add VALUES (4,3,'7799465.7219');
--Testcase 174:
INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019');
--Testcase 175:
INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289');
--Testcase 176:
INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883');
--Testcase 177:
INSERT INTO num_exp_add VALUES (4,4,'15598922.8238');
--Testcase 178:
INSERT INTO num_exp_sub VALUES (4,4,'0');
--Testcase 179:
INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161');
--Testcase 180:
INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000');
--Testcase 181:
INSERT INTO num_exp_add VALUES (4,5,'7815858.450391');
--Testcase 182:
INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409');
--Testcase 183:
INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429');
--Testcase 184:
INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061');
--Testcase 185:
INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026');
--Testcase 186:
INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974');
--Testcase 187:
INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094');
--Testcase 188:
INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606');
--Testcase 189:
INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881');
--Testcase 190:
INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119');
--Testcase 191:
INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715');
--Testcase 192:
INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637');
--Testcase 193:
INSERT INTO num_exp_add VALUES (4,8,'7874342.4119');
--Testcase 194:
INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119');
--Testcase 195:
INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839');
--Testcase 196:
INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143');
--Testcase 197:
INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420');
--Testcase 198:
INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420');
--Testcase 199:
INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980');
--Testcase 200:
INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409');
--Testcase 201:
INSERT INTO num_exp_add VALUES (5,0,'16397.038491');
--Testcase 202:
INSERT INTO num_exp_sub VALUES (5,0,'16397.038491');
--Testcase 203:
INSERT INTO num_exp_mul VALUES (5,0,'0');
--Testcase 204:
INSERT INTO num_exp_div VALUES (5,0,'NaN');
--Testcase 205:
INSERT INTO num_exp_add VALUES (5,1,'16397.038491');
--Testcase 206:
INSERT INTO num_exp_sub VALUES (5,1,'16397.038491');
--Testcase 207:
INSERT INTO num_exp_mul VALUES (5,1,'0');
--Testcase 208:
INSERT INTO num_exp_div VALUES (5,1,'NaN');
--Testcase 209:
INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047');
--Testcase 210:
INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047');
--Testcase 211:
INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077');
--Testcase 212:
INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446');
--Testcase 213:
INSERT INTO num_exp_add VALUES (5,3,'16401.348491');
--Testcase 214:
INSERT INTO num_exp_sub VALUES (5,3,'16392.728491');
--Testcase 215:
INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621');
--Testcase 216:
INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584');
--Testcase 217:
INSERT INTO num_exp_add VALUES (5,4,'7815858.450391');
--Testcase 218:
INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409');
--Testcase 219:
INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429');
--Testcase 220:
INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192');
--Testcase 221:
INSERT INTO num_exp_add VALUES (5,5,'32794.076982');
--Testcase 222:
INSERT INTO num_exp_sub VALUES (5,5,'0');
--Testcase 223:
INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081');
--Testcase 224:
INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000');
--Testcase 225:
INSERT INTO num_exp_add VALUES (5,6,'110298.61612126');
--Testcase 226:
INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926');
--Testcase 227:
INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766');
--Testcase 228:
INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689');
--Testcase 229:
INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509');
--Testcase 230:
INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491');
--Testcase 231:
INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135');
--Testcase 232:
INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710');
--Testcase 233:
INSERT INTO num_exp_add VALUES (5,8,'91278.038491');
--Testcase 234:
INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509');
--Testcase 235:
INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571');
--Testcase 236:
INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228');
--Testcase 237:
INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420');
--Testcase 238:
INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420');
--Testcase 239:
INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220');
--Testcase 240:
INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427');
--Testcase 241:
INSERT INTO num_exp_add VALUES (6,0,'93901.57763026');
--Testcase 242:
INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026');
--Testcase 243:
INSERT INTO num_exp_mul VALUES (6,0,'0');
--Testcase 244:
INSERT INTO num_exp_div VALUES (6,0,'NaN');
--Testcase 245:
INSERT INTO num_exp_add VALUES (6,1,'93901.57763026');
--Testcase 246:
INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026');
--Testcase 247:
INSERT INTO num_exp_mul VALUES (6,1,'0');
--Testcase 248:
INSERT INTO num_exp_div VALUES (6,1,'NaN');
--Testcase 249:
INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787');
--Testcase 250:
INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307');
--Testcase 251:
INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222');
--Testcase 252:
INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823');
--Testcase 253:
INSERT INTO num_exp_add VALUES (6,3,'93905.88763026');
--Testcase 254:
INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026');
--Testcase 255:
INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206');
--Testcase 256:
INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907');
--Testcase 257:
INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026');
--Testcase 258:
INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974');
--Testcase 259:
INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094');
--Testcase 260:
INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469');
--Testcase 261:
INSERT INTO num_exp_add VALUES (6,5,'110298.61612126');
--Testcase 262:
INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926');
--Testcase 263:
INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766');
--Testcase 264:
INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679');
--Testcase 265:
INSERT INTO num_exp_add VALUES (6,6,'187803.15526052');
--Testcase 266:
INSERT INTO num_exp_sub VALUES (6,6,'0');
--Testcase 267:
INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676');
--Testcase 268:
INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000');
--Testcase 269:
INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974');
--Testcase 270:
INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026');
--Testcase 271:
INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610');
--Testcase 272:
INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980');
--Testcase 273:
INSERT INTO num_exp_add VALUES (6,8,'168782.57763026');
--Testcase 274:
INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026');
--Testcase 275:
INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906');
--Testcase 276:
INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184');
--Testcase 277:
INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160');
--Testcase 278:
INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680');
--Testcase 279:
INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920');
--Testcase 280:
INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789');
--Testcase 281:
INSERT INTO num_exp_add VALUES (7,0,'-83028485');
--Testcase 282:
INSERT INTO num_exp_sub VALUES (7,0,'-83028485');
--Testcase 283:
INSERT INTO num_exp_mul VALUES (7,0,'0');
--Testcase 284:
INSERT INTO num_exp_div VALUES (7,0,'NaN');
--Testcase 285:
INSERT INTO num_exp_add VALUES (7,1,'-83028485');
--Testcase 286:
INSERT INTO num_exp_sub VALUES (7,1,'-83028485');
--Testcase 287:
INSERT INTO num_exp_mul VALUES (7,1,'0');
--Testcase 288:
INSERT INTO num_exp_div VALUES (7,1,'NaN');
--Testcase 289:
INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047');
--Testcase 290:
INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953');
--Testcase 291:
INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795');
--Testcase 292:
INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700');
--Testcase 293:
INSERT INTO num_exp_add VALUES (7,3,'-83028480.69');
--Testcase 294:
INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31');
--Testcase 295:
INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35');
--Testcase 296:
INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974');
--Testcase 297:
INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881');
--Testcase 298:
INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119');
--Testcase 299:
INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715');
--Testcase 300:
INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686');
--Testcase 301:
INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509');
--Testcase 302:
INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491');
--Testcase 303:
INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135');
--Testcase 304:
INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574');
--Testcase 305:
INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974');
--Testcase 306:
INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026');
--Testcase 307:
INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610');
--Testcase 308:
INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294');
--Testcase 309:
INSERT INTO num_exp_add VALUES (7,7,'-166056970');
--Testcase 310:
INSERT INTO num_exp_sub VALUES (7,7,'0');
--Testcase 311:
INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225');
--Testcase 312:
INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000');
--Testcase 313:
INSERT INTO num_exp_add VALUES (7,8,'-82953604');
--Testcase 314:
INSERT INTO num_exp_sub VALUES (7,8,'-83103366');
--Testcase 315:
INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285');
--Testcase 316:
INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118');
--Testcase 317:
INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420');
--Testcase 318:
INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580');
--Testcase 319:
INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700');
--Testcase 320:
INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382');
--Testcase 321:
INSERT INTO num_exp_add VALUES (8,0,'74881');
--Testcase 322:
INSERT INTO num_exp_sub VALUES (8,0,'74881');
--Testcase 323:
INSERT INTO num_exp_mul VALUES (8,0,'0');
--Testcase 324:
INSERT INTO num_exp_div VALUES (8,0,'NaN');
--Testcase 325:
INSERT INTO num_exp_add VALUES (8,1,'74881');
--Testcase 326:
INSERT INTO num_exp_sub VALUES (8,1,'74881');
--Testcase 327:
INSERT INTO num_exp_mul VALUES (8,1,'0');
--Testcase 328:
INSERT INTO num_exp_div VALUES (8,1,'NaN');
--Testcase 329:
INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047');
--Testcase 330:
INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047');
--Testcase 331:
INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407');
--Testcase 332:
INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615');
--Testcase 333:
INSERT INTO num_exp_add VALUES (8,3,'74885.31');
--Testcase 334:
INSERT INTO num_exp_sub VALUES (8,3,'74876.69');
--Testcase 335:
INSERT INTO num_exp_mul VALUES (8,3,'322737.11');
--Testcase 336:
INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410');
--Testcase 337:
INSERT INTO num_exp_add VALUES (8,4,'7874342.4119');
--Testcase 338:
INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119');
--Testcase 339:
INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839');
--Testcase 340:
INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956');
--Testcase 341:
INSERT INTO num_exp_add VALUES (8,5,'91278.038491');
--Testcase 342:
INSERT INTO num_exp_sub VALUES (8,5,'58483.961509');
--Testcase 343:
INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571');
--Testcase 344:
INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456');
--Testcase 345:
INSERT INTO num_exp_add VALUES (8,6,'168782.57763026');
--Testcase 346:
INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026');
--Testcase 347:
INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906');
--Testcase 348:
INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424');
--Testcase 349:
INSERT INTO num_exp_add VALUES (8,7,'-82953604');
--Testcase 350:
INSERT INTO num_exp_sub VALUES (8,7,'83103366');
--Testcase 351:
INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285');
--Testcase 352:
INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172');
--Testcase 353:
INSERT INTO num_exp_add VALUES (8,8,'149762');
--Testcase 354:
INSERT INTO num_exp_sub VALUES (8,8,'0');
--Testcase 355:
INSERT INTO num_exp_mul VALUES (8,8,'5607164161');
--Testcase 356:
INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000');
--Testcase 357:
INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420');
--Testcase 358:
INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420');
--Testcase 359:
INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020');
--Testcase 360:
INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735');
--Testcase 361:
INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420');
--Testcase 362:
INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420');
--Testcase 363:
INSERT INTO num_exp_mul VALUES (9,0,'0');
--Testcase 364:
INSERT INTO num_exp_div VALUES (9,0,'NaN');
--Testcase 365:
INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420');
--Testcase 366:
INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420');
--Testcase 367:
INSERT INTO num_exp_mul VALUES (9,1,'0');
--Testcase 368:
INSERT INTO num_exp_div VALUES (9,1,'NaN');
--Testcase 369:
INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467');
--Testcase 370:
INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627');
--Testcase 371:
INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740');
--Testcase 372:
INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526');
--Testcase 373:
INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420');
--Testcase 374:
INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420');
--Testcase 375:
INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020');
--Testcase 376:
INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677');
--Testcase 377:
INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420');
--Testcase 378:
INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420');
--Testcase 379:
INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980');
--Testcase 380:
INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484');
--Testcase 381:
INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420');
--Testcase 382:
INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420');
--Testcase 383:
INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220');
--Testcase 384:
INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807');
--Testcase 385:
INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160');
--Testcase 386:
INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680');
--Testcase 387:
INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920');
--Testcase 388:
INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280');
--Testcase 389:
INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420');
--Testcase 390:
INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580');
--Testcase 391:
INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700');
--Testcase 392:
INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689');
--Testcase 393:
INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420');
--Testcase 394:
INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420');
--Testcase 395:
INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020');
--Testcase 396:
INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748');
--Testcase 397:
INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840');
--Testcase 398:
INSERT INTO num_exp_sub VALUES (9,9,'0');
--Testcase 399:
INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400');
--Testcase 400:
INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 401:
INSERT INTO num_exp_sqrt VALUES (0,'0');
--Testcase 402:
INSERT INTO num_exp_sqrt VALUES (1,'0');
--Testcase 403:
INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505');
--Testcase 404:
INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396');
--Testcase 405:
INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923');
--Testcase 406:
INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473');
--Testcase 407:
INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406');
--Testcase 408:
INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230');
--Testcase 409:
INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542');
--Testcase 410:
INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 411:
INSERT INTO num_exp_ln VALUES (0,'NaN');
--Testcase 412:
INSERT INTO num_exp_ln VALUES (1,'NaN');
--Testcase 413:
INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514');
--Testcase 414:
INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971');
--Testcase 415:
INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464');
--Testcase 416:
INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038');
--Testcase 417:
INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127');
--Testcase 418:
INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991');
--Testcase 419:
INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668');
--Testcase 420:
INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 421:
INSERT INTO num_exp_log10 VALUES (0,'NaN');
--Testcase 422:
INSERT INTO num_exp_log10 VALUES (1,'NaN');
--Testcase 423:
INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459');
--Testcase 424:
INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075');
--Testcase 425:
INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345');
--Testcase 426:
INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626');
--Testcase 427:
INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671');
--Testcase 428:
INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914');
--Testcase 429:
INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138');
--Testcase 430:
INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 431:
INSERT INTO num_exp_power_10_ln VALUES (0,'NaN');
--Testcase 432:
INSERT INTO num_exp_power_10_ln VALUES (1,'NaN');
--Testcase 433:
INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184');
--Testcase 434:
INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393');
--Testcase 435:
INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636');
--Testcase 436:
INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098');
--Testcase 437:
INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067');
--Testcase 438:
INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627');
--Testcase 439:
INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952');
--Testcase 440:
INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 441:
INSERT INTO num_data VALUES (0, '0');
--Testcase 442:
INSERT INTO num_data VALUES (1, '0');
--Testcase 443:
INSERT INTO num_data VALUES (2, '-34338492.215397047');
--Testcase 444:
INSERT INTO num_data VALUES (3, '4.31');
--Testcase 445:
INSERT INTO num_data VALUES (4, '7799461.4119');
--Testcase 446:
INSERT INTO num_data VALUES (5, '16397.038491');
--Testcase 447:
INSERT INTO num_data VALUES (6, '93901.57763026');
--Testcase 448:
INSERT INTO num_data VALUES (7, '-83028485');
--Testcase 449:
INSERT INTO num_data VALUES (8, '74881');
--Testcase 450:
INSERT INTO num_data VALUES (9, '-24926804.045047420');
COMMIT TRANSACTION;
-- ******************************
-- * Create indices for faster checks
-- ******************************
-- Skip these setting, creating foreign table with primary key already covered.
--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
-- ******************************
--Testcase 451:
DELETE FROM num_result;
--Testcase 452:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val
FROM num_data t1, num_data t2;
--Testcase 453:
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;
--Testcase 454:
DELETE FROM num_result;
--Testcase 455:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10)
FROM num_data t1, num_data t2;
--Testcase 456:
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
-- ******************************
--Testcase 457:
DELETE FROM num_result;
--Testcase 458:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val
FROM num_data t1, num_data t2;
--Testcase 459:
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;
--Testcase 460:
DELETE FROM num_result;
--Testcase 461:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40)
FROM num_data t1, num_data t2;
--Testcase 462:
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
-- ******************************
--Testcase 463:
DELETE FROM num_result;
--Testcase 464:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val
FROM num_data t1, num_data t2;
--Testcase 465:
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;
--Testcase 466:
DELETE FROM num_result;
--Testcase 467:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30)
FROM num_data t1, num_data t2;
--Testcase 468:
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
-- ******************************
--Testcase 469:
DELETE FROM num_result;
--Testcase 470:
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';
--Testcase 471:
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;
--Testcase 472:
DELETE FROM num_result;
--Testcase 473:
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';
--Testcase 474:
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
-- ******************************
--Testcase 475:
DELETE FROM num_result;
--Testcase 476:
INSERT INTO num_result SELECT id, 0, SQRT(ABS(val))
FROM num_data;
--Testcase 477:
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
-- ******************************
--Testcase 478:
DELETE FROM num_result;
--Testcase 479:
INSERT INTO num_result SELECT id, 0, LN(ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 480:
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
-- ******************************
--Testcase 481:
DELETE FROM num_result;
--Testcase 482:
INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 483:
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
-- ******************************
--Testcase 484:
DELETE FROM num_result;
--Testcase 485:
INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
FROM num_data
WHERE val != '0.0';
--Testcase 486:
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;
-- ******************************
-- * miscellaneous checks for things that have been broken in the past...
-- ******************************
-- numeric AVG used to fail on some platforms
--Testcase 487:
SELECT AVG(val) FROM num_data;
--Testcase 488:
SELECT STDDEV(val) FROM num_data;
--Testcase 489:
SELECT VARIANCE(val) FROM num_data;
-- Check for appropriate rounding and overflow
--Testcase 579:
CREATE FOREIGN TABLE fract_only (id int, val numeric(4,4)) SERVER sqlite_svr;
--Testcase 490:
INSERT INTO fract_only VALUES (1, '0.0');
--Testcase 491:
INSERT INTO fract_only VALUES (2, '0.1');
--Testcase 492:
INSERT INTO fract_only VALUES (3, '1.0'); -- should fail
--Testcase 493:
INSERT INTO fract_only VALUES (4, '-0.9999');
--Testcase 494:
INSERT INTO fract_only VALUES (5, '0.99994');
--Testcase 495:
INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail
--Testcase 496:
INSERT INTO fract_only VALUES (7, '0.00001');
--Testcase 497:
INSERT INTO fract_only VALUES (8, '0.00017');
--Testcase 498:
SELECT * FROM fract_only;
--Testcase 580:
DROP FOREIGN TABLE fract_only;
-- Check inf/nan conversion behavior
--Testcase 581:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 582:
DELETE FROM FLOAT8_TMP;
--Testcase 583:
INSERT INTO FLOAT8_TMP VALUES ('NaN');
--Testcase 584:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 585:
DELETE FROM FLOAT8_TMP;
--Testcase 586:
INSERT INTO FLOAT8_TMP VALUES ('Infinity');
--Testcase 587:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 588:
DELETE FROM FLOAT8_TMP;
--Testcase 589:
INSERT INTO FLOAT8_TMP VALUES ('-Infinity');
--Testcase 590:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 591:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 592:
DELETE FROM FLOAT4_TMP;
--Testcase 593:
INSERT INTO FLOAT4_TMP VALUES ('NaN');
--Testcase 594:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 595:
DELETE FROM FLOAT4_TMP;
--Testcase 596:
INSERT INTO FLOAT4_TMP VALUES ('Infinity');
--Testcase 597:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 598:
DELETE FROM FLOAT4_TMP;
--Testcase 599:
INSERT INTO FLOAT4_TMP VALUES ('-Infinity');
--Testcase 600:
SELECT f1::numeric FROM FLOAT4_TMP;
-- Simple check that ceil(), floor(), and round() work correctly
--Testcase 601:
CREATE FOREIGN TABLE ceil_floor_round (a numeric OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 499:
INSERT INTO ceil_floor_round VALUES ('-5.5');
--Testcase 500:
INSERT INTO ceil_floor_round VALUES ('-5.499999');
--Testcase 501:
INSERT INTO ceil_floor_round VALUES ('9.5');
--Testcase 502:
INSERT INTO ceil_floor_round VALUES ('9.4999999');
--Testcase 503:
INSERT INTO ceil_floor_round VALUES ('0.0');
--Testcase 504:
INSERT INTO ceil_floor_round VALUES ('0.0000001');
--Testcase 505:
INSERT INTO ceil_floor_round VALUES ('-0.000001');
--Testcase 506:
SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round ORDER BY a;
-- Check rounding, it should round ties away from zero.
--Testcase 602:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 603:
DELETE FROM INT4_TMP;
--Testcase 604:
INSERT INTO INT4_TMP SELECT a FROM generate_series(-5,5) a;
--Testcase 605:
SELECT f1 as pow,
round((-2.5 * 10 ^ f1)::numeric, -f1),
round((-1.5 * 10 ^ f1)::numeric, -f1),
round((-0.5 * 10 ^ f1)::numeric, -f1),
round((0.5 * 10 ^ f1)::numeric, -f1),
round((1.5 * 10 ^ f1)::numeric, -f1),
round((2.5 * 10 ^ f1)::numeric, -f1)
FROM INT4_TMP;
-- Testing for width_bucket(). For convenience, we test both the
-- numeric and float8 versions of the function in this file.
-- errors
--Testcase 606:
CREATE FOREIGN TABLE width_bucket_tbl (
id1 numeric,
id2 numeric,
id3 numeric,
id4 int,
id int OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 607:
DELETE FROM width_bucket_tbl;
--Testcase 608:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 609:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 610:
DELETE FROM width_bucket_tbl;
--Testcase 611:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 612:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 613:
DELETE FROM width_bucket_tbl;
--Testcase 614:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 615:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 616:
DELETE FROM width_bucket_tbl;
--Testcase 617:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 618:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 619:
DELETE FROM width_bucket_tbl;
--Testcase 620:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 621:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 622:
DELETE FROM width_bucket_tbl;
--Testcase 623:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 624:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 625:
DELETE FROM width_bucket_tbl;
--Testcase 626:
INSERT INTO width_bucket_tbl VALUES ('NaN'::numeric, 3.0, 4.0, 888);
--Testcase 627:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 628:
DELETE FROM width_bucket_tbl;
--Testcase 629:
INSERT INTO width_bucket_tbl VALUES (0, 'NaN'::numeric, 4.0, 888);
--Testcase 630:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
-- normal operation
--Testcase 631:
CREATE FOREIGN TABLE width_bucket_test (
operand_num numeric OPTIONS (key 'true'),
operand_f8 float8
) SERVER sqlite_svr;
--COPY width_bucket_test (operand_num) FROM stdin;
--Testcase 507:
INSERT INTO width_bucket_test (operand_num) 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);
--Testcase 508:
UPDATE width_bucket_test SET operand_f8 = operand_num::float8;
--Testcase 509:
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;
-- for float8 only, check positive and negative infinity: we require
-- finite bucket bounds, but allow an infinite operand
--Testcase 510:
DELETE FROM width_bucket_tbl;
-- postgres does not support insert 'Infinity' and '-Infinity' as numeric.
--Testcase 632:
INSERT INTO width_bucket_tbl VALUES (0.0, 0.0, 5, 10);
--Testcase 633:
SELECT width_bucket(id1::float8, 'Infinity'::float8, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 511:
DELETE FROM width_bucket_tbl;
--Testcase 634:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, 0.0, 20);
--Testcase 635:
SELECT width_bucket(id1::float8, id2, 'Infinity'::float8, id4) FROM width_bucket_tbl; -- error
--Testcase 512:
DELETE FROM width_bucket_tbl;
--Testcase 636:
INSERT INTO width_bucket_tbl VALUES (0.0, 1, 10, 10);
--Testcase 637:
SELECT width_bucket('Infinity'::float8, id2, id3, id4), width_bucket('-Infinity'::float8, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 638:
DROP FOREIGN TABLE width_bucket_test;
-- TO_CHAR()
--
--Testcase 513:
SELECT '' AS to_char_1, to_char(val, '9G999G999G999G999G999')
FROM num_data;
--Testcase 514:
SELECT '' AS to_char_2, to_char(val, '9G999G999G999G999G999D999G999G999G999G999')
FROM num_data;
--Testcase 515:
SELECT '' AS to_char_3, to_char(val, '9999999999999999.999999999999999PR')
FROM num_data;
--Testcase 516:
SELECT '' AS to_char_4, to_char(val, '9999999999999999.999999999999999S')
FROM num_data;
--Testcase 517:
SELECT '' AS to_char_5, to_char(val, 'MI9999999999999999.999999999999999') FROM num_data;
--Testcase 518:
SELECT '' AS to_char_6, to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data;
--Testcase 519:
SELECT '' AS to_char_7, to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data;
--Testcase 520:
SELECT '' AS to_char_8, to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data;
--Testcase 521:
SELECT '' AS to_char_9, to_char(val, '0999999999999999.999999999999999') FROM num_data;
--Testcase 522:
SELECT '' AS to_char_10, to_char(val, 'S0999999999999999.999999999999999') FROM num_data;
--Testcase 523:
SELECT '' AS to_char_11, to_char(val, 'FM0999999999999999.999999999999999') FROM num_data;
--Testcase 524:
SELECT '' AS to_char_12, to_char(val, 'FM9999999999999999.099999999999999') FROM num_data;
--Testcase 525:
SELECT '' AS to_char_13, to_char(val, 'FM9999999999990999.990999999999999') FROM num_data;
--Testcase 526:
SELECT '' AS to_char_14, to_char(val, 'FM0999999999999999.999909999999999') FROM num_data;
--Testcase 527:
SELECT '' AS to_char_15, to_char(val, 'FM9999999990999999.099999999999999') FROM num_data;
--Testcase 528:
SELECT '' AS to_char_16, to_char(val, 'L9999999999999999.099999999999999') FROM num_data;
--Testcase 529:
SELECT '' AS to_char_17, to_char(val, 'FM9999999999999999.99999999999999') FROM num_data;
--Testcase 530:
SELECT '' AS to_char_18, 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;
--Testcase 531:
SELECT '' AS to_char_19, 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;
--Testcase 532:
SELECT '' AS to_char_20, to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data;
--Testcase 533:
SELECT '' AS to_char_21, to_char(val, '999999SG9999999999') FROM num_data;
--Testcase 534:
SELECT '' AS to_char_22, to_char(val, 'FM9999999999999999.999999999999999') FROM num_data;
--Testcase 535:
SELECT '' AS to_char_23, to_char(val, '9.999EEEE') FROM num_data;
--Testcase 536:
DELETE FROM ceil_floor_round;
--Testcase 537:
INSERT INTO ceil_floor_round VALUES ('100'::numeric);
--Testcase 538:
SELECT '' AS to_char_24, to_char(a, 'FM999.9') FROM ceil_floor_round;
--Testcase 539:
SELECT '' AS to_char_25, to_char(a, 'FM999.') FROM ceil_floor_round;
--Testcase 540:
SELECT '' AS to_char_26, to_char(a, 'FM999') FROM ceil_floor_round;
-- Check parsing of literal text in a format string
--Testcase 541:
SELECT '' AS to_char_27, to_char(a, 'foo999') FROM ceil_floor_round;
--Testcase 542:
SELECT '' AS to_char_28, to_char(a, 'f\oo999') FROM ceil_floor_round;
--Testcase 543:
SELECT '' AS to_char_29, to_char(a, 'f\\oo999') FROM ceil_floor_round;
--Testcase 544:
SELECT '' AS to_char_30, to_char(a, 'f\"oo999') FROM ceil_floor_round;
--Testcase 545:
SELECT '' AS to_char_31, to_char(a, 'f\\"oo999') FROM ceil_floor_round;
--Testcase 546:
SELECT '' AS to_char_32, to_char(a, 'f"ool"999') FROM ceil_floor_round;
--Testcase 547:
SELECT '' AS to_char_33, to_char(a, 'f"\ool"999') FROM ceil_floor_round;
--Testcase 548:
SELECT '' AS to_char_34, to_char(a, 'f"\\ool"999') FROM ceil_floor_round;
--Testcase 549:
SELECT '' AS to_char_35, to_char(a, 'f"ool\"999') FROM ceil_floor_round;
--Testcase 550:
SELECT '' AS to_char_36, to_char(a, 'f"ool\\"999') FROM ceil_floor_round;
-- TO_NUMBER()
--
--Testcase 639:
create foreign table to_number_tbl (a text, id int options (key 'true')) server sqlite_svr;
SET lc_numeric = 'C';
--Testcase 640:
DELETE FROM to_number_tbl;
--Testcase 641:
INSERT INTO to_number_tbl VALUES ('-34,338,492');
--Testcase 642:
SELECT '' AS to_number_1, to_number(a, '99G999G999') FROM to_number_tbl;
--Testcase 643:
DELETE FROM to_number_tbl;
--Testcase 644:
INSERT INTO to_number_tbl VALUES ('-34,338,492.654,878');
--Testcase 645:
SELECT '' AS to_number_2, to_number(a, '99G999G999D999G999') FROM to_number_tbl;
--Testcase 646:
DELETE FROM to_number_tbl;
--Testcase 647:
INSERT INTO to_number_tbl VALUES ('<564646.654564>');
--Testcase 648:
SELECT '' AS to_number_3, to_number(a, '999999.999999PR') FROM to_number_tbl;
--Testcase 649:
DELETE FROM to_number_tbl;
--Testcase 650:
INSERT INTO to_number_tbl VALUES ('0.00001-');
--Testcase 651:
SELECT '' AS to_number_4, to_number(a, '9.999999S') FROM to_number_tbl;
--Testcase 652:
DELETE FROM to_number_tbl;
--Testcase 653:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 654:
SELECT '' AS to_number_5, to_number(a, 'FM9.999999S') FROM to_number_tbl;
--Testcase 655:
DELETE FROM to_number_tbl;
--Testcase 656:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 657:
SELECT '' AS to_number_5, to_number(a, 'FM9.999999MI') FROM to_number_tbl;
--Testcase 658:
DELETE FROM to_number_tbl;
--Testcase 659:
INSERT INTO to_number_tbl VALUES ('5 4 4 4 4 8 . 7 8');
--Testcase 660:
SELECT '' AS to_number_7, to_number(a, '9 9 9 9 9 9 . 9 9') FROM to_number_tbl;
--Testcase 661:
DELETE FROM to_number_tbl;
--Testcase 662:
INSERT INTO to_number_tbl VALUES ('.01');
--Testcase 663:
SELECT '' AS to_number_8, to_number(a, 'FM9.99') FROM to_number_tbl;
--Testcase 664:
DELETE FROM to_number_tbl;
--Testcase 665:
INSERT INTO to_number_tbl VALUES ('.0');
--Testcase 666:
SELECT '' AS to_number_9, to_number(a, '99999999.99999999') FROM to_number_tbl;
--Testcase 667:
DELETE FROM to_number_tbl;
--Testcase 668:
INSERT INTO to_number_tbl VALUES ('0');
--Testcase 669:
SELECT '' AS to_number_10, to_number(a, '99.99') FROM to_number_tbl;
--Testcase 670:
DELETE FROM to_number_tbl;
--Testcase 671:
INSERT INTO to_number_tbl VALUES ('.-01');
--Testcase 672:
SELECT '' AS to_number_11, to_number(a, 'S99.99') FROM to_number_tbl;
--Testcase 673:
DELETE FROM to_number_tbl;
--Testcase 674:
INSERT INTO to_number_tbl VALUES ('.01-');
--Testcase 675:
SELECT '' AS to_number_12, to_number(a, '99.99S') FROM to_number_tbl;
--Testcase 676:
DELETE FROM to_number_tbl;
--Testcase 677:
INSERT INTO to_number_tbl VALUES (' . 0 1-');
--Testcase 678:
SELECT '' AS to_number_13, to_number(a, ' 9 9 . 9 9 S') FROM to_number_tbl;
--Testcase 679:
DELETE FROM to_number_tbl;
--Testcase 680:
INSERT INTO to_number_tbl VALUES ('34,50');
--Testcase 681:
SELECT '' AS to_number_14, to_number(a,'999,99') FROM to_number_tbl;
--Testcase 682:
DELETE FROM to_number_tbl;
--Testcase 683:
INSERT INTO to_number_tbl VALUES ('123,000');
--Testcase 684:
SELECT '' AS to_number_15, to_number(a,'999G') FROM to_number_tbl;
--Testcase 685:
DELETE FROM to_number_tbl;
--Testcase 686:
INSERT INTO to_number_tbl VALUES ('123456');
--Testcase 687:
SELECT '' AS to_number_16, to_number(a,'999G999') FROM to_number_tbl;
--Testcase 688:
DELETE FROM to_number_tbl;
--Testcase 689:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 690:
SELECT '' AS to_number_17, to_number(a,'L9,999.99') FROM to_number_tbl;
--Testcase 691:
DELETE FROM to_number_tbl;
--Testcase 692:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 693:
SELECT '' AS to_number_18, to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 694:
DELETE FROM to_number_tbl;
--Testcase 695:
INSERT INTO to_number_tbl VALUES ('$1,234.56');
--Testcase 696:
SELECT '' AS to_number_19, to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 697:
DELETE FROM to_number_tbl;
--Testcase 698:
INSERT INTO to_number_tbl VALUES ('1234.56');
--Testcase 699:
SELECT '' AS to_number_20, to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 700:
DELETE FROM to_number_tbl;
--Testcase 701:
INSERT INTO to_number_tbl VALUES ('1,234.56');
--Testcase 702:
SELECT '' AS to_number_21, to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 703:
DELETE FROM to_number_tbl;
--Testcase 704:
INSERT INTO to_number_tbl VALUES ('42nd');
--Testcase 705:
SELECT '' AS to_number_22, to_number(a, '99th') FROM to_number_tbl;
RESET lc_numeric;
--
-- Input syntax
--
--Testcase 706:
CREATE FOREIGN TABLE num_input_test (n1 numeric) SERVER sqlite_svr;
-- good inputs
--Testcase 551:
INSERT INTO num_input_test(n1) VALUES (' 123');
--Testcase 552:
INSERT INTO num_input_test(n1) VALUES (' 3245874 ');
--Testcase 553:
INSERT INTO num_input_test(n1) VALUES (' -93853');
--Testcase 554:
INSERT INTO num_input_test(n1) VALUES ('555.50');
--Testcase 555:
INSERT INTO num_input_test(n1) VALUES ('-555.50');
--Testcase 556:
INSERT INTO num_input_test(n1) VALUES ('NaN ');
--Testcase 557:
INSERT INTO num_input_test(n1) VALUES (' nan');
-- bad inputs
--Testcase 558:
INSERT INTO num_input_test(n1) VALUES (' ');
--Testcase 559:
INSERT INTO num_input_test(n1) VALUES (' 1234 %');
--Testcase 560:
INSERT INTO num_input_test(n1) VALUES ('xyz');
--Testcase 561:
INSERT INTO num_input_test(n1) VALUES ('- 1234');
--Testcase 562:
INSERT INTO num_input_test(n1) VALUES ('5 . 0');
--Testcase 563:
INSERT INTO num_input_test(n1) VALUES ('5. 0 ');
--Testcase 564:
INSERT INTO num_input_test(n1) VALUES ('');
--Testcase 565:
INSERT INTO num_input_test(n1) VALUES (' N aN ');
--Testcase 566:
SELECT * FROM num_input_test;
--
-- Test some corner cases for multiplication
--
--Testcase 707:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 708:
INSERT INTO num_tmp VALUES (4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 709:
SELECT n1 * n2 FROM num_tmp;
--Testcase 710:
DELETE FROM num_tmp;
--Testcase 711:
INSERT INTO num_tmp VALUES (4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 712:
SELECT n1 * n2 FROM num_tmp;
--Testcase 713:
DELETE FROM num_tmp;
--Testcase 714:
INSERT INTO num_tmp VALUES (4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 715:
SELECT n1 * n2 FROM num_tmp;
--Testcase 716:
DELETE FROM num_tmp;
--Testcase 717:
INSERT INTO num_tmp VALUES (4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 718:
SELECT n1 * n2 FROM num_tmp;
--
-- Test some corner cases for division
--
--Testcase 719:
DELETE FROM num_tmp;
--Testcase 720:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 721:
SELECT n1::numeric / n2 FROM num_tmp;
--Testcase 722:
DELETE FROM num_tmp;
--Testcase 723:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 724:
SELECT div(n1::numeric, n2) FROM num_tmp;
--Testcase 725:
SELECT mod(n1::numeric, n2) FROM num_tmp;
--Testcase 726:
SELECT div(-n1::numeric, n2) FROM num_tmp;
--Testcase 727:
SELECT mod(-n1::numeric, n2) FROM num_tmp;
--Testcase 728:
select div(-n1::numeric,n2)*n2 + mod(-n1::numeric,n2) FROM num_tmp;
--Testcase 729:
DELETE FROM num_tmp;
--Testcase 730:
INSERT INTO num_tmp VALUES (70.0,70);
--Testcase 731:
select mod (n1, n2) FROM num_tmp;
--Testcase 732:
select div (n1, n2) FROM num_tmp;
--Testcase 733:
select n1 / n2 FROM num_tmp;
--Testcase 734:
DELETE FROM num_tmp;
--Testcase 735:
INSERT INTO num_tmp VALUES (12345678901234567890, 123);
--Testcase 736:
select n1 % n2 FROM num_tmp;
--Testcase 737:
select n1 / n2 FROM num_tmp;
--Testcase 738:
select div(n1, n2) FROM num_tmp;
--Testcase 739:
select div(n1, n2) * n2 + n1 % n2 FROM num_tmp;
--
-- Test some corner cases for square root
--
--Testcase 740:
DELETE FROM num_tmp;
--Testcase 741:
INSERT INTO num_tmp VALUES (1.000000000000003::numeric);
--Testcase 742:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 743:
DELETE FROM num_tmp;
--Testcase 744:
INSERT INTO num_tmp VALUES (1.000000000000004::numeric);
--Testcase 745:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 746:
DELETE FROM num_tmp;
--Testcase 747:
INSERT INTO num_tmp VALUES (96627521408608.56340355805::numeric);
--Testcase 748:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 749:
DELETE FROM num_tmp;
--Testcase 750:
INSERT INTO num_tmp VALUES (96627521408608.56340355806::numeric);
--Testcase 751:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 752:
DELETE FROM num_tmp;
--Testcase 753:
INSERT INTO num_tmp VALUES (515549506212297735.073688290367::numeric);
--Testcase 754:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 755:
DELETE FROM num_tmp;
--Testcase 756:
INSERT INTO num_tmp VALUES (515549506212297735.073688290368::numeric);
--Testcase 757:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 758:
DELETE FROM num_tmp;
--Testcase 759:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900306::numeric);
--Testcase 760:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 761:
DELETE FROM num_tmp;
--Testcase 762:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900307::numeric);
--Testcase 763:
SELECT sqrt(n1) FROM num_tmp;
--
-- Test code path for raising to integer powers
--
--Testcase 764:
DELETE FROM num_tmp;
--Testcase 765:
INSERT INTO num_tmp VALUES (10.0, -2147483648);
--Testcase 766:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 767:
DELETE FROM num_tmp;
--Testcase 768:
INSERT INTO num_tmp VALUES (10.0, -2147483647);
--Testcase 769:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 770:
DELETE FROM num_tmp;
--Testcase 771:
INSERT INTO num_tmp VALUES (10.0, 2147483647);
--Testcase 772:
SELECT n1 ^ n2 as overflows FROM num_tmp;
--Testcase 773:
DELETE FROM num_tmp;
--Testcase 774:
INSERT INTO num_tmp VALUES (117743296169.0, -1000000000);
--Testcase 775:
SELECT n1 ^ n2 as overflows FROM num_tmp;
-- cases that used to return inaccurate results
--Testcase 776:
DELETE FROM num_tmp;
--Testcase 777:
INSERT INTO num_tmp VALUES (3.789, 21);
--Testcase 778:
select n1 ^ n2 FROM num_tmp;
--Testcase 779:
DELETE FROM num_tmp;
--Testcase 780:
INSERT INTO num_tmp VALUES (3.789, 35);
--Testcase 781:
select n1 ^ n2 FROM num_tmp;
--Testcase 782:
DELETE FROM num_tmp;
--Testcase 783:
INSERT INTO num_tmp VALUES (1.2, 345);
--Testcase 784:
select n1 ^ n2 FROM num_tmp;
--Testcase 785:
DELETE FROM num_tmp;
--Testcase 786:
INSERT INTO num_tmp VALUES (0.12, (-20));
--Testcase 787:
select n1 ^ n2 FROM num_tmp;
-- cases that used to error out
--Testcase 788:
DELETE FROM num_tmp;
--Testcase 789:
INSERT INTO num_tmp VALUES (0.12, (-25));
--Testcase 790:
select n1 ^ n2 FROM num_tmp;
--Testcase 791:
DELETE FROM num_tmp;
--Testcase 792:
INSERT INTO num_tmp VALUES (0.5678, (-85));
--Testcase 793:
select n1 ^ n2 FROM num_tmp;
--
-- Tests for raising to non-integer powers
--
-- special cases
--Testcase 794:
DELETE FROM num_tmp;
--Testcase 795:
INSERT INTO num_tmp VALUES (0.0, 0.0);
--Testcase 796:
select n1 ^ n2 FROM num_tmp;
--Testcase 797:
DELETE FROM num_tmp;
--Testcase 798:
INSERT INTO num_tmp VALUES ((-12.34), 0.0);
--Testcase 799:
select n1 ^ n2 FROM num_tmp;
--Testcase 800:
DELETE FROM num_tmp;
--Testcase 801:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 802:
select n1 ^ n2 FROM num_tmp;
--Testcase 803:
DELETE FROM num_tmp;
--Testcase 804:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 805:
select n1 ^ n2 FROM num_tmp;
-- NaNs
--Testcase 806:
DELETE FROM num_tmp;
--Testcase 807:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 'NaN'::numeric);
--Testcase 808:
select n1 ^ n2 FROM num_tmp;
--Testcase 809:
DELETE FROM num_tmp;
--Testcase 810:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 0);
--Testcase 811:
select n1 ^ n2 FROM num_tmp;
--Testcase 812:
DELETE FROM num_tmp;
--Testcase 813:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 1);
--Testcase 814:
select n1 ^ n2 FROM num_tmp;
--Testcase 815:
DELETE FROM num_tmp;
--Testcase 816:
INSERT INTO num_tmp VALUES (0, 'NaN'::numeric);
--Testcase 817:
select n1 ^ n2 FROM num_tmp;
--Testcase 818:
DELETE FROM num_tmp;
--Testcase 819:
INSERT INTO num_tmp VALUES (1, 'NaN'::numeric);
--Testcase 820:
select n1 ^ n2 FROM num_tmp;
-- invalid inputs
--Testcase 821:
DELETE FROM num_tmp;
--Testcase 822:
INSERT INTO num_tmp VALUES (0.0, (-12.34));
--Testcase 823:
select n1 ^ n2 FROM num_tmp;
--Testcase 824:
DELETE FROM num_tmp;
--Testcase 825:
INSERT INTO num_tmp VALUES ((-12.34), 1.2);
--Testcase 826:
select n1 ^ n2 FROM num_tmp;
-- cases that used to generate inaccurate results
--Testcase 827:
DELETE FROM num_tmp;
--Testcase 828:
INSERT INTO num_tmp VALUES (32.1, 9.8);
--Testcase 829:
select n1 ^ n2 FROM num_tmp;
--Testcase 830:
DELETE FROM num_tmp;
--Testcase 831:
INSERT INTO num_tmp VALUES (32.1, (-9.8));
--Testcase 832:
select n1 ^ n2 FROM num_tmp;
--Testcase 833:
DELETE FROM num_tmp;
--Testcase 834:
INSERT INTO num_tmp VALUES (12.3, 45.6);
--Testcase 835:
select n1 ^ n2 FROM num_tmp;
--Testcase 836:
DELETE FROM num_tmp;
--Testcase 837:
INSERT INTO num_tmp VALUES (12.3, (-45.6));
--Testcase 838:
select n1 ^ n2 FROM num_tmp;
-- big test
--Testcase 839:
DELETE FROM num_tmp;
--Testcase 840:
INSERT INTO num_tmp VALUES (1.234, 5678);
--Testcase 841:
select n1 ^ n2 FROM num_tmp;
--
-- Tests for EXP()
--
-- special cases
--Testcase 842:
DELETE FROM num_tmp;
--Testcase 843:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 844:
select exp(n1) from num_tmp;
--Testcase 845:
DELETE FROM num_tmp;
--Testcase 846:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 847:
select exp(n1) from num_tmp;
--Testcase 848:
DELETE FROM num_tmp;
--Testcase 849:
INSERT INTO num_tmp VALUES (1.0::numeric(71,70));
--Testcase 850:
select exp(n1) from num_tmp;
-- cases that used to generate inaccurate results
--Testcase 851:
DELETE FROM num_tmp;
--Testcase 852:
INSERT INTO num_tmp VALUES (32.999);
--Testcase 853:
select exp(n1) from num_tmp;
--Testcase 854:
DELETE FROM num_tmp;
--Testcase 855:
INSERT INTO num_tmp VALUES (-32.999);
--Testcase 856:
select exp(n1) from num_tmp;
--Testcase 857:
DELETE FROM num_tmp;
--Testcase 858:
INSERT INTO num_tmp VALUES (123.456);
--Testcase 859:
select exp(n1) from num_tmp;
--Testcase 860:
DELETE FROM num_tmp;
--Testcase 861:
INSERT INTO num_tmp VALUES (-123.456);
--Testcase 862:
select exp(n1) from num_tmp;
-- big test
--Testcase 863:
DELETE FROM num_tmp;
--Testcase 864:
INSERT INTO num_tmp VALUES (1234.5678);
--Testcase 865:
select exp(n1) from num_tmp;
--
-- Tests for generate_series
--
--Testcase 866:
DELETE FROM num_tmp;
--Testcase 867:
INSERT INTO num_tmp select * from generate_series(0.0::numeric, 4.0::numeric);
--Testcase 868:
SELECT n1 FROM num_tmp;
--Testcase 869:
DELETE FROM num_tmp;
--Testcase 870:
INSERT INTO num_tmp select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric);
--Testcase 871:
SELECT n1 FROM num_tmp;
--Testcase 872:
DELETE FROM num_tmp;
--Testcase 873:
INSERT INTO num_tmp select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric);
--Testcase 874:
SELECT n1 FROM num_tmp;
-- Trigger errors
--Testcase 875:
DELETE FROM num_tmp;
--Testcase 876:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 0::numeric);
--Testcase 877:
SELECT n1 FROM num_tmp;
--Testcase 878:
DELETE FROM num_tmp;
--Testcase 879:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric);
--Testcase 880:
SELECT n1 FROM num_tmp;
--Testcase 881:
DELETE FROM num_tmp;
--Testcase 882:
INSERT INTO num_tmp select * from generate_series('nan'::numeric, 100::numeric, 10::numeric);
--Testcase 883:
SELECT n1 FROM num_tmp;
--Testcase 884:
DELETE FROM num_tmp;
--Testcase 885:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric);
--Testcase 886:
SELECT n2 FROM num_tmp;
-- Checks maximum, output is truncated
--Testcase 887:
DELETE FROM num_tmp;
--Testcase 888:
INSERT INTO num_tmp select (i / (10::numeric ^ 131071))::numeric(1,0)
from generate_series(6 * (10::numeric ^ 131071),
9 * (10::numeric ^ 131071),
10::numeric ^ 131071) i;
--Testcase 889:
SELECT n1 FROM num_tmp;
-- Check usage with variables
--Testcase 890:
DELETE FROM num_tmp;
--Testcase 891:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
--Testcase 892:
SELECT n1, n2 FROM num_tmp;
--Testcase 893:
DELETE FROM num_tmp;
--Testcase 894:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
--Testcase 895:
SELECT n1, n2 FROM num_tmp;
--Testcase 896:
DELETE FROM num_tmp;
--Testcase 897:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
--Testcase 898:
SELECT n1, n2 FROM num_tmp;
--
-- Tests for LN()
--
-- Invalid inputs
--Testcase 899:
DELETE FROM num_tmp;
--Testcase 900:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 901:
select ln(n1) from num_tmp;
--Testcase 902:
DELETE FROM num_tmp;
--Testcase 903:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 904:
select ln(n1) from num_tmp;
-- Some random tests
--Testcase 905:
DELETE FROM num_tmp;
--Testcase 906:
INSERT INTO num_tmp VALUES (1.2345678e-28);
--Testcase 907:
select ln(n1) from num_tmp;
--Testcase 908:
DELETE FROM num_tmp;
--Testcase 909:
INSERT INTO num_tmp VALUES (0.0456789);
--Testcase 910:
select ln(n1) from num_tmp;
--Testcase 911:
DELETE FROM num_tmp;
--Testcase 912:
INSERT INTO num_tmp VALUES (0.349873948359354029493948309745709580730482050975);
--Testcase 913:
select ln(n1) from num_tmp;
--Testcase 914:
DELETE FROM num_tmp;
--Testcase 915:
INSERT INTO num_tmp VALUES (0.99949452);
--Testcase 916:
select ln(n1) from num_tmp;
--Testcase 917:
DELETE FROM num_tmp;
--Testcase 918:
INSERT INTO num_tmp VALUES (1.00049687395);
--Testcase 919:
select ln(n1) from num_tmp;
--Testcase 920:
DELETE FROM num_tmp;
--Testcase 921:
INSERT INTO num_tmp VALUES (1234.567890123456789);
--Testcase 922:
select ln(n1) from num_tmp;
--Testcase 923:
DELETE FROM num_tmp;
--Testcase 924:
INSERT INTO num_tmp VALUES (5.80397490724e5);
--Testcase 925:
select ln(n1) from num_tmp;
--Testcase 926:
DELETE FROM num_tmp;
--Testcase 927:
INSERT INTO num_tmp VALUES (9.342536355e34);
--Testcase 928:
select ln(n1) from num_tmp;
--
-- Tests for LOG() (base 10)
--
-- invalid inputs
--Testcase 929:
DELETE FROM num_tmp;
--Testcase 930:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 931:
select log(n1) from num_tmp;
--Testcase 932:
DELETE FROM num_tmp;
--Testcase 933:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 934:
select log(n1) from num_tmp;
-- some random tests
--Testcase 935:
DELETE FROM num_tmp;
--Testcase 936:
INSERT INTO num_tmp VALUES (1.234567e-89);
--Testcase 937:
select log(n1) from num_tmp;
--Testcase 938:
DELETE FROM num_tmp;
--Testcase 939:
INSERT INTO num_tmp VALUES (3.4634998359873254962349856073435545);
--Testcase 940:
select log(n1) from num_tmp;
--Testcase 941:
DELETE FROM num_tmp;
--Testcase 942:
INSERT INTO num_tmp VALUES (9.999999999999999999);
--Testcase 943:
select log(n1) from num_tmp;
--Testcase 944:
DELETE FROM num_tmp;
--Testcase 945:
INSERT INTO num_tmp VALUES (10.00000000000000000);
--Testcase 946:
select log(n1) from num_tmp;
--Testcase 947:
DELETE FROM num_tmp;
--Testcase 948:
INSERT INTO num_tmp VALUES (10.00000000000000001);
--Testcase 949:
select log(n1) from num_tmp;
--Testcase 950:
DELETE FROM num_tmp;
--Testcase 951:
INSERT INTO num_tmp VALUES (590489.45235237);
--Testcase 952:
select log(n1) from num_tmp;
--
-- Tests for LOG() (arbitrary base)
--
-- invalid inputs
--Testcase 953:
DELETE FROM num_tmp;
--Testcase 954:
INSERT INTO num_tmp VALUES (-12.34, 56.78);
--Testcase 955:
select log(n1, n2) from num_tmp;
--Testcase 956:
DELETE FROM num_tmp;
--Testcase 957:
INSERT INTO num_tmp VALUES (-12.34, -56.78);
--Testcase 958:
select log(n1, n2) from num_tmp;
--Testcase 959:
DELETE FROM num_tmp;
--Testcase 960:
INSERT INTO num_tmp VALUES (12.34, -56.78);
--Testcase 961:
select log(n1, n2) from num_tmp;
--Testcase 962:
DELETE FROM num_tmp;
--Testcase 963:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 964:
select log(n1, n2) from num_tmp;
--Testcase 965:
DELETE FROM num_tmp;
--Testcase 966:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 967:
select log(n1, n2) from num_tmp;
--Testcase 968:
DELETE FROM num_tmp;
--Testcase 969:
INSERT INTO num_tmp VALUES (.0, 12.34);
--Testcase 970:
select log(n1, n2) from num_tmp;
-- some random tests
--Testcase 971:
DELETE FROM num_tmp;
--Testcase 972:
INSERT INTO num_tmp VALUES (1.23e-89, 6.4689e45);
--Testcase 973:
select log(n1, n2) from num_tmp;
--Testcase 974:
DELETE FROM num_tmp;
--Testcase 975:
INSERT INTO num_tmp VALUES (0.99923, 4.58934e34);
--Testcase 976:
select log(n1, n2) from num_tmp;
--Testcase 977:
DELETE FROM num_tmp;
--Testcase 978:
INSERT INTO num_tmp VALUES (1.000016, 8.452010e18);
--Testcase 979:
select log(n1, n2) from num_tmp;
--Testcase 980:
DELETE FROM num_tmp;
--Testcase 981:
INSERT INTO num_tmp VALUES (3.1954752e47, 9.4792021e-73);
--Testcase 982:
select log(n1, n2) from num_tmp;
--
-- Tests for scale()
--
--Testcase 983:
DELETE FROM num_tmp;
--Testcase 984:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 985:
select scale(n1) from num_tmp;
--Testcase 986:
DELETE FROM num_tmp;
--Testcase 987:
INSERT INTO num_tmp VALUES (NULL::numeric);
--Testcase 988:
select scale(n1) from num_tmp;
--Testcase 989:
DELETE FROM num_tmp;
--Testcase 990:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 991:
select scale(n1) from num_tmp;
--Testcase 992:
DELETE FROM num_tmp;
--Testcase 993:
INSERT INTO num_tmp VALUES (0);
--Testcase 994:
select scale(n1) from num_tmp;
--Testcase 995:
DELETE FROM num_tmp;
--Testcase 996:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 997:
select scale(n1) from num_tmp;
--Testcase 998:
DELETE FROM num_tmp;
--Testcase 999:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1000:
select scale(n1) from num_tmp;
--Testcase 1001:
DELETE FROM num_tmp;
--Testcase 1002:
INSERT INTO num_tmp VALUES (110123.12475871856128);
--Testcase 1003:
select scale(n1) from num_tmp;
--Testcase 1004:
DELETE FROM num_tmp;
--Testcase 1005:
INSERT INTO num_tmp VALUES (-1123.12471856128);
--Testcase 1006:
select scale(n1) from num_tmp;
--Testcase 1007:
DELETE FROM num_tmp;
--Testcase 1008:
INSERT INTO num_tmp VALUES (-13.000000000000000);
--Testcase 1009:
select scale(n1) from num_tmp;
--
-- Tests for min_scale()
--
--Testcase 1010:
DELETE FROM num_tmp;
--Testcase 1011:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1012:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1013:
DELETE FROM num_tmp;
--Testcase 1014:
INSERT INTO num_tmp VALUES (0);
--Testcase 1015:
select min_scale(n1) from num_tmp; -- no digits
--Testcase 1016:
DELETE FROM num_tmp;
--Testcase 1017:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1018:
select min_scale(n1) from num_tmp; -- no digits again
--Testcase 1019:
DELETE FROM num_tmp;
--Testcase 1020:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 1021:
select min_scale(n1) from num_tmp; -- no scale
--Testcase 1022:
DELETE FROM num_tmp;
--Testcase 1023:
INSERT INTO num_tmp VALUES (1.1);
--Testcase 1024:
select min_scale(n1) from num_tmp; -- scale 1
--Testcase 1025:
DELETE FROM num_tmp;
--Testcase 1026:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 1027:
select min_scale(n1) from num_tmp; -- scale 2
--Testcase 1028:
DELETE FROM num_tmp;
--Testcase 1029:
INSERT INTO num_tmp VALUES (1.123);
--Testcase 1030:
select min_scale(n1) from num_tmp; -- scale 3
--Testcase 1031:
DELETE FROM num_tmp;
--Testcase 1032:
INSERT INTO num_tmp VALUES (1.1234);
--Testcase 1033:
select min_scale(n1) from num_tmp; -- scale 4, filled digit
--Testcase 1034:
DELETE FROM num_tmp;
--Testcase 1035:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1036:
select min_scale(n1) from num_tmp; -- scale 5, 2 NDIGITS
--Testcase 1037:
DELETE FROM num_tmp;
--Testcase 1038:
INSERT INTO num_tmp VALUES (1.1000);
--Testcase 1039:
select min_scale(n1) from num_tmp; -- 1 pos in NDIGITS
--Testcase 1040:
DELETE FROM num_tmp;
--Testcase 1041:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1042:
select min_scale(n1) from num_tmp; -- very big number
--
-- Tests for trim_scale()
--
--Testcase 1043:
DELETE FROM num_tmp;
--Testcase 1044:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1045:
select trim_scale(n1) from num_tmp;
--Testcase 1046:
DELETE FROM num_tmp;
--Testcase 1047:
INSERT INTO num_tmp VALUES (1.120);
--Testcase 1048:
select trim_scale(n1) from num_tmp;
--Testcase 1049:
DELETE FROM num_tmp;
--Testcase 1050:
INSERT INTO num_tmp VALUES (0);
--Testcase 1051:
select trim_scale(n1) from num_tmp;
--Testcase 1052:
DELETE FROM num_tmp;
--Testcase 1053:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1054:
select trim_scale(n1) from num_tmp;
--Testcase 1055:
DELETE FROM num_tmp;
--Testcase 1056:
INSERT INTO num_tmp VALUES (1.1234500);
--Testcase 1057:
select trim_scale(n1) from num_tmp;
--Testcase 1058:
DELETE FROM num_tmp;
--Testcase 1059:
INSERT INTO num_tmp VALUES (110123.12475871856128000);
--Testcase 1060:
select trim_scale(n1) from num_tmp;
--Testcase 1061:
DELETE FROM num_tmp;
--Testcase 1062:
INSERT INTO num_tmp VALUES (-123.124718561280000000);
--Testcase 1063:
select trim_scale(n1) from num_tmp;
--Testcase 1064:
DELETE FROM num_tmp;
--Testcase 1065:
INSERT INTO num_tmp VALUES (-13.00000000000000000000);
--Testcase 1066:
select trim_scale(n1) from num_tmp;
--Testcase 1067:
DELETE FROM num_tmp;
--Testcase 1068:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1069:
select trim_scale(n1) from num_tmp;
--
-- Tests for SUM()
--
-- cases that need carry propagation
--Testcase 1070:
DELETE FROM num_tmp;
--Testcase 1071:
INSERT INTO num_tmp SELECT * FROM generate_series(1, 100000);
--Testcase 1072:
SELECT SUM(9999::numeric) FROM num_tmp;
--Testcase 1073:
SELECT SUM((-9999)::numeric) FROM num_tmp;
--
-- Tests for GCD()
--
--Testcase 1074:
DELETE FROM num_tmp;
--Testcase 1075:
INSERT INTO num_tmp 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);
--Testcase 1076:
SELECT n1 as a, n2 as b, gcd(n1, n2), gcd(n1, -n2), gcd(-n2, n1), gcd(-n2, -n1) FROM num_tmp;
--
-- Tests for LCM()
--
--Testcase 1077:
DELETE FROM num_tmp;
--Testcase 1078:
INSERT INTO num_tmp 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);
--Testcase 1079:
SELECT n1 as a, n2 as b, lcm(n1, n2), lcm(n1, -n2), lcm(-n2, n1), lcm(-n2, -n1) FROM num_tmp;
--Testcase 1080:
DELETE FROM num_tmp;
--Testcase 1081:
INSERT INTO num_tmp VALUES (10::numeric, 131068);
--Testcase 1082:
SELECT lcm(9999 * (n1)^n2 + (n1^n2 - 1), 2) FROM num_tmp; -- overflow
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 1083:
DROP SERVER sqlite_svr;
--Testcase 1084:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/out_of_range.sql
================================================
--
-- INT4 + INT2
--
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 01:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 02:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 03:
DELETE FROM INT4_TMP;
--Testcase 04:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 05:
INSERT INTO INT4_TMP VALUES (x'7FFFFFFF'::int8 + 1, 0);
--Testcase 06:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 07:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 08:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 09:
DELETE FROM INT4_TMP;
--Testcase 10:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 11:
INSERT INTO INT4_TMP VALUES (-(x'7FFFFFFF'::int8) - 2, 0);
--Testcase 12:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 13:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 14:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 15:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 16:
CREATE FOREIGN TABLE INT2_TMP(f1 int2, f2 int2, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 17:
DELETE FROM INT2_TMP;
--Testcase 18:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 19:
INSERT INTO INT2_TMP VALUES (x'7FFF'::int8 + 1, 0);
--Testcase 20:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 21:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 22:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 23:
DELETE FROM INT2_TMP;
--Testcase 24:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 25:
INSERT INTO INT2_TMP VALUES (-(x'7FFF'::int8) - 2, 0);
--Testcase 26:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 27:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 28:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 29:
CREATE FOREIGN TABLE INT8_TBL(q1 int8 OPTIONS (key 'true'), q2 int8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 31:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 32:
INSERT INTO INT8_TBL VALUES (-9223372036854775810, 0);
--Testcase 33:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 34:
SELECT * FROM INT8_TBL; -- NO overflow
--Testcase 35:
SELECT q1 FROM INT8_TBL; -- NO overflow
--Testcase 36:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 37:
DELETE FROM INT8_TBL WHERE q1 = -9223372036854775810;
--Testcase 38:
INSERT INTO INT8_TBL VALUES (9223372036854775809, 0);
--Testcase 39:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 40:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 41:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 42:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 43:
DELETE FROM INT8_TBL WHERE q1 = 9223372036854775809;
--Testcase 44:
INSERT INTO INT8_TBL VALUES (10 * -9223372036854775810, 0);
--Testcase 45:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 46:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 47:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 48:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 49:
DELETE FROM INT8_TBL WHERE q1 = 10 * -9223372036854775810;
--Testcase 50:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 003:
DROP SERVER sqlite_svr CASCADE;
--Testcase 004:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/timestamp.sql
================================================
--
-- TIMESTAMP
--
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 3:
CREATE FOREIGN TABLE dates1 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number timestamp without time zone OPTIONS (column_type 'INT'))
SERVER sqlite_svr
OPTIONS (table 'dates');
--Testcase 4:
CREATE FOREIGN TABLE dates2 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number double precision)
SERVER sqlite_svr
OPTIONS (table 'dates');
-- Showing timestamp column from SQLite value as TEXT and as INTEGER/FLOAT has same value
--Testcase 5:
SELECT name,
to_char(date_as_text, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_text,
to_char(date_as_number, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_number
FROM dates1;
--Testcase 6:
SELECT * FROM dates2;
-- Comparing exact values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 7:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 8:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 9:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 10:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
-- Comparing greater values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 11:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 12:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 13:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 14:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 15:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 16:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 17:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 18:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--- Comparing without using to_timestamp
--Testcase 19:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 20:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 21:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 22:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 23:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 24:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 25:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
--Testcase 26:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
-- Comparing greater values without using to_timestamp
--Testcase 27:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 28:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 29:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 30:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 31:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 32:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 33:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 34:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 35:
DROP FOREIGN TABLE dates1;
--Testcase 36:
DROP FOREIGN TABLE dates2;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/types/uuid.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_UUID"( "i" int OPTIONS (key 'true'), "u" uuid) SERVER sqlite_svr OPTIONS (table 'type_UUID');
--Testcase 010:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE text;
--Testcase 011:
INSERT INTO "type_UUID" ("i", "u") VALUES (1, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 012:
INSERT INTO "type_UUID" ("i", "u") VALUES (2, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 013:
INSERT INTO "type_UUID" ("i", "u") VALUES (3, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 014:
INSERT INTO "type_UUID" ("i", "u") VALUES (4, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 015:
INSERT INTO "type_UUID" ("i", "u") VALUES (5, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 016:
INSERT INTO "type_UUID" ("i", "u") VALUES (6, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 017:
INSERT INTO "type_UUID" ("i", "u") VALUES (7, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 018:
INSERT INTO "type_UUID" ("i", "u") VALUES (8, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 019:
INSERT INTO "type_UUID" ("i", "u") VALUES (9, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 020:
INSERT INTO "type_UUID" ("i", "u") VALUES (10, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 021:
INSERT INTO "type_UUID" ("i", "u") VALUES (11, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 022:
INSERT INTO "type_UUID" ("i", "u") VALUES (12, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 023:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 024:
INSERT INTO "type_UUID" ("i", "u") VALUES (13, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 025:
INSERT INTO "type_UUID" ("i", "u") VALUES (14, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 026:
INSERT INTO "type_UUID" ("i", "u") VALUES (15, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 027:
INSERT INTO "type_UUID" ("i", "u") VALUES (16, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 029:
INSERT INTO "type_UUID" ("i", "u") VALUES (17, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 030:
INSERT INTO "type_UUID" ("i", "u") VALUES (18, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 031:
INSERT INTO "type_UUID" ("i", "u") VALUES (19, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 032:
INSERT INTO "type_UUID" ("i", "u") VALUES (20, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 033:
INSERT INTO "type_UUID" ("i", "u") VALUES (21, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 034:
INSERT INTO "type_UUID" ("i", "u") VALUES (22, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 035:
INSERT INTO "type_UUID" ("i", "u") VALUES (23, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 036:
INSERT INTO "type_UUID" ("i", "u") VALUES (24, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 037:
INSERT INTO "type_UUID" ("i", "u") VALUES (25, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 038:
INSERT INTO "type_UUID" ("i", "u") VALUES (26, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 039:
INSERT INTO "type_UUID" ("i", "u") VALUES (27, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 040:
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 041:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 042:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (ADD column_type 'BLOB');
--Testcase 043:
INSERT INTO "type_UUID" ("i", "u") VALUES (29, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 044:
INSERT INTO "type_UUID" ("i", "u") VALUES (30, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 045:
INSERT INTO "type_UUID" ("i", "u") VALUES (31, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 046:
INSERT INTO "type_UUID" ("i", "u") VALUES (32, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 047:
INSERT INTO "type_UUID" ("i", "u") VALUES (33, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 048:
INSERT INTO "type_UUID" ("i", "u") VALUES (34, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 049:
INSERT INTO "type_UUID" ("i", "u") VALUES (35, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 050:
INSERT INTO "type_UUID" ("i", "u") VALUES (36, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 051:
INSERT INTO "type_UUID" ("i", "u") VALUES (37, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 052:
INSERT INTO "type_UUID" ("i", "u") VALUES (38, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 053:
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 054:
INSERT INTO "type_UUID" ("i", "u") VALUES (40, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 056:
CREATE FOREIGN TABLE "type_UUID+"( "i" int OPTIONS (key 'true'), "u" uuid, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_UUID+');
--Testcase 057:
SELECT * FROM "type_UUID+";
--Testcase 058:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 059:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 060:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 061:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 062:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 063:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 064:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 065:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 066:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 067:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 068:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 069:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 071:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 072:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 073:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 074:
SELECT * FROM "type_UUID+";
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11';
--Testcase 076:
SELECT * FROM "type_UUID+";
--Testcase 077:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 077:
SELECT * FROM "type_UUID+";
--Testcase 078:
INSERT INTO "type_UUID" ("i", "u") VALUES (41, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}');
--Testcase 079:
SELECT * FROM "type_UUID+" WHERE "i" = 41;
--Testcase 080:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 081:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 082:
SELECT * FROM "type_UUID+";
--Testcase 083:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}';
--Testcase 085:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 086:
INSERT INTO "type_UUID" ("i", "u") VALUES (42, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11f1', 'hex'));
--Testcase 087:
INSERT INTO "type_UUID" ("i", "u") VALUES (43, decode('b0eebc999c0b4ef8bb6d6bb9bd380a', 'hex'));
--Testcase 088:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 089:
SELECT * FROM "type_UUID+" WHERE "i" = 42;
--Testcase 090:
SELECT * FROM "type_UUID+" WHERE "i" = 43;
--Testcase 091:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 092:
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 093:
INSERT INTO "type_UUID" ("i", "u") VALUES (44, NULL);
--Testcase 094:
SELECT * FROM "type_UUID+";
--Testcase 095:
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 096:
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 100:
CREATE FOREIGN TABLE "type_UUIDpk" (col uuid OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 101:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (ADD column_type 'TEXT');
--Testcase 102:
INSERT INTO "type_UUIDpk" VALUES ('{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 103:
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 104:
SELECT * FROM "type_UUIDpk";
--Testcase 105: ERR - primary key
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 106:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 107: NO ERR, but the same semantics!
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 108:
SELECT * FROM "type_UUIDpk";
--Testcase 109:
DELETE FROM "type_UUIDpk";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/with_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/with_gis_support/postgis.sql
================================================
--Testcase 2:
CREATE EXTENSION sqlite_fdw;
--Testcase 3:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 4:
CREATE EXTENSION IF NOT EXISTS postgis;
--Testcase 5:
CREATE EXTENSION postgis_raster;
--Testcase 6:
CREATE EXTENSION postgis_topology;
-- TEST GIS DATA FROM UNION ASTRONOMIQUE INTERNATIONAL (国際天文学連合): MARS, Olympus mons
--Testcase 11:
CREATE SCHEMA "♂";
--Testcase 12:
CREATE TABLE "♂"."テスト" (
id int4 NULL,
"UAI" varchar(254) NULL,
"⌖" public.geometry(point, 104904) NULL,
geom public.geometry(geometry, 104904) NULL,
"t₀" date NULL,
"class" text NULL,
"URL" varchar(80) NULL
);
--Testcase 13: ETC...
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(991, 'Olympus Mons', 'SRID=104904;POINT (226.19749330952843 18.652758890345698)'::geometry, 'SRID=104904;MULTIPOLYGON (((223.78717231750488 23.3314151763916, 224.22803688049316 23.324007034301758, 224.32436180114746 23.5648136138916, 224.7186985015869 23.593564987182617, 224.79486274719238 23.45737648010254, 225.06530570983887 23.238798141479492, 225.67255210876465 23.437196731567383, 226.2211856842041 23.6611385345459, 226.5472011566162 23.65372657775879, 227.6215763092041 23.435148239135742, 228.19009590148926 23.390283584594727, 228.753023147583 23.24955177307129, 228.90711784362793 23.1943416595459, 229.23219108581543 23.004926681518555, 229.5288143157959 22.75514030456543, 229.87227058410645 22.442903518676758, 230.2469539642334 22.14628028869629, 230.7309169769287 21.927717208862305, 231.30854988098145 21.64670753479004, 231.85495948791504 21.084684371948242, 232.19841957092285 19.88258171081543, 231.88618278503418 18.47752571105957, 231.30854988098145 17.743772506713867, 231.21887397766113 17.218599319458008, 231.17812156677246 16.751802444458008, 230.97346687316895 16.353670120239258, 230.8327350616455 15.947111129760742, 230.62945365905762 15.478002548217773, 230.4574489593506 15.352907180786133, 230.20748329162598 15.29954719543457, 229.99631309509277 15.036508560180664, 229.72586631774902 14.640104293823242, 229.41096305847168 14.377065658569336, 228.98862266540527 14.10291862487793, 228.74040412902832 13.854700088500977, 228.5107135772705 13.83247184753418, 228.31806755065918 13.962137222290039, 227.93990516662598 13.929948806762695, 227.36133766174316 13.883039474487305, 227.04734230041504 13.813947677612305, 226.68895149230957 13.851762771606445, 226.4101276397705 13.839879989624023, 226.06347465515137 13.632848739624023, 225.7766170501709 13.617597579956055, 225.32925987243652 13.481771469116211, 224.76723670959473 13.591054916381836, 224.15838050842285 13.731557846069336, 223.12800407409668 14.106241226196289, 222.39425468444824 14.402864456176758, 221.67611503601074 14.918050765991211, 221.434663772583 15.403280258178711, 221.30129432678223 16.051607131958008, 221.0864200592041 16.410966873168945, 221.09012413024902 16.6591854095459, 221.1975612640381 17.09263801574707, 220.9971103668213 17.32316017150879, 220.75670051574707 17.422361373901367, 220.82338523864746 17.844701766967773, 221.18475532531738 18.073732376098633, 221.3567600250244 18.5584774017334, 221.40367317199707 19.10576820373535, 221.3567600250244 19.90325355529785, 221.42725563049316 20.59361457824707, 221.778959274292 21.40439796447754, 222.34188652038574 22.201879501342773, 223.01658821105957 23.272138595581055, 223.3759479522705 23.668546676635742, 223.3722438812256 23.675954818725586, 223.57600212097168 23.675954818725586, 223.70566749572754 23.542585372924805, 223.78717231750488 23.3314151763916)))'::geometry, '1973-01-01', 'mo', 'http://planetarynames.wr.usgs.gov/Feature/4453');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(248, 'Karzok', 'SRID=104904;POINT (228.262902951161 18.4035270924109)'::geometry, 'SRID=104904;MULTIPOLYGON (((228.269330978394 18.2748584747314, 228.266962051392 18.2748394012451, 228.264589309692 18.2748584747314, 228.26222038269 18.2749156951904, 228.259851455688 18.2750148773193, 228.257482528687 18.2751522064209, 228.255121231079 18.2753276824951, 228.252759933472 18.2755451202393, 228.250402450562 18.2757968902588, 228.248052597046 18.2760906219482, 228.245706558228 18.2764263153076, 228.243368148804 18.2767963409424, 228.241037368774 18.2772083282471, 228.23871421814 18.2776546478271, 228.236398696899 18.2781429290771, 228.234094619751 18.2786655426025, 228.231798171997 18.2792301177979, 228.229513168335 18.2798328399658, 228.227239608765 18.2804698944092, 228.224977493286 18.2811489105225, 228.222726821899 18.2818622589111, 228.220491409302 18.2826137542725, 228.218271255493 18.2833995819092, 228.216066360474 18.2842235565186, 228.213872909546 18.2850856781006, 228.211698532104 18.285982131958, 228.209539413452 18.2869167327881, 228.207399368286 18.2878856658936, 228.205278396606 18.2888889312744, 228.203172683716 18.2899265289307, 228.201089859009 18.2910022735596, 228.199026107788 18.2921085357666, 228.196981430054 18.2932529449463, 228.194959640503 18.2944278717041, 228.192956924438 18.2956371307373, 228.190980911255 18.2968769073486, 228.189023971558 18.2981548309326, 228.187093734741 18.2994594573975, 228.185186386108 18.3007984161377, 228.183305740356 18.3021678924561, 228.181447982788 18.3035678863525, 228.179616928101 18.3050022125244, 228.177812576294 18.3064632415771, 228.176038742065 18.307954788208, 228.174287796021 18.3094730377197, 228.172567367554 18.3110218048096, 228.170873641968 18.3126010894775, 228.16921043396 18.3142032623291, 228.16757774353 18.3158359527588, 228.165975570679 18.3174953460693, 228.164403915405 18.3191814422607, 228.162858963013 18.320894241333, 228.161352157593 18.3226299285889, 228.159872055054 18.3243923187256, 228.158430099487 18.3261775970459, 228.157014846802 18.3279857635498, 228.155637741089 18.3298168182373, 228.154294967651 18.3316707611084, 228.152982711792 18.3335475921631, 228.151708602905 18.3354473114014, 228.150468826294 18.337366104126, 228.149263381958 18.3393039703369, 228.148092269897 18.3412647247314, 228.14695930481 18.343240737915, 228.145864486694 18.3452396392822, 228.144804000854 18.3472537994385, 228.143781661987 18.3492832183838, 228.142793655396 18.3513317108154, 228.141847610474 18.3533954620361, 228.140939712524 18.3554744720459, 228.140066146851 18.3575687408447, 228.139234542847 18.3596782684326, 228.138441085815 18.3617992401123, 228.137685775757 18.3639354705811, 228.136972427368 18.3660831451416, 228.136297225952 18.3682422637939, 228.135660171509 18.3704090118408, 228.135065078735 18.3725872039795, 228.134511947632 18.37477684021, 228.133996963501 18.376974105835, 228.133520126343 18.3791828155518, 228.133085250854 18.3813953399658, 228.132692337036 18.3836154937744, 228.132341384888 18.3858432769775, 228.132028579712 18.3880748748779, 228.131757736206 18.3903102874756, 228.13152885437 18.3925533294678, 228.131341934204 18.39479637146, 228.131196975708 18.3970432281494, 228.131090164185 18.3992938995361, 228.131025314331 18.4015445709229, 228.131002426147 18.4037952423096, 228.131021499634 18.4060459136963, 228.13108253479 18.408296585083, 228.131185531616 18.4105472564697, 228.131326675415 18.4127941131592, 228.131513595581 18.4150371551514, 228.13173866272 18.4172801971436, 228.132005691528 18.4195156097412, 228.132314682007 18.4217510223389, 228.132661819458 18.4239749908447, 228.133054733276 18.4261989593506, 228.13348197937 18.4284114837646, 228.133955001831 18.4306163787842, 228.134466171265 18.4328174591064, 228.135019302368 18.4350070953369, 228.135610580444 18.4371852874756, 228.13624382019 18.4393558502197, 228.136919021606 18.4415149688721, 228.137628555298 18.4436626434326, 228.138380050659 18.4457988739014, 228.13917350769 18.4479236602783, 228.140001296997 18.4500331878662, 228.140871047974 18.452127456665, 228.141775131226 18.4542064666748, 228.142721176147 18.4562740325928, 228.143705368042 18.4583225250244, 228.144723892212 18.460355758667, 228.145784378052 18.4623699188232, 228.146879196167 18.4643688201904, 228.148008346558 18.4663486480713, 228.149175643921 18.4683094024658, 228.150381088257 18.4702472686768, 228.151620864868 18.4721698760986, 228.152894973755 18.4740695953369, 228.154203414917 18.4759464263916, 228.155546188354 18.47780418396, 228.156923294067 18.4796352386475, 228.158334732056 18.4814472198486, 228.159776687622 18.4832363128662, 228.161256790161 18.4849987030029, 228.162763595581 18.4867343902588, 228.164304733276 18.4884471893311, 228.16587638855 18.4901371002197, 228.167478561401 18.4917964935303, 228.169115066528 18.49342918396, 228.170778274536 18.4950351715088, 228.172468185425 18.4966144561768, 228.174192428589 18.4981670379639, 228.175939559937 18.4996891021729, 228.177717208862 18.5011806488037, 228.179521560669 18.5026454925537, 228.181352615356 18.5040760040283, 228.183210372925 18.5054798126221, 228.185094833374 18.5068492889404, 228.187002182007 18.5081920623779, 228.188936233521 18.50950050354, 228.190893173218 18.5107746124268, 228.192869186401 18.5120182037354, 228.194871902466 18.5132274627686, 228.196897506714 18.5144062042236, 228.198942184448 18.5155506134033, 228.201009750366 18.5166568756104, 228.203096389771 18.5177326202393, 228.205202102661 18.5187740325928, 228.207326889038 18.5197811126709, 228.209466934204 18.5207500457764, 228.211629867554 18.5216846466064, 228.213804244995 18.5225811004639, 228.21600151062 18.5234432220459, 228.218210220337 18.5242710113525, 228.220434188843 18.5250568389893, 228.22266960144 18.5258121490479, 228.224924087524 18.5265254974365, 228.227186203003 18.5272045135498, 228.229463577271 18.5278415679932, 228.23175239563 18.5284442901611, 228.234052658081 18.5290088653564, 228.236360549927 18.5295352935791, 228.238679885864 18.5300235748291, 228.241006851196 18.5304698944092, 228.243341445923 18.5308818817139, 228.245683670044 18.5312557220459, 228.248029708862 18.531587600708, 228.250383377075 18.5318813323975, 228.252744674683 18.5321369171143, 228.255109786987 18.5323505401611, 228.257474899292 18.5325298309326, 228.259847640991 18.5326671600342, 228.262216567993 18.5327663421631, 228.26459312439 18.5328235626221, 228.266965866089 18.5328426361084, 228.269342422485 18.5328235626221, 228.271715164185 18.5327625274658, 228.274087905884 18.5326671600342, 228.276456832886 18.5325298309326, 228.278825759888 18.5323505401611, 228.281187057495 18.5321369171143, 228.283548355103 18.5318813323975, 228.285902023315 18.531587600708, 228.288251876831 18.5312519073486, 228.290594100952 18.5308818817139, 228.292928695679 18.5304698944092, 228.295255661011 18.5300197601318, 228.297574996948 18.5295352935791, 228.299882888794 18.5290088653564, 228.302179336548 18.5284442901611, 228.304468154907 18.5278415679932, 228.306745529175 18.5272006988525, 228.309011459351 18.5265254974365, 228.311262130737 18.5258083343506, 228.313501358032 18.5250568389893, 228.315725326538 18.5242671966553, 228.317934036255 18.5234432220459, 228.320127487183 18.5225811004639, 228.322305679321 18.5216808319092, 228.324464797974 18.5207462310791, 228.326608657837 18.5197772979736, 228.328733444214 18.5187702178955, 228.330839157104 18.5177326202393, 228.332925796509 18.5166568756104, 228.334989547729 18.5155467987061, 228.337034225464 18.5144023895264, 228.339059829712 18.5132274627686, 228.341062545776 18.5120143890381, 228.343042373657 18.5107707977295, 228.344995498657 18.5094966888428, 228.346929550171 18.5081882476807, 228.348836898804 18.5068454742432, 228.350721359253 18.5054759979248, 228.352579116821 18.5040721893311, 228.354410171509 18.5026416778564, 228.356214523315 18.5011768341064, 228.357992172241 18.4996852874756, 228.359739303589 18.4981632232666, 228.361463546753 18.4966106414795, 228.363153457642 18.4950313568115, 228.364816665649 18.4934253692627, 228.366449356079 18.491792678833, 228.368055343628 18.4901294708252, 228.369626998901 18.4884433746338, 228.371168136597 18.4867305755615, 228.372674942017 18.4849910736084, 228.374151229858 18.4832286834717, 228.375597000122 18.4814434051514, 228.37700843811 18.4796314239502, 228.378385543823 18.4778003692627, 228.379728317261 18.4759426116943, 228.381036758423 18.4740619659424, 228.38231086731 18.4721660614014, 228.383550643921 18.4702434539795, 228.38475227356 18.4683017730713, 228.385919570923 18.4663410186768, 228.387052536011 18.4643650054932, 228.388147354126 18.462366104126, 228.389204025269 18.4603481292725, 228.390226364136 18.4583187103271, 228.391206741333 18.4562664031982, 228.392152786255 18.4542026519775, 228.393060684204 18.4521198272705, 228.393926620483 18.4500255584717, 228.394758224487 18.4479160308838, 228.395547866821 18.4457950592041, 228.396299362183 18.4436588287354, 228.397012710571 18.4415111541748, 228.39768409729 18.4393520355225, 228.398317337036 18.4371814727783, 228.398908615112 18.4349994659424, 228.399461746216 18.4328098297119, 228.399972915649 18.4306125640869, 228.40044593811 18.4284076690674, 228.400876998901 18.4261913299561, 228.401266098022 18.4239711761475, 228.401613235474 18.4217433929443, 228.401922225952 18.4195117950439, 228.402189254761 18.417272567749, 228.402414321899 18.4150333404541, 228.402597427368 18.4127864837646, 228.402742385864 18.4105396270752, 228.40284538269 18.4082927703857, 228.402902603149 18.406042098999, 228.402921676636 18.403787612915, 228.402898788452 18.4015369415283, 228.402837753296 18.3992862701416, 228.402730941772 18.3970394134521, 228.402585983276 18.3947887420654, 228.402395248413 18.3925457000732, 228.402166366577 18.3903064727783, 228.401895523071 18.3880672454834, 228.401586532593 18.385835647583, 228.401231765747 18.3836116790771, 228.400838851929 18.3813877105713, 228.40040397644 18.3791751861572, 228.399930953979 18.3769702911377, 228.399415969849 18.3747730255127, 228.398859024048 18.3725833892822, 228.398263931274 18.3704051971436, 228.397626876831 18.3682346343994, 228.396951675415 18.3660755157471, 228.396238327026 18.3639316558838, 228.395483016968 18.361795425415, 228.394689559937 18.3596744537354, 228.393857955933 18.3575649261475, 228.392988204956 18.3554706573486, 228.39207649231 18.3533916473389, 228.391130447388 18.3513278961182, 228.390146255493 18.3492794036865, 228.389120101929 18.3472461700439, 228.388063430786 18.3452320098877, 228.386964797974 18.3432369232178, 228.385831832886 18.3412609100342, 228.384660720825 18.3393001556396, 228.383455276489 18.3373622894287, 228.382215499878 18.3354434967041, 228.380941390991 18.3335437774658, 228.379629135132 18.3316669464111, 228.378286361694 18.32981300354, 228.376905441284 18.3279819488525, 228.375494003296 18.3261699676514, 228.374048233032 18.3243846893311, 228.37257194519 18.3226261138916, 228.371061325073 18.3208866119385, 228.369520187378 18.3191776275635, 228.367948532104 18.3174915313721, 228.366346359253 18.3158321380615, 228.364709854126 18.3141994476318, 228.363046646118 18.3125972747803, 228.361356735229 18.3110179901123, 228.359636306763 18.3094692230225, 228.357885360718 18.3079509735107, 228.356107711792 18.3064594268799, 228.354303359985 18.3049983978271, 228.352472305298 18.3035640716553, 228.350618362427 18.3021640777588, 228.348733901978 18.3007946014404, 228.346826553345 18.2994556427002, 228.344896316528 18.2981510162354, 228.342943191528 18.2968769073486, 228.340963363647 18.29563331604, 228.33896446228 18.2944240570068, 228.336938858032 18.293249130249, 228.334897994995 18.2921085357666, 228.332830429077 18.2909984588623, 228.33074760437 18.2899265289307, 228.328645706177 18.2888851165771, 228.3265209198 18.2878818511963, 228.324380874634 18.2869129180908, 228.322221755981 18.285982131958, 228.32004737854 18.2850856781006, 228.31785774231 18.2842235565186, 228.315649032593 18.2833995819092, 228.313428878784 18.2826099395752, 228.311193466187 18.2818584442139, 228.3089427948 18.2811450958252, 228.306684494019 18.2804698944092, 228.304410934448 18.2798290252686, 228.302125930786 18.2792301177979, 228.299829483032 18.2786655426025, 228.297521591187 18.2781391143799, 228.295206069946 18.2776546478271, 228.292882919312 18.2772045135498, 228.290552139282 18.2767963409424, 228.288213729858 18.2764225006104, 228.28586769104 18.2760906219482, 228.283517837524 18.2757968902588, 228.281160354614 18.2755451202393, 228.278802871704 18.2753276824951, 228.276437759399 18.2751522064209, 228.274072647095 18.2750148773193, 228.271703720093 18.2749156951904, 228.269330978394 18.2748584747314)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14144');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(249, 'Pangboche', 'SRID=104904;POINT (226.595873773026 17.2783598670807)'::geometry, 'SRID=104904;MULTIPOLYGON (((226.601442337036 17.1929302215576, 226.599878311157 17.1929187774658, 226.598310470581 17.1929302215576, 226.596746444702 17.1929721832275, 226.595178604126 17.1930370330811, 226.593618392944 17.1931285858154, 226.592054367065 17.1932430267334, 226.590497970581 17.1933879852295, 226.588941574097 17.1935558319092, 226.587385177612 17.193754196167, 226.585836410522 17.1939754486084, 226.58429145813 17.1942195892334, 226.582754135132 17.1944942474365, 226.581216812134 17.1947917938232, 226.57968711853 17.1951160430908, 226.578165054321 17.195463180542, 226.576650619507 17.195837020874, 226.57513999939 17.1962375640869, 226.573637008667 17.1966648101807, 226.572145462036 17.197114944458, 226.570657730103 17.1975879669189, 226.569181442261 17.1980876922607, 226.567712783813 17.1986103057861, 226.566255569458 17.1991596221924, 226.564809799194 17.1997318267822, 226.563371658325 17.2003269195557, 226.561948776245 17.20094871521, 226.56053352356 17.2015933990479, 226.559129714966 17.2022609710693, 226.557741165161 17.2029514312744, 226.556364059448 17.2036647796631, 226.555002212524 17.2044010162354, 226.553651809692 17.2051601409912, 226.552316665649 17.2059421539307, 226.550992965698 17.2067432403564, 226.549688339233 17.2075710296631, 226.54839515686 17.2084178924561, 226.547121047974 17.2092876434326, 226.545862197876 17.2101764678955, 226.544618606567 17.211088180542, 226.543394088745 17.2120189666748, 226.542184829712 17.2129688262939, 226.540990829468 17.2139415740967, 226.539819717407 17.2149333953857, 226.538663864136 17.2159404754639, 226.537527084351 17.2169704437256, 226.536409378052 17.2180194854736, 226.535310745239 17.219087600708, 226.534231185913 17.2201709747314, 226.533174514771 17.2212734222412, 226.532133102417 17.2223949432373, 226.531118392944 17.2235317230225, 226.530118942261 17.2246875762939, 226.529146194458 17.2258586883545, 226.528188705444 17.2270450592041, 226.527257919312 17.2282466888428, 226.526346206665 17.2294635772705, 226.525461196899 17.2306995391846, 226.52459526062 17.2319469451904, 226.523752212524 17.2332057952881, 226.522932052612 17.2344837188721, 226.522138595581 17.2357730865479, 226.521364212036 17.2370738983154, 226.520616531372 17.2383899688721, 226.519891738892 17.2397136688232, 226.519193649292 17.2410526275635, 226.518518447876 17.2424030303955, 226.517869949341 17.2437648773193, 226.517244338989 17.245138168335, 226.516641616821 17.2465190887451, 226.516069412231 17.2479114532471, 226.515520095825 17.2493152618408, 226.514993667603 17.2507228851318, 226.514497756958 17.2521419525146, 226.514024734497 17.253568649292, 226.513578414917 17.2550029754639, 226.513158798218 17.2564449310303, 226.512765884399 17.2578945159912, 226.512399673462 17.2593479156494, 226.512060165405 17.2608089447021, 226.511747360229 17.2622776031494, 226.511461257935 17.2637462615967, 226.511201858521 17.2652225494385, 226.510969161987 17.2667026519775, 226.510766983032 17.2681865692139, 226.510587692261 17.2696743011475, 226.51043510437 17.2711620330811, 226.510313034058 17.2726535797119, 226.510217666626 17.27414894104, 226.510149002075 17.2756404876709, 226.510107040405 17.277135848999, 226.510091781616 17.2786350250244, 226.510103225708 17.2801303863525, 226.510145187378 17.2816257476807, 226.510213851929 17.2831211090088, 226.510305404663 17.2846164703369, 226.510431289673 17.2861080169678, 226.510580062866 17.2875957489014, 226.51075553894 17.289083480835, 226.510957717896 17.2905673980713, 226.511190414429 17.2920475006104, 226.511449813843 17.2935237884521, 226.51173210144 17.2949924468994, 226.512044906616 17.2964611053467, 226.512384414673 17.2979221343994, 226.51275062561 17.2993755340576, 226.513139724731 17.3008251190186, 226.513559341431 17.302267074585, 226.514001846313 17.3037014007568, 226.514474868774 17.3051280975342, 226.514970779419 17.306547164917, 226.515493392944 17.3079586029053, 226.516042709351 17.309362411499, 226.51661491394 17.310754776001, 226.517213821411 17.3121356964111, 226.517839431763 17.3135089874268, 226.518487930298 17.3148708343506, 226.519163131714 17.3162212371826, 226.519861221313 17.3175601959229, 226.520586013794 17.3188877105713, 226.521333694458 17.3202037811279, 226.522104263306 17.3215045928955, 226.522897720337 17.3227939605713, 226.523717880249 17.3240718841553, 226.524557113647 17.3253345489502, 226.525423049927 17.3265819549561, 226.52631187439 17.3278141021729, 226.527219772339 17.3290348052979, 226.528150558472 17.3302364349365, 226.529108047485 17.3314228057861, 226.530080795288 17.3325939178467, 226.531076431274 17.3337497711182, 226.532094955444 17.3348903656006, 226.533132553101 17.3360080718994, 226.53419303894 17.3371143341064, 226.535272598267 17.3381977081299, 226.536371231079 17.3392658233643, 226.537488937378 17.3403148651123, 226.538625717163 17.341344833374, 226.539781570435 17.3423557281494, 226.540952682495 17.3433475494385, 226.542146682739 17.3443202972412, 226.543355941772 17.3452739715576, 226.544580459595 17.3462047576904, 226.545824050903 17.3471164703369, 226.547082901001 17.3480052947998, 226.548360824585 17.3488750457764, 226.549654006958 17.3497219085693, 226.550958633423 17.350549697876, 226.552282333374 17.351354598999, 226.553617477417 17.3521366119385, 226.554967880249 17.3528957366943, 226.55633354187 17.3536319732666, 226.557710647583 17.3543453216553, 226.559099197388 17.3550395965576, 226.560503005981 17.3557071685791, 226.561918258667 17.356351852417, 226.563344955444 17.356969833374, 226.564783096313 17.3575687408447, 226.566232681274 17.3581409454346, 226.56768989563 17.3586902618408, 226.569158554077 17.3592128753662, 226.570634841919 17.359712600708, 226.572122573853 17.3601894378662, 226.573617935181 17.3606395721436, 226.575120925903 17.36106300354, 226.576631546021 17.3614635467529, 226.578149795532 17.361837387085, 226.579675674438 17.3621883392334, 226.581205368042 17.362512588501, 226.58274269104 17.3628101348877, 226.584283828735 17.3630847930908, 226.585828781128 17.3633289337158, 226.587377548218 17.3635501861572, 226.588933944702 17.363748550415, 226.590490341187 17.3639163970947, 226.592050552368 17.3640613555908, 226.593614578247 17.3641757965088, 226.595178604126 17.3642673492432, 226.596746444702 17.3643321990967, 226.598314285278 17.3643741607666, 226.599882125854 17.3643856048584, 226.601449966431 17.3643741607666, 226.603017807007 17.3643321990967, 226.604581832886 17.3642673492432, 226.606145858765 17.3641757965088, 226.607709884644 17.3640613555908, 226.609270095825 17.3639163970947, 226.610830307007 17.3637447357178, 226.612382888794 17.3635501861572, 226.613931655884 17.3633289337158, 226.615480422974 17.3630809783936, 226.617021560669 17.3628101348877, 226.618558883667 17.362512588501, 226.620088577271 17.3621883392334, 226.621610641479 17.361837387085, 226.623128890991 17.3614635467529, 226.624639511108 17.36106300354, 226.626142501831 17.3606395721436, 226.627637863159 17.3601856231689, 226.629125595093 17.359712600708, 226.630601882935 17.3592128753662, 226.632070541382 17.3586902618408, 226.633531570435 17.3581409454346, 226.634977340698 17.3575687408447, 226.636415481567 17.356969833374, 226.637842178345 17.3563480377197, 226.63925743103 17.3557033538818, 226.640661239624 17.3550357818604, 226.642049789429 17.3543453216553, 226.643426895142 17.3536319732666, 226.644792556763 17.3528957366943, 226.646142959595 17.3521327972412, 226.647478103638 17.3513507843018, 226.648801803589 17.3505458831787, 226.650110244751 17.3497219085693, 226.651399612427 17.3488750457764, 226.652677536011 17.3480052947998, 226.653936386108 17.3471126556396, 226.655179977417 17.3462009429932, 226.656408309937 17.3452701568604, 226.65761756897 17.3443202972412, 226.658807754517 17.3433475494385, 226.659982681274 17.3423557281494, 226.661138534546 17.341344833374, 226.662275314331 17.3403148651123, 226.66339302063 17.3392658233643, 226.664487838745 17.3381977081299, 226.665567398071 17.3371105194092, 226.666627883911 17.3360080718994, 226.667665481567 17.3348865509033, 226.668684005737 17.3337459564209, 226.669679641724 17.3325939178467, 226.670656204224 17.3314228057861, 226.67160987854 17.3302326202393, 226.672540664673 17.3290309906006, 226.673448562622 17.3278141021729, 226.674337387085 17.3265781402588, 226.675203323364 17.3253307342529, 226.676042556763 17.324068069458, 226.676862716675 17.3227939605713, 226.677656173706 17.3215007781982, 226.678426742554 17.3201999664307, 226.679174423218 17.318883895874, 226.679899215698 17.3175563812256, 226.680597305298 17.3162174224854, 226.681272506714 17.3148670196533, 226.681921005249 17.3135051727295, 226.682546615601 17.3121318817139, 226.683145523071 17.3107509613037, 226.683717727661 17.3093585968018, 226.684267044067 17.307954788208, 226.684789657593 17.3065433502197, 226.685285568237 17.3051242828369, 226.685754776001 17.3036975860596, 226.686201095581 17.3022632598877, 226.686616897583 17.3008213043213, 226.687009811401 17.2993717193604, 226.687376022339 17.2979183197021, 226.687715530396 17.2964572906494, 226.688024520874 17.2949886322021, 226.688310623169 17.2935199737549, 226.688570022583 17.2920436859131, 226.688798904419 17.290563583374, 226.689004898071 17.2890796661377, 226.689180374146 17.2875919342041, 226.689329147339 17.2861042022705, 226.689451217651 17.2846126556396, 226.689546585083 17.2831172943115, 226.689615249634 17.2816219329834, 226.689653396606 17.2801265716553, 226.689668655396 17.2786312103271, 226.689653396606 17.277135848999, 226.689611434937 17.2756366729736, 226.689542770386 17.2741451263428, 226.689443588257 17.2726497650146, 226.689321517944 17.2711582183838, 226.689168930054 17.2696704864502, 226.688993453979 17.2681827545166, 226.688787460327 17.2666988372803, 226.688554763794 17.2652187347412, 226.68829536438 17.2637424468994, 226.688009262085 17.2622737884521, 226.687696456909 17.2608051300049, 226.687356948853 17.2593441009521, 226.686990737915 17.2578907012939, 226.686597824097 17.256441116333, 226.686178207397 17.2549991607666, 226.685731887817 17.2535648345947, 226.685258865356 17.2521381378174, 226.684762954712 17.2507190704346, 226.684236526489 17.2493114471436, 226.683687210083 17.2479076385498, 226.683115005493 17.2465152740479, 226.682512283325 17.2451343536377, 226.681886672974 17.2437610626221, 226.681238174438 17.2424030303955, 226.680562973022 17.2410526275635, 226.679864883423 17.2397136688232, 226.679140090942 17.2383861541748, 226.678392410278 17.2370700836182, 226.677618026733 17.2357692718506, 226.676824569702 17.2344799041748, 226.67600440979 17.2332057952881, 226.675161361694 17.2319431304932, 226.674295425415 17.2306957244873, 226.673410415649 17.2294635772705, 226.672498703003 17.2282428741455, 226.671564102173 17.2270412445068, 226.670610427856 17.2258548736572, 226.669637680054 17.2246837615967, 226.66863822937 17.2235317230225, 226.6676197052 17.22239112854, 226.666582107544 17.2212734222412, 226.665525436401 17.2201709747314, 226.664445877075 17.2190837860107, 226.663347244263 17.2180194854736, 226.662229537964 17.2169704437256, 226.661092758179 17.2159404754639, 226.659936904907 17.2149295806885, 226.658761978149 17.2139377593994, 226.657571792603 17.2129650115967, 226.656362533569 17.2120151519775, 226.655138015747 17.2110843658447, 226.653894424438 17.2101726531982, 226.652635574341 17.2092838287354, 226.651357650757 17.2084140777588, 226.650068283081 17.2075672149658, 226.648759841919 17.2067432403564, 226.647439956665 17.2059383392334, 226.646104812622 17.2051563262939, 226.64475440979 17.2043972015381, 226.643388748169 17.2036609649658, 226.642011642456 17.2029476165771, 226.640623092651 17.2022571563721, 226.639223098755 17.2015895843506, 226.637807846069 17.2009449005127, 226.636381149292 17.2003269195557, 226.63494682312 17.1997318267822, 226.633497238159 17.1991558074951, 226.632040023804 17.1986103057861, 226.630575180054 17.1980838775635, 226.629095077515 17.1975879669189, 226.627611160278 17.1971111297607, 226.62611579895 17.1966609954834, 226.624616622925 17.1962375640869, 226.623106002808 17.195837020874, 226.621587753296 17.195463180542, 226.620065689087 17.1951160430908, 226.618535995483 17.1947917938232, 226.617002487183 17.1944942474365, 226.615461349487 17.1942195892334, 226.613916397095 17.1939716339111, 226.612367630005 17.1937503814697, 226.610815048218 17.1935558319092, 226.609258651733 17.1933879852295, 226.607698440552 17.1932430267334, 226.60613822937 17.1931285858154, 226.604574203491 17.1930370330811, 226.603010177612 17.1929721832275, 226.601442337036 17.1929302215576)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14145');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1849, 'Hermes Patera', 'SRID=104904;POINT (226.57 18.33)'::geometry, 'SRID=104904;POLYGON ((226.27743530274 18.067016601562, 226.25820922852 18.135681152343, 226.255462646485 18.216705322265124, 226.26507568359813 18.293609619139627, 226.25614929199594 18.331375122069314, 226.26095581055 18.369140624999, 226.28842163086 18.465270996093, 226.35159301758 18.528442382812, 226.44772338867 18.577880859374, 226.48480224609438 18.594360351561626, 226.52462768555 18.6026000976555, 226.57955932617 18.608093261718, 226.68118286133 18.586120605468, 226.70590209961 18.569641113281, 226.74435424805 18.539428710937, 226.78555297852 18.514709472656, 226.83224487305 18.498229980468, 226.86932373046687 18.488616943359126, 226.89404296875 18.4721374511715, 226.90090942383 18.451538085937, 226.90640258789 18.410339355468, 226.91189575195 18.380126953124, 226.92013549805 18.322448730468, 226.90640258789 18.251037597656, 226.87344360352 18.187866210937, 226.82949829102 18.146667480468, 226.79379272461 18.113708496093, 226.77456665039 18.102722167968, 226.72787475586 18.119201660156, 226.68392944336 18.141174316406, 226.63723754883125 18.15490722656175, 226.58779907226562 18.14254760742125, 226.56033325195 18.121948242187, 226.52188110352 18.088989257812, 226.48617553711 18.067016601562, 226.45321655274 18.083496093749, 226.38729858399 18.086242675781, 226.32412719727 18.078002929687, 226.27743530274 18.067016601562))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15690');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1688, 'Olympus Rupes', 'SRID=104904;POINT (226.43548539543502 18.401964175317982)'::geometry, 'SRID=104904;MULTILINESTRING ((227.42951774597168 22.934080123901367, 227.93671226501465 22.65593910217285, 228.34573936462402 22.4268856048584, 228.52571296691895 22.295995712280273, 228.67296028137207 22.099660873413086, 228.96746253967285 22.099660873413086, 229.62190437316895 21.739717483520508, 230.1290988922119 21.477941513061523, 230.35815620422363 21.26524543762207, 230.38258171081543 21.086992263793945, 230.2117748260498 20.55558967590332, 230.71787071228027 19.182798385620117, 230.8653507232666 18.500219345092773, 230.8653507232666 18.058469772338867, 230.8653507232666 17.96030616760254, 230.88171195983887 16.978639602661133, 230.9144344329834 16.635053634643555, 230.73446083068848 16.389638900756836, 230.6690158843994 16.242387771606445, 230.55448722839355 15.980611801147461, 230.45632362365723 15.816999435424805, 230.35815620422363 15.506139755249023, 230.0472927093506 15.457056045532227, 229.83220100402832 15.140348434448242, 229.54010200500488 14.73716926574707, 229.22923851013184 14.442667007446289, 228.86929512023926 14.213613510131836, 228.5420742034912 14.05000114440918, 228.2148494720459 14.148168563842773, 227.8221836090088 14.148168563842773, 227.2168254852295 13.984556198120117, 226.85687828063965 13.968194961547852, 226.49693489074707 14.05000114440918, 226.0879077911377 13.77186393737793, 225.80977058410645 13.755502700805664, 225.55567741394043 13.881429672241211, 225.3911952972412 14.058565139770508, 224.9426326751709 14.73716926574707, 224.76265907287598 14.73716926574707, 224.36999320983887 14.573556900024414, 223.97732734680176 14.802610397338867, 223.29015922546387 15.12983512878418, 222.70116233825684 15.391611099243164, 222.4393825531006 15.40797233581543, 221.93218803405762 15.40797233581543, 221.57224464416504 15.66975212097168, 221.4413547515869 16.09514045715332, 221.3431911468506 16.700498580932617, 221.39227104187012 17.07680320739746, 221.16321754455566 17.404027938842773, 220.89009284973145 17.53165626525879, 220.90144157409668 17.84577751159668, 221.14274787902832 17.76296043395996, 221.52316093444824 17.61672019958496, 221.86674308776855 18.074831008911133, 222.06307792663574 18.614748001098633, 221.8994655609131 18.860166549682617, 221.6376895904541 19.252832412719727, 221.62132835388184 19.59641456604004, 221.7358570098877 20.185415267944336, 221.94854927062988 20.774412155151367, 222.079439163208 21.26524543762207, 222.48846626281738 21.854246139526367, 222.99566078186035 22.508691787719727, 223.43741035461426 22.934080123901367, 223.78099250793457 23.13041114807129, 224.04277229309082 23.064966201782227, 224.3045482635498 22.999521255493164, 224.72993659973145 22.934080123901367, 224.9917163848877 22.88499641418457, 225.2862148284912 22.934080123901367, 225.72796440124512 23.01588249206543, 226.2351589202881 23.146772384643555, 226.61146354675293 23.27766227722168, 227.05321311950684 23.097688674926758, 227.42951774597168 22.934080123901367))'::geometry, '1976-01-01', 'ru', 'http://planetarynames.wr.usgs.gov/Feature/4454');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1847, 'Zeus Patera', 'SRID=104904;POINT (227.07 18.39)'::geometry, 'SRID=104904;POLYGON ((226.50457763673 18.675384521485, 226.51556396485 18.70834350586, 226.55401611329 18.766021728516, 226.6254272461 18.820953369141, 226.71881103516 18.853912353516, 226.82043457032 18.886871337891, 226.91107177735 18.886871337891, 226.99621582032 18.875885009766, 227.03741455079 18.873138427735, 226.99346923829 18.831939697266, 226.97973632813 18.77426147461, 226.99896240235 18.702850341797, 227.06213378907 18.631439208985, 227.15002441407 18.584747314454, 227.23516845704 18.568267822266, 227.30383300781875 18.59024047851625, 227.33404541016 18.628692626954, 227.34503173829 18.658905029297, 227.39721679688 18.587493896485, 227.42742919923 18.494110107422, 227.42193603516 18.408966064454, 227.39996337891 18.315582275391, 227.39172363282 18.227691650391, 227.34228515626 18.123321533204, 227.29559326173 18.018951416016, 227.21319580079 17.942047119141, 227.15551757813 17.903594970704, 227.09783935548 17.876129150391, 227.00170898438 17.845916748047, 226.9330444336 17.840423583985, 226.88635253907 17.840423583985, 226.90832519532 17.876129150391, 226.91381835938 17.925567626954, 226.90283203126 17.972259521485, 226.87536621094 18.021697998047, 226.82318115235 18.062896728516, 226.77923583985 18.098602294922, 226.83691406251 18.156280517579, 226.88360595704 18.233184814454, 226.91107177735 18.315582275391, 226.8890991211 18.40072631836, 226.88085937501 18.474884033204, 226.83142089844 18.507843017579, 226.72430419923 18.546295166016, 226.67761230469 18.584747314454, 226.6254272461 18.614959716797, 226.58972167969 18.617706298829, 226.62817382813 18.645172119141, 226.67761230469 18.650665283204, 226.61993408204 18.661651611329, 226.56500244141 18.64242553711, 226.4935913086 18.653411865235, 226.50457763673 18.675384521485))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15689');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1848, 'Athena Patera', 'SRID=104904;POINT (227.18 18.74)'::geometry, 'SRID=104904;POLYGON ((227.0290374756 18.766021728515, 227.04002380372 18.807220458984, 227.06062316896 18.840179443359, 227.08259582521 18.867645263671, 227.12928771974 18.880004882812, 227.17597961427 18.877258300781, 227.22541809083 18.866271972656, 227.28172302247 18.825073242187, 227.31605529786 18.775634765624, 227.328414917 18.731689453124, 227.33116149903 18.691864013671, 227.30369567872 18.656158447265, 227.2844696045 18.619079589843, 227.23915100099 18.599853515624, 227.18147277833 18.599853515624, 227.10594177247 18.624572753906, 227.05513000489 18.665771484374, 227.02491760255 18.705596923828, 227.0207977295 18.744049072265, 227.0290374756 18.766021728515))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15693');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1850, 'Apollo Patera', 'SRID=104904;POINT (226.45 17.94)'::geometry, 'SRID=104904;POLYGON ((226.28540039064 17.909774780272, 226.27441406252 17.938613891601, 226.26754760744 17.981185913085, 226.27716064455 18.027877807616, 226.30325317385 18.074569702147, 226.35818481447 18.091049194335, 226.40075683596 18.091049194335, 226.46804809572 18.073196411132, 226.52572631838 18.045730590819, 226.56967163088 18.023757934569, 226.63146972658 17.946853637694, 226.63558959963 17.878189086913, 226.62185668947 17.83836364746, 226.61911010744 17.806777954101, 226.59439086916 17.788925170897, 226.52847290041 17.780685424804, 226.45980834963 17.808151245116, 226.40899658205 17.832870483397, 226.37878417971 17.841110229491, 226.33758544924 17.864456176757, 226.30462646486 17.887802124022, 226.28540039064 17.909774780272))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15694');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1851, 'Olympus Paterae', 'SRID=104904;POINT (226.81 18.32)'::geometry, 'SRID=104904;POLYGON ((226.14367675781 18.452911376953, 226.16564941406 18.513336181641, 226.2041015625 18.554534912109, 226.23431396484 18.592987060547, 226.30572509766 18.625946044922, 226.36889648438 18.650665283203, 226.42108154297 18.653411865234, 226.45678710938 18.642425537109, 226.49249267578 18.700103759766, 226.54193115234 18.755035400391, 226.58312988281 18.809967041016, 226.65454101563 18.845672607422, 226.72320556641 18.870391845703, 226.82757568359 18.895111083984, 226.88525390625 18.911590576172, 226.96545410157 18.900604248046, 227.0121459961 18.900604248046, 227.04785156251 18.889617919921, 227.08355712891 18.906097412109, 227.13299560548 18.917083740234, 227.21813964844 18.911590576171, 227.28405761719 18.875885009765, 227.33349609376 18.829193115234, 227.37194824219 18.771514892578, 227.37744140626 18.735809326171, 227.38156127930375 18.711776733397812, 227.3808746337928 18.69255065917931, 227.37469482423 18.675384521484, 227.40216064454 18.620452880859, 227.43237304688 18.571014404296, 227.4515991211 18.496856689453, 227.45709228516 18.441925048828, 227.44885253907 18.38150024414, 227.44061279298 18.323822021484, 227.43237304688 18.277130126953, 227.41589355469 18.202972412109, 227.38018798829 18.120574951171, 227.34448242188 18.05191040039, 227.31701660157 17.999725341796, 227.26757812501 17.950286865234, 227.22088623048 17.911834716796, 227.17419433594 17.870635986328, 227.12475585938 17.848663330078, 227.03686523438 17.821197509765, 226.97918701173 17.801971435546, 226.88580322266 17.815704345703, 226.85009765626 17.790985107421, 226.81439208985 17.769012451171, 226.7484741211 17.741546630859, 226.68530273438 17.733306884765, 226.62762451173 17.738800048828, 226.57543945313 17.736053466796, 226.50128173829 17.72232055664, 226.39416503907 17.758026123046, 226.32550048829 17.78823852539, 226.29803466798 17.823944091796, 226.27056884766 17.843170166015, 226.21289062501 17.89810180664, 226.20465087891 17.966766357421, 226.22937011719 18.035430908203, 226.20465087891 18.084869384765, 226.18267822266 18.13980102539, 226.17169189454 18.18374633789, 226.17993164063 18.20571899414, 226.15795898438 18.252410888671, 226.13873291016 18.318328857421, 226.13049316407 18.389739990234, 226.14367675781 18.452911376953))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15695');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1870, 'Dionysus Patera', 'SRID=104904;POINT (226.77 17.96)'::geometry, 'SRID=104904;POLYGON ((226.53973388672 18.046417236328, 226.564453125 18.082122802735, 226.60015869141 18.11508178711, 226.64410400391 18.134307861328, 226.71826171875 18.117828369141, 226.77868652344 18.09310913086, 226.83361816406 18.043670654297, 226.87756347656 17.988739013672, 226.89129638672 17.936553955078, 226.8720703125 17.870635986328, 226.828125 17.82943725586, 226.7484741211 17.799224853516, 226.68530273438 17.793731689453, 226.64959716797 17.78549194336, 226.61389160156 17.782745361328, 226.63037109375 17.848663330078, 226.63037109375 17.914581298828, 226.62213134766 17.972259521485, 226.58093261719 18.021697998047, 226.53973388672 18.046417236328))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15692');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1871, 'Hera Patera', 'SRID=104904;POINT (226.23 18.45)'::geometry, 'SRID=104904;POLYGON ((226.21000671387 18.244171142578, 226.18116760254063 18.30047607421875, 226.17567443848188 18.347167968749623, 226.17155456543125 18.41445922851525, 226.19902038575 18.489990234375377, 226.24021911621563 18.549041748046875, 226.32124328613438 18.602600097655873, 226.37892150879125 18.616333007812376, 226.44209289551 18.61083984375, 226.396774292 18.582000732422, 226.3610687255875 18.55316162109375, 226.31986999512 18.511962890625, 226.2827911377 18.474884033203, 226.27043151856 18.428192138672, 226.24845886231 18.367767333984, 226.24021911621 18.21533203125, 226.21000671387 18.244171142578))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15691');
-- TEST GIS DATA FROM OPENSTREETMAP: EARTH, Ancienne Sylvie
--Testcase 14:
CREATE TABLE "♁" (
geom public.geometry NOT NULL,
osm_type varchar(16) NOT NULL,
osm_id int8 NOT NULL,
ver int2 NOT NULL,
arr _int8 NULL,
t json NULL
);
--Testcase 15: ETC...
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4596087 59.6907755)'::geometry, 'node', 1621246531, 4, NULL, '{"drain":"disperse"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601391 59.6904673)'::geometry, 'node', 1621246620, 24, NULL, '{"access":"yes","addr:housenumber":"20 литВЕ","addr:street":"Садовая улица","architect":"Ж.-Ф. Тома де Томон","barrier":"gate","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6458/","historic":"yes","locked":"no","name":"Ворота памятника Любезным родителям","ref:okn":"781610399040286","start_date":"1807","tourism":"attraction","wikidata":"Q118122048"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617098 59.6910199)'::geometry, 'node', 1632220259, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617672 59.6909141)'::geometry, 'node', 1632220283, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461757 59.6909696)'::geometry, 'node', 1632220292, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614802 59.6907676)'::geometry, 'node', 1632220315, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615866 59.6907823)'::geometry, 'node', 1632220319, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611444 59.6908848)'::geometry, 'node', 1632220350, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611916 59.6908345)'::geometry, 'node', 1632220355, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.46127 59.6907954)'::geometry, 'node', 1632220358, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611342 59.6909402)'::geometry, 'node', 1632220359, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614212 59.6910868)'::geometry, 'node', 1632220364, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611621 59.6909941)'::geometry, 'node', 1632220366, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616766 59.6908145)'::geometry, 'node', 1632220378, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616314 59.691059)'::geometry, 'node', 1632220590, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613148 59.6910721)'::geometry, 'node', 1632220686, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613385 59.6907988)'::geometry, 'node', 1632497609, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6476/","historic":"yes","historic:start_date":"1794","int_name":"Euterpe","material":"metal","name":"Эвтерпа","name:el":"Εὐτέρπη","name:la":"Euterpē","name:uk":"Евтерпа","name:zh":"欧忒耳佩","note":"Ошибочно подписано «Clio»","ref":"П-61/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614438 59.6907856)'::geometry, 'node', 1632497610, 30, NULL, '{"alt_name:el":"Χλωρίς","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1796","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6475/","historic":"yes","historic:start_date":"1796","int_name":"Flore","material":"metal","name":"Флора","name:el":"Φλόρα","name:en":"Flora","ref":"П-62/1","ref:okn":"781610399040456","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461244 59.690833)'::geometry, 'node', 1632497611, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6470/","historic":"yes","historic:start_date":"1795","int_name":"Melpomene","material":"metal","name":"Мельпомена","name:el":"Μελπομένη","name:en":"Melpomene","name:la":"Melpomenē","name:uk":"Мельпомена","name:zh":"墨爾波墨涅","ref":"П-60/1","ref:okn":"781610399040376","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617227 59.6909514)'::geometry, 'node', 1632497612, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6468/","historic":"yes","historic:start_date":"1793","int_name":"Caliope","material":"metal","name":"Калиопа","name:el":"Καλλιόπη","name:la":"Calliopē","name:uk":"Калліопа","name:zh":"卡利俄佩","ref":"П-65/1","start_date":"1798","tourism":"artwork","wikidata":"Q120979306"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615805 59.6907985)'::geometry, 'node', 1632497613, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6474/","historic":"yes","historic:start_date":"1795","int_name":"Uranie","material":"metal","name":"Урания","name:el":"Οὐρανία","name:la":"Ūrania","ref":"П-63/1","ref:okn":"78161039904044","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616825 59.6908428)'::geometry, 'node', 1632497614, 29, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6469/","historic":"yes","historic:start_date":"1794","material":"metal","name":"Клио","name:el":"Κλειώ","name:la":"Clīō","note":"Подписано «Euterpe»","ref":"П-64/1","ref:okn":"781610399040466","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614541 59.6909278)'::geometry, 'node', 1632497615, 34, NULL, '{"alt_name":"Аполлон Бельведерский","artist_name":"Леохар;модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1782","artwork_type":"statue","description":"Иконография Бельведерского типа. В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6466/","historic":"yes","historic:start_date":"1782","material":"metal","name":"Аполлон","name:en":"Apollo","name:zh":"阿波罗神像","ref":"П-71/1","ref:okn":"781610399040386","start_date":"1817","tourism":"artwork","wikidata":"Q118122062"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616021 59.6910564)'::geometry, 'node', 1632497616, 26, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1780","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","historic":"yes","historic:start_date":"1780","material":"metal","name":"Венера Каллипиги","ref":"П-67/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616651 59.6910293)'::geometry, 'node', 1632497617, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6471/","historic":"yes","historic:start_date":"1793","int_name":"Polymnia","material":"metal","name":"Полигимния","name:el":"Πολύμνια","name:la":"Polyhymnia","name:uk":"Полігімнія","name:zh":"波吕许谟尼亚","ref":"П-66/1","ref:okn":"781610399040726","start_date":"1798","tourism":"artwork","wikidata":"Q121395079"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614666 59.6910732)'::geometry, 'node', 1632497618, 30, NULL, '{"alt_name":"Гермес Флорентийский","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6467/","historic":"yes","historic:start_date":"1794","int_name":"Hermes","material":"metal","name":"Меркурий","name:en":"Mercury","ref":"П-68/1","ref:okn":"781610399040396","start_date":"1810","tourism":"artwork","wikidata":"Q121395060"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613231 59.6910597)'::geometry, 'node', 1632497619, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_subject:wikidata":"Q104413","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6477/","historic":"yes","historic:start_date":"1793","int_name":"Erato","material":"metal","name":"Эрато","name:el":"Ἐρατώ","name:ka":"ერატო","name:ko":"에라토","name:la":"Eratō","name:uk":"Ерато","name:zh":"厄剌托","ref":"П-69/1","ref:okn":"781610399040476","start_date":"1798","tourism":"artwork","wikidata":"Q121395110"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612077 59.691005)'::geometry, 'node', 1632497620, 31, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6473/","historic":"yes","historic:start_date":"1794","int_name":"Terpsichore","material":"metal","name":"Терпсихора","name:el":"Τερψιχόρη","name:en":"Terpsichore","name:la":"Terpsichore","ref":"П-70/1","ref:okn":"781610399040436","start_date":"1798","tourism":"artwork","wikidata":"Q121395096"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611782 59.690902)'::geometry, 'node', 1632497621, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1792","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6472/","historic":"yes","historic:start_date":"1792","int_name":"Thalie","material":"metal","name":"Талия","name:el":"Θαλία","name:la":"Thalīa","name:uk":"Талія","name:zh":"塔利亚","ref":"П-59/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612041 59.6907321)'::geometry, 'node', 1632503254, 6, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.462536 59.6908707)'::geometry, 'node', 1652587953, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4619277 59.6908578)'::geometry, 'node', 1652587958, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617256 59.6909215)'::geometry, 'node', 3177639362, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612018 59.6909805)'::geometry, 'node', 3188928044, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613001 59.6906759)'::geometry, 'node', 3218618266, 4, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614144 59.6907882)'::geometry, 'node', 4912277772, 4, NULL, '{"board_type":"history","information":"board","name":"Флора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615482 59.6907937)'::geometry, 'node', 4912277773, 4, NULL, '{"board_type":"history","information":"board","name":"Урания","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613145 59.6908057)'::geometry, 'node', 4912277774, 4, NULL, '{"board_type":"history","information":"board","name":"Эвтерпа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616653 59.6908341)'::geometry, 'node', 4912277775, 4, NULL, '{"board_type":"history","information":"board","name":"Клио","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612216 59.6908451)'::geometry, 'node', 4912277776, 4, NULL, '{"board_type":"history","information":"board","name":"Мельпомена","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611751 59.690919)'::geometry, 'node', 4912277777, 4, NULL, '{"board_type":"history","information":"board","name":"Талия","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617272 59.6909351)'::geometry, 'node', 4912277778, 4, NULL, '{"board_type":"history","information":"board","name":"Калиопа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612298 59.691015)'::geometry, 'node', 4912277779, 4, NULL, '{"board_type":"history","information":"board","name":"Терпсихора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616819 59.6910157)'::geometry, 'node', 4912277780, 4, NULL, '{"board_type":"history","information":"board","name":"Полигимния","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461621 59.6910498)'::geometry, 'node', 4912277781, 4, NULL, '{"board_type":"history","information":"board","name":"Венера Каллипиги","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613548 59.6910624)'::geometry, 'node', 4912277782, 4, NULL, '{"board_type":"history","information":"board","name":"Эрато","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615016 59.6910712)'::geometry, 'node', 4912277783, 4, NULL, '{"board_type":"history","information":"board","name":"Меркурий","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608954 59.6897746)'::geometry, 'node', 5251698420, 25, NULL, '{"access":"permissive","addr:housenumber":"20 литББ","addr:street":"Садовая улица","architect":"Винченцо Бренна","barrier":"gate","description:access":"Ворота можно закрывать и открывать руками","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6459/","historic":"yes","locked":"no","name":"Большие Старосильвийские ворота","ref":"1","ref:okn":"781620399040626","start_date":"1786..1793","tourism":"attraction","website":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","wheelchair":"yes","wikidata":"Q118122050"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460198 59.6905729)'::geometry, 'node', 6758903438, 6, NULL, '{"artist_name":"И.П. Мартос","artwork_type":"sculpture","height":"4","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4625734 59.6908311)'::geometry, 'node', 8331430683, 3, NULL, '{"inlet":"grate","manhole":"drain","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614743 59.690923)'::geometry, 'node', 8530936200, 1, NULL, '{"board_type":"history","information":"board","name":"Аполлон","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4597619 59.6907527)'::geometry, 'node', 9140565043, 1, NULL, '{"ford":"yes"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4606891 59.6906687)'::geometry, 'node', 9140576937, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608515 59.6907117)'::geometry, 'node', 9140576938, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613945 59.6911519)'::geometry, 'node', 9143069530, 5, NULL, '{"drain":"no","source:direction":"survey"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('POINT (30.4615903 59.6911716)'::geometry, 'node', 9143069534, 1, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460339 59.6906064)'::geometry, 'node', 9143093777, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601191 59.6906349)'::geometry, 'node', 9143093778, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610445 59.6908345)'::geometry, 'node', 9143093802, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610243 59.6909861)'::geometry, 'node', 9143093804, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612126 59.691117)'::geometry, 'node', 9143093806, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460445 59.6910504)'::geometry, 'node', 9656736571, 2, NULL, '{"colour":"#4e3a39","description":"Веломаршрут №4","height":"4","information":"guidepost","material":"metal","start_date":"2021-03..2021-10","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4608056 59.6895935, 30.4608954 59.6897746, 30.4609447 59.6898691, 30.4614541 59.6909278)'::geometry, 'way', 30995960, 42, '{9140727117,5251698420,1518870630,1632497615}', '{"highway":"footway","historic":"yes","name":"Центральная аллея","ref":"VII","source:name":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605616 59.6906319, 30.4597619 59.6907527, 30.4596087 59.6907755)'::geometry, 'way', 149099000, 6, '{1621246509,9140565043,1621246531}', '{"intermittent":"yes","source:direction":"isoline","start_date":"1786","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604741 59.6903357, 30.4604598 59.6904575, 30.4604646 59.6905099, 30.4604784 59.6905443, 30.4604933 59.6905665, 30.4605321 59.6905996, 30.4605616 59.6906319)'::geometry, 'way', 149099004, 8, '{1621246503,9140576877,1621246482,1621246465,1621246454,9140576939,1621246509}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601177 59.6905796, 30.4600903 59.6905709, 30.4600721 59.6905605, 30.4600579 59.6905458, 30.4600519 59.6905296, 30.4600545 59.6905133, 30.4600656 59.6904979, 30.4600844 59.6904845, 30.4601095 59.690474, 30.4601391 59.6904673, 30.460169 59.6904648, 30.4601991 59.6904661, 30.4602277 59.6904711, 30.4602498 59.6904787, 30.4602686 59.6904892, 30.4602829 59.6905018, 30.4602918 59.6905174, 30.4602917 59.6905327, 30.4602881 59.6905462, 30.4602793 59.6905579)'::geometry, 'way', 149099028, 5, '{9140576951,9140576902,9140576952,1621246602,1621246607,1621246668,1621246614,1621246615,1621246618,1621246620,1621246630,1621246244,1621246631,1621246224,1621246250,1621246635,1621246647,9140576950,9140576903,9140576949}', '{"barrier":"fence","colour":"green","fence_type":"wood","height":"2"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4603352 59.6911039, 30.460353 59.6910638, 30.4603719 59.6910414, 30.4603979 59.691021, 30.4604807 59.6909761, 30.460577 59.6909284, 30.4606406 59.6908886, 30.460669 59.6908562, 30.460673 59.6908234, 30.4606633 59.6907504, 30.4606582 59.6907286, 30.4606491 59.6907025, 30.4606314 59.690668, 30.460609 59.690636, 30.4605858 59.6906064, 30.4605578 59.6905735, 30.4605362 59.6905385, 30.4605214 59.6905022, 30.4605119 59.6904644, 30.4605095 59.6904098, 30.460512 59.6903499, 30.4605096 59.6903011)'::geometry, 'way', 149099029, 36, '{9140727237,4260007753,9140727241,8650331583,1621246592,1621246588,1621246578,1652603857,9140727240,8650331584,1621246577,9143093738,1621246419,9140576875,1652603906,9140576876,1621246542,8650331586,9140576874,8650331585,1621246403,9140576873,1239612684}', '{"alt_name":"Окружная дорожка","highway":"footway","historic":"yes","name":"Круговая дорожка","start_date":"1789.1793","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610979 59.6907799, 30.4608515 59.6907117)'::geometry, 'way', 149099034, 9, '{1632503255,9140576938}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4629005 59.6913411, 30.4614541 59.6909278)'::geometry, 'way', 150294524, 8, '{1239612692,1632497615}', '{"highway":"footway","historic":"yes","ref":"III","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613148 59.6910721, 30.4613667 59.6910818, 30.4614212 59.6910868, 30.4614766 59.6910869, 30.4615311 59.6910822, 30.4615833 59.6910728, 30.4616314 59.691059, 30.461674 59.6910412, 30.4617098 59.6910199, 30.4617378 59.6909958, 30.461757 59.6909696, 30.4617669 59.6909421, 30.4617672 59.6909141, 30.4617579 59.6908866, 30.4617393 59.6908603, 30.4617119 59.690836, 30.4616766 59.6908145, 30.4616343 59.6907964, 30.4615866 59.6907823, 30.4615347 59.6907726, 30.4614802 59.6907676, 30.4614248 59.6907674, 30.4613703 59.6907721, 30.4613181 59.6907815, 30.46127 59.6907954, 30.4612274 59.6908132, 30.4611916 59.6908345, 30.4611636 59.6908586, 30.4611444 59.6908848, 30.4611345 59.6909123, 30.4611342 59.6909402, 30.4611435 59.6909678, 30.4611621 59.6909941, 30.4611895 59.6910184, 30.4612248 59.6910399, 30.461267 59.6910579, 30.4613148 59.6910721)'::geometry, 'way', 150294525, 6, '{1632220686,9143093824,1632220364,9143093807,1632220588,9143093808,1632220590,9143093809,1632220259,9143093810,1632220292,9143093811,1632220283,9143093812,1632220296,9143093813,1632220378,9143093814,1632220319,9143093815,1632220315,9143093816,1632220323,9143093817,1632220358,9143093818,1632220355,9143093819,1632220350,9143093820,1632220359,9143093821,1632220366,9143093822,1632220374,9143093823,1632220686}', '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.460726 59.6910052, 30.460614 59.6910145, 30.4605241 59.69102, 30.4604597 59.691022, 30.4603979 59.691021)'::geometry, 'way', 150294532, 30, '{1632497615,1632220252,9140727238,9140727242,9140727239,1621246592}', '{"highway":"footway","historic":"yes","name":"луч домика Крик","ref":"X","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605096 59.6903011, 30.4614541 59.6909278)'::geometry, 'way', 150294541, 8, '{1239612684,1632497615}', '{"highway":"footway","historic":"yes","ref":"VIII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4617339 59.6901702)'::geometry, 'way', 150294547, 9, '{1632497615,1518870645}', '{"highway":"footway","historic":"yes","ref":"VI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461819 59.6910085, 30.4618473 59.6909863, 30.4618928 59.6909647, 30.461951 59.6909401, 30.4620356 59.6909251, 30.462536 59.6908707)'::geometry, 'way', 152440395, 6, '{1652587944,1652587948,1652587950,9143093800,1652587952,1652587953}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613063 59.6907075, 30.4612631 59.6907161, 30.4612041 59.6907321)'::geometry, 'way', 152442436, 10, '{1652605207,9143204222,1632503254}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4617627 59.6907689, 30.4618218 59.6907946, 30.4618794 59.6908253, 30.4619277 59.6908578)'::geometry, 'way', 152442438, 8, '{1652605205,1652605201,1652605200,1652587958}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4612018 59.6909805, 30.4617256 59.6909215, 30.4625734 59.6908311, 30.4628306 59.6908088)'::geometry, 'way', 311975108, 20, '{3188928044,3177639362,8331430683,7911801321}', '{"layer":"-1","name":"Старосильвийская дождевая канализация","source:direction":"survey","tunnel":"yes","waterway":"drain"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611708 59.6911018, 30.4611289 59.6910829, 30.4610793 59.6910531, 30.4610552 59.6910294, 30.4610432 59.6910153, 30.4610243 59.6909861)'::geometry, 'way', 313051687, 8, '{1632503180,9143069533,9143093805,9143069532,1632503185,9143093804}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061)'::geometry, 'way', 426269715, 5, '{4255746051,4255746033,9140576943,9140576942,9140576941,9140576940,4255746057,4255746007,9140576945,9140576946,9140576944,4255746054,4255745992,4255746051}', '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603979 59.691021, 30.4603224 59.6910067, 30.4602382 59.6909843, 30.4601137 59.6909482, 30.4600256 59.6909178, 30.4599203 59.6908773, 30.4597958 59.6908259, 30.4597422 59.6908088, 30.4596966 59.6907997, 30.4596501 59.6907961, 30.4596189 59.6907966, 30.4595885 59.6908005, 30.4595518 59.6908091, 30.4595101 59.6908241)'::geometry, 'way', 438780267, 20, '{1621246592,1621246561,1622496989,8850590008,1621246248,1621246252,8650331580,8849369897,9140576840,8650331579,9140576841,8650331578,9140576842,1622496957}', '{"highway":"footway","historic":"yes","loc_name":"Спуск у места домика Крик","name":"Криковская дорога","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4625498 59.6908065, 30.4614541 59.6909278)'::geometry, 'way', 750779153, 4, '{1632220250,1632497615}', '{"highway":"footway","historic":"yes","ref":"IV","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4631938 59.6918756)'::geometry, 'way', 750779155, 5, '{1632497615,1195120146}', '{"highway":"footway","historic":"yes","ref":"II","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4606491 59.6907025)'::geometry, 'way', 750779156, 5, '{1632497615,1621246419}', '{"highway":"footway","historic":"yes","ref":"IX","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4625914 59.6924527)'::geometry, 'way', 750779157, 4, '{1632497615,1652587960}', '{"highway":"footway","historic":"yes","ref":"I","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611165 59.6918779, 30.46118 59.6916919, 30.4614541 59.6909278)'::geometry, 'way', 750779158, 4, '{9159459639,1239612686,1632497615}', '{"highway":"footway","historic":"yes","ref":"XII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4596189 59.6907966, 30.4596712 59.6907865, 30.4597275 59.6907729, 30.459757 59.6907607, 30.4597619 59.6907527, 30.4597677 59.6907431, 30.4597919 59.6907269, 30.4598455 59.6907093, 30.459934 59.6906931, 30.4600118 59.6906782, 30.4600467 59.690666, 30.4600681 59.6906484, 30.4600725 59.6906275, 30.4600655 59.6906044, 30.4600295 59.6905552, 30.4600066 59.6905268, 30.4600031 59.690512, 30.4600111 59.6904995, 30.460044 59.6904799, 30.4600789 59.6904629, 30.4601241 59.6904473)'::geometry, 'way', 988944864, 2, '{9140576841,9140565053,9140565052,9140565051,9140565043,9140565050,9140565049,9140565048,9140565047,9140565046,9140565045,9140565044,1621246253,9140565042,1621246302,1621246323,9140576899,9140576892,9143093786,9143093785,1621246340}', '{"highway":"path","surface":"ground"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4607784 59.690696, 30.4606891 59.6906687)'::geometry, 'way', 988944880, 3, '{9140576936,9140576937}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601316 59.6905738, 30.4601383 59.6905745, 30.460144 59.6905725, 30.4601453 59.6905691, 30.4601415 59.6905663, 30.4601348 59.6905656, 30.4601291 59.6905676, 30.4601278 59.6905709, 30.4601316 59.6905738)'::geometry, 'way', 989184163, 1, '{9142788307,9142788306,9142788305,9142788304,9142788303,9142788302,9142788301,9142788300,9142788307}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601637 59.6905695, 30.4601704 59.6905701, 30.4601761 59.6905682, 30.4601774 59.6905648, 30.4601736 59.6905619, 30.4601668 59.6905613, 30.4601612 59.6905632, 30.4601599 59.6905666, 30.4601637 59.6905695)'::geometry, 'way', 989184166, 1, '{9142819031,9142819030,9142819029,9142819028,9142819027,9142819026,9142819025,9142819024,9142819031}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4615026 59.6911479, 30.4614481 59.6911519, 30.4613945 59.6911519)'::geometry, 'way', 989211851, 4, '{1652605211,9143069529,9143069530}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603719 59.6910414, 30.4597387 59.6911122)'::geometry, 'way', 989211857, 12, '{8650331583,4260007752}', '{"highway":"path","historic":"yes","name":"луч домика Крик","start_date":"1780.1785"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603446 59.6911727, 30.4603806 59.6910714, 30.4603967 59.691047, 30.4604235 59.6910376, 30.4604664 59.6910348, 30.4605415 59.6910308)'::geometry, 'way', 989211858, 1, '{9143069609,9143069608,9143069607,9143069606,9143069605,9143069604}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613583 59.6906799, 30.4614025 59.6907746, 30.461428 59.6907726, 30.4614548 59.6907726, 30.4614763 59.6907739)'::geometry, 'way', 989211859, 1, '{9143093728,9143093727,9143093726,9143093725,9143093724}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461314 59.6906832, 30.461361 59.6907794, 30.4613301 59.6907854, 30.4613033 59.6907929, 30.4612845 59.690799, 30.4609841 59.6905973)'::geometry, 'way', 989211860, 1, '{9143093729,9143093730,9143093731,9143093732,9143093734,9143093733}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611484 59.6909364, 30.4611471 59.6909174, 30.4611497 59.6909005, 30.4611578 59.6908836, 30.4611645 59.6908714, 30.4611739 59.6908606, 30.4606917 59.6907283, 30.460681 59.6907283, 30.460677 59.6907337, 30.460685 59.6907601, 30.4606891 59.6907817, 30.4606917 59.6908129, 30.4606944 59.6908426, 30.4606837 59.6908656, 30.4606596 59.6908927, 30.4606247 59.6909184, 30.460563 59.6909523, 30.460453 59.6910064)'::geometry, 'way', 989211861, 1, '{9143093739,9143093740,9143093741,9143093742,9143093743,9143093744,9143093755,9143093737,9143093736,9143093754,9143093753,9143093722,9143093721,9143093720,9143093719,9143093718,9143093717,9143069616}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605335 59.6903364, 30.4605335 59.6903946, 30.4605308 59.6904501, 30.4605348 59.6904813, 30.4605442 59.6905137, 30.4605576 59.6905394, 30.4605818 59.6905773, 30.4606193 59.6906247, 30.4606408 59.6906545, 30.4606596 59.6906856, 30.4606716 59.6906958, 30.4606958 59.6907039, 30.4611947 59.6908433, 30.4612155 59.6908301, 30.4612369 59.6908166, 30.461253 59.6908098, 30.4609492 59.6906112)'::geometry, 'way', 989211862, 1, '{9143093764,9143093763,9143093762,9143093748,9143093761,9143093760,9143093759,9143093758,9143093757,9143093756,9143093752,9143093751,9143093750,9143093747,9143093746,9143093745,9143093735}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604919 59.6903357, 30.4604919 59.690398, 30.4604892 59.6904494, 30.4604946 59.690486, 30.4605053 59.6905157, 30.4605161 59.6905387, 30.4605402 59.6905766, 30.4605778 59.690624, 30.4605992 59.6906538, 30.460626 59.6906931, 30.4606368 59.6907255, 30.4606448 59.6907574, 30.4606502 59.6907871, 30.4606542 59.6908196, 30.4606502 59.6908494, 30.4606327 59.6908751, 30.4606059 59.6908927, 30.4605496 59.6909266, 30.4604128 59.6909942)'::geometry, 'way', 989211863, 1, '{9143093776,9143093775,9143093774,9143093773,9143093749,9143093772,9143093771,9143093770,9143093769,9143093768,9143093767,9143093765,9143093766,9143069615,9143069610,9143069614,9143069613,9143069612,9143069611}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619893 59.6908956, 30.4620356 59.6909251)'::geometry, 'way', 989211867, 2, '{1652587955,1652587952}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610753 59.6908007, 30.4610979 59.6907799)'::geometry, 'way', 989211868, 4, '{9143093801,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611491 59.6907553, 30.4610979 59.6907799)'::geometry, 'way', 989211869, 4, '{1632503177,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461012 59.6909572, 30.4610056 59.6909157, 30.4610163 59.6908698, 30.4610445 59.6908345)'::geometry, 'way', 989211870, 4, '{1632503179,9143093803,1632503181,9143093802}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613456 59.6911475, 30.46131 59.6911438, 30.4612696 59.6911343, 30.4612126 59.691117)'::geometry, 'way', 989211871, 4, '{1652605209,9143069531,1632503237,9143093806}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4622826 59.6903796)'::geometry, 'way', 991343632, 2, '{1632497615,1518870652}', '{"highway":"footway","historic":"yes","ref":"V","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4620021 59.690877, 30.4617551 59.6909043, 30.4617579 59.690914, 30.4617593 59.6909255, 30.4617606 59.6909377)'::geometry, 'way', 991343633, 1, '{9159456550,9159456549,9159456545,9159456544,9159456543}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619941 59.6908547, 30.4617471 59.690882, 30.4617392 59.6908714, 30.4617298 59.6908606, 30.4617164 59.6908491)'::geometry, 'way', 991343634, 1, '{9159456552,9159456551,9159456548,9159456547,9159456546}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4602794 59.6911745, 30.4603083 59.6910871)'::geometry, 'way', 991343661, 1, '{9159459675,9159459674}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4614541 59.6909278)'::geometry, 'way', 1042527594, 11, '{9140727237,1632497615}', '{"highway":"footway","historic":"yes","name":"луч Амфитеатра","ref":"XI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4611342 59.6909402, 30.4611345 59.6909123, 30.4611444 59.6908848, 30.4611636 59.6908586, 30.4611916 59.6908345, 30.4612274 59.6908132, 30.46127 59.6907954, 30.4613181 59.6907815, 30.4613703 59.6907721, 30.4614248 59.6907674, 30.4614802 59.6907676, 30.4615347 59.6907726, 30.4615866 59.6907823, 30.4616343 59.6907964, 30.4616766 59.6908145, 30.4617119 59.690836, 30.4617393 59.6908603, 30.4617579 59.6908866, 30.4617672 59.6909141, 30.4617669 59.6909421, 30.461757 59.6909696, 30.4617378 59.6909958, 30.4617098 59.6910199, 30.461674 59.6910412, 30.4616314 59.691059, 30.4615833 59.6910728, 30.4615311 59.6910822, 30.4614766 59.6910869, 30.4614212 59.6910868, 30.4613667 59.6910818, 30.4613148 59.6910721, 30.461267 59.6910579, 30.4612248 59.6910399, 30.4611895 59.6910184, 30.4611621 59.6909941, 30.4611435 59.6909678, 30.4611342 59.6909402)))'::geometry, 'way', 150294525, 6, NULL, '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034)))'::geometry, 'way', 426269715, 5, NULL, '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601599 59.6905666, 30.4601612 59.6905632, 30.4601668 59.6905613, 30.4601736 59.6905619, 30.4601774 59.6905648, 30.4601761 59.6905682, 30.4601704 59.6905701, 30.4601637 59.6905695, 30.4601599 59.6905666)))'::geometry, 'way', 989184166, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text, gm1 geometry, gg1 geography) SERVER sqlite_svr;
--Testcase 41: ERR - raster
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, read PostGOS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49: ERR, no SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 50: ERR, no SRID
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 52:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 53: ERR damaged, but there is SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = (decode('0101000020e6100000bf72ce99fe76', 'hex')::geometry);
-- Insert PostGIS/GEOS BLOB, read SpatiaLite BLOB
--Testcase 54: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 55:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 56:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 57: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 58:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 59:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 60: ERR damaged geometry, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (3, decode('0101000020e6100000bf72ce99fe76', 'hex'), NULL, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 61: ERR damaged geography, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (4, NULL, decode('0101000020e6100000bf72ce99fe76', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 62:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 63:
INSERT INTO "♂" SELECT * FROM "♂"."テスト";
--Testcase 64:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 65:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 66:
SELECT * FROM "♂";
--Testcase 67:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 69:
SELECT * FROM "♂";
--Testcase 70:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL ,
osm_id bigint OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t text
) SERVER sqlite_svr OPTIONS (table '♁');
--Testcase 71: ERR - No SRID
INSERT INTO "♁ FDW" SELECT * FROM "♁";
--Testcase 72: OK
SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 73:
UPDATE "♁" SET geom = ST_SetSRID(geom, 4326);
--Testcase 74:
INSERT INTO "♁ FDW" SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 75:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE bytea;
--Testcase 76:
SELECT * FROM "♁ FDW";
--Testcase 77:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE geometry;
--Testcase 78:
SELECT * FROM "♁ FDW";
--Testcase 79:
DROP FOREIGN TABLE "♂";
--Testcase 80:
DROP FOREIGN TABLE "♁ FDW";
--Testcase 81:
DROP TABLE "♁";
--Testcase 82:
DROP TABLE "♂"."テスト";
--Testcase 83:
DROP SCHEMA "♂";
-- Test operators implemented in PostGIS 3.4.2, other are not tested
-- SELECT testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 100 -> TC 150 -> TC200 -> TC250
-- WHERE testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 300 -> TC 350 -> TC400 -> TC450
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ gm1 g FROM "types_PostGIS";
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && gm1 g FROM "types_PostGIS";
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << gm1 g FROM "types_PostGIS";
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> gm1 g FROM "types_PostGIS";
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< gm1 g FROM "types_PostGIS";
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> gm1 g FROM "types_PostGIS";
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| gm1 g FROM "types_PostGIS";
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> gm1 g FROM "types_PostGIS";
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| gm1 g FROM "types_PostGIS";
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> gm1 g FROM "types_PostGIS";
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= gm1 g FROM "types_PostGIS";
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm = gm1 g FROM "types_PostGIS";
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| gm1 g FROM "types_PostGIS";
--Testcase 115
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> gm1 g FROM "types_PostGIS";
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> gm1 g FROM "types_PostGIS";
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ gm1 g FROM "types_PostGIS";
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ gm1 g FROM "types_PostGIS";
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 157:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 159:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> gg1 g FROM "types_PostGIS";
--Testcase 201:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && gg1 g FROM "types_PostGIS";
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> gg1 g FROM "types_PostGIS";
--Testcase 203:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg = gg1 g FROM "types_PostGIS";
--Testcase 204
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != gg1 g FROM "types_PostGIS";
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 300:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ gm1 IS NOT NULL;
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && gm1 IS NOT NULL;
--Testcase 302:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << gm1 IS NOT NULL;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> gm1 IS NOT NULL;
--Testcase 304:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< gm1 IS NOT NULL;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> gm1 IS NOT NULL;
--Testcase 306:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| gm1 IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> gm1 IS NOT NULL;
--Testcase 308:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| gm1 IS NOT NULL;
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> gm1 IS NOT NULL;
--Testcase 310:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= gm1 IS NOT NULL;
--Testcase 311:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm = gm1 IS NOT NULL;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& gm1 IS NOT NULL;
--Testcase 313:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| gm1 IS NOT NULL;
--Testcase 314:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> gm1 IS NOT NULL;
--Testcase 315:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> gm1 IS NOT NULL;
--Testcase 316:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ gm1 IS NOT NULL;
--Testcase 317:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ gm1 IS NOT NULL;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 351:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 352:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 353:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 354:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 355:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 356:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 357:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 358:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 359:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 360:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 361:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 362:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 363:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 364:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 365:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 366:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 367:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 368:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 369:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 370:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 400:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> gg1 IS NOT NULL;
--Testcase 401:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && gg1 IS NOT NULL;
--Testcase 402:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 404:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg = gg1 IS NOT NULL;
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != gg1 IS NOT NULL;
--Testcase 450:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 451:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 452:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 453:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 454:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 500:
DROP FOREIGN TABLE "types_PostGIS";
--Testcase 501:
DROP EXTENSION sqlite_fdw CASCADE;
--Testcase 502:
DROP EXTENSION postgis CASCADE;
================================================
FILE: sql/13.15/with_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 47:
CREATE EXTENSION postgis;
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/without_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/without_gis_support/nogis.sql
================================================
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 10:
CREATE DOMAIN geometry AS bytea;
--Testcase 11:
CREATE DOMAIN geography AS bytea;
--Testcase 12:
CREATE DOMAIN addbandarg AS bytea;
--Testcase 13:
CREATE DOMAIN box2d AS bytea;
--Testcase 14:
CREATE DOMAIN box3d AS bytea;
--Testcase 15:
CREATE DOMAIN geometry_dump AS bytea;
--Testcase 16:
CREATE DOMAIN geomval AS bytea;
--Testcase 17:
CREATE DOMAIN getfaceedges_returntype AS bytea;
--Testcase 18:
CREATE DOMAIN rastbandarg AS bytea;
--Testcase 19:
CREATE DOMAIN raster AS bytea;
--Testcase 20:
CREATE DOMAIN reclassarg AS bytea;
--Testcase 21:
CREATE DOMAIN summarystats AS bytea;
--Testcase 22:
CREATE DOMAIN topoelement AS bytea;
--Testcase 23:
CREATE DOMAIN topoelementarray AS bytea;
--Testcase 24:
CREATE DOMAIN topogeometry AS bytea;
--Testcase 25:
CREATE DOMAIN unionarg AS bytea;
--Testcase 26:
CREATE DOMAIN validatetopology_returntype AS bytea;
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text) SERVER sqlite_svr;
--Testcase 41: ERR unable to convert to unsupported PostGIS specific data type
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, but CANNOT read PostGIS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: read the same BLOBs
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
--Testcase 50:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
-- Insert a BLOB, read SpatiaLite BLOB without any transformations
--Testcase 51: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 52:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 53:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 54: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 55:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 56:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 57:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 58:
SELECT * FROM "♂";
--Testcase 59:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 60:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 61:
INSERT INTO "♂" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
--Testcase 62:
SELECT * FROM "♂";
--Testcase 63:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL,
osm_id int OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t json
) SERVER sqlite_svr
OPTIONS (table '♁');
--Testcase 55:
INSERT INTO "♁ FDW" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 67:
SELECT * FROM "♁ FDW";
-- PostGIS specific data types, but SpatiaLite or sqlite_fdw unsupported
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box2d;
--Testcase 69: -- ERR
SELECT * FROM "♂";
--Testcase 70:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box3d;
--Testcase 71: -- ERR
SELECT * FROM "♂";
--Testcase 72:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry_dump;
--Testcase 73: -- ERR
SELECT * FROM "♂";
--Testcase 74:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geomval;
--Testcase 75: -- ERR
SELECT * FROM "♂";
--Testcase 76:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE getfaceedges_returntype;
--Testcase 77: -- ERR
SELECT * FROM "♂";
--Testcase 78:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE rastbandarg;
--Testcase 79: -- ERR
SELECT * FROM "♂";
--Testcase 80:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE raster;
--Testcase 81: -- ERR
SELECT * FROM "♂";
--Testcase 82:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE reclassarg;
--Testcase 83: -- ERR
SELECT * FROM "♂";
--Testcase 84:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE summarystats;
--Testcase 85: -- ERR
SELECT * FROM "♂";
--Testcase 86:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelement;
--Testcase 87: -- ERR
SELECT * FROM "♂";
--Testcase 88:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelementarray;
--Testcase 89: -- ERR
SELECT * FROM "♂";
--Testcase 90:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topogeometry;
--Testcase 91: -- ERR
SELECT * FROM "♂";
--Testcase 92:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE unionarg;
--Testcase 93: -- ERR
SELECT * FROM "♂";
--Testcase 94:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE validatetopology_returntype;
--Testcase 95: -- ERR
SELECT * FROM "♂";
-- PostGIS specific data types, not bytea mode, hence error
--Testcase 96:
ALTER DOMAIN geometry RENAME TO geom0;
--Testcase 97:
ALTER DOMAIN geography RENAME TO geog0;
--Testcase 98:
CREATE DOMAIN geometry AS text;
--Testcase 99:
CREATE DOMAIN geography AS text;
--Testcase 100:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 101: -- ERR
SELECT * FROM "♂";
--Testcase 102:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geography;
--Testcase 102: -- ERR
SELECT * FROM "♂";
--Testcase 103:
DROP DOMAIN geometry CASCADE;
--Testcase 104:
DROP DOMAIN geography CASCADE;
--Testcase 105:
DROP DOMAIN addbandarg;
--Testcase 106:
DROP DOMAIN box2d;
--Testcase 107:
DROP DOMAIN box3d;
--Testcase 108:
DROP DOMAIN geometry_dump;
--Testcase 109:
DROP DOMAIN geomval;
--Testcase 110:
DROP DOMAIN getfaceedges_returntype;
--Testcase 111:
DROP DOMAIN rastbandarg;
--Testcase 112:
DROP DOMAIN raster CASCADE;
--Testcase 113:
DROP DOMAIN reclassarg;
--Testcase 114:
DROP DOMAIN summarystats;
--Testcase 115:
DROP DOMAIN topoelement;
--Testcase 116:
DROP DOMAIN topoelementarray;
--Testcase 117:
DROP DOMAIN topogeometry;
--Testcase 118:
DROP DOMAIN unionarg;
--Testcase 119:
DROP DOMAIN validatetopology_returntype;
--Testcase 120:
DROP DOMAIN geom0 CASCADE;
--Testcase 121:
DROP DOMAIN geog0 CASCADE;
--Testcase 122:
DROP SERVER sqlite_svr CASCADE;
--Testcase 123:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/13.15/without_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/aggregate.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 18:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
-- test for aggregate pushdown
--Testcase 8:
DROP SERVER IF EXISTS sqlite_svr CASCADE;
--Testcase 9:
DROP EXTENSION IF EXISTS sqlite_fdw CASCADE;
--Testcase 10:
CREATE EXTENSION sqlite_fdw;
--Testcase 11:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 12:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 1:
explain (costs off, verbose) select count(distinct a) from multiprimary;
--Testcase 2:
explain (costs off, verbose) select sum(b),max(b), min(b), avg(b) from multiprimary;
--Testcase 3:
explain (costs off, verbose) select sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 4:
explain (costs off, verbose) select sum(a) from multiprimary group by b having sum(a) > 0;
--Testcase 5:
explain (costs off, verbose) select sum(a) from multiprimary group by b having avg(a^2) > 0 and sum(a) > 0;
-- stddev and variance are not pushed down
--Testcase 6:
explain (costs off, verbose) select stddev(a) from multiprimary;
--Testcase 7:
explain (costs off, verbose) select sum(a) from multiprimary group by b having variance(a) > 0;
--Testcase 13:
DROP FOREIGN TABLE multiprimary;
--Testcase 16:
CREATE FOREIGN TABLE limittest(id serial OPTIONS (key 'true'), x int, y text) SERVER sqlite_svr;
--Testcase 17:
INSERT INTO limittest(x, y) VALUES (1, 'x'), (2, 'x'), (3, 'x'), (4, 'x');
--Testcase 18:
INSERT INTO limittest(x, y) VALUES (1, 'y'), (2, 'y'), (3, 'y'), (4, 'y');
--Testcase 19:
INSERT INTO limittest(x, y) VALUES (1, 'z'), (2, 'z'), (3, 'z'), (4, 'z');
--Testcase 20:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 21:
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 22:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 23:
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 24:
EXPLAIN VERBOSE
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 25:
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 26:
EXPLAIN VERBOSE
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 27:
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 28:
DROP FOREIGN TABLE limittest;
--Testcase 14:
DROP SERVER sqlite_svr;
--Testcase 15:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/aggregates.sql
================================================
--
-- AGGREGATES
--
--Testcase 266:
CREATE EXTENSION sqlite_fdw;
--Testcase 267:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 268:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 269:
CREATE FOREIGN TABLE aggtest (
a int2,
b float4
) SERVER sqlite_svr;
--Testcase 270:
CREATE FOREIGN TABLE student (
name text,
age int4,
location point,
gpa float8
) SERVER sqlite_svr;
--Testcase 271:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 272:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 678:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 679:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 680:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 681:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 682:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 273:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 683:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 684:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 685:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 686:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 687:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 274:
CREATE FOREIGN TABLE multi_arg_agg (a int OPTIONS (key 'true'), b int, c text) SERVER sqlite_svr;
--Testcase 275:
CREATE FOREIGN TABLE VARCHAR_TBL(f1 varchar(4) OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 276:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 688:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 689:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 690:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 691:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 692:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 588:
SET extra_float_digits = 0;
--Testcase 1:
SELECT avg(four) AS avg_1 FROM onek;
--Testcase 2:
SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
--Testcase 697:
CREATE FOREIGN TABLE agg_tb(v int, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 698:
INSERT INTO agg_tb(v) VALUES(1), (2), (3);
--Testcase 699: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 700:
DELETE FROM agg_tb;
--Testcase 701:
INSERT INTO agg_tb(v) VALUES (NULL);
--Testcase 702: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 703:
DELETE FROM agg_tb;
--Testcase 704:
INSERT INTO agg_tb(v) VALUES (NULL), (1), (2);
--Testcase 705: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 706:
CREATE FOREIGN TABLE agg_tb2(v text) SERVER sqlite_svr;
--Testcase 707:
INSERT INTO agg_tb2(v) VALUES (array['hello', 'world']);
--Testcase 708: -- Pg 16+
SELECT any_value(v) FROM agg_tb2;
-- In 7.1, avg(float4) is computed using float8 arithmetic.
--Testcase 3:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 693:
SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest;
--Testcase 4:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 694:
SELECT avg(gpa)::numeric(10,3) AS avg_3_4 FROM ONLY student;
--Testcase 5:
SELECT sum(four) AS sum_1500 FROM onek;
--Testcase 6:
SELECT sum(a) AS sum_198 FROM aggtest;
--Testcase 7:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 695:
SELECT sum(b)::numeric(10,3) AS avg_431_773 FROM aggtest;
--Testcase 8:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 696:
SELECT sum(gpa)::numeric(10,3) AS avg_6_8 FROM ONLY student;
--Testcase 9:
SELECT max(four) AS max_3 FROM onek;
--Testcase 10:
SELECT max(a) AS max_100 FROM aggtest;
--Testcase 11:
SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
--Testcase 12:
SELECT max(student.gpa) AS max_3_7 FROM student;
--Testcase 13:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 697:
SELECT stddev_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 14:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 698:
SELECT stddev_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 15:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 699:
SELECT var_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 16:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 700:
SELECT var_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 17:
SELECT stddev_pop(b::numeric) FROM aggtest;
--Testcase 18:
SELECT stddev_samp(b::numeric) FROM aggtest;
--Testcase 19:
SELECT var_pop(b::numeric) FROM aggtest;
--Testcase 20:
SELECT var_samp(b::numeric) FROM aggtest;
-- population variance is defined for a single tuple, sample variance
-- is not
--Testcase 277:
CREATE FOREIGN TABLE agg_t3(a float8, b float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 278:
DELETE FROM agg_t3;
--Testcase 279:
INSERT INTO agg_t3 values (1.0::float8, 2.0::float8);
--Testcase 280:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 281:
DELETE FROM agg_t3;
--Testcase 282:
INSERT INTO agg_t3 values (3.0::float8, 4.0::float8);
--Testcase 283:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 284:
DELETE FROM agg_t3;
--Testcase 285:
INSERT INTO agg_t3 values ('inf'::float8, 'inf'::float8);
--Testcase 286:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 287:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 288:
DELETE FROM agg_t3;
--Testcase 289:
INSERT INTO agg_t3 values ('nan'::float8, 'nan'::float8);
--Testcase 290:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 291:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 292:
CREATE FOREIGN TABLE agg_t4(a float4, b float4, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 293:
DELETE FROM agg_t4;
--Testcase 294:
INSERT INTO agg_t4 values (1.0::float4, 2.0::float4);
--Testcase 295:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 296:
DELETE FROM agg_t4;
--Testcase 297:
INSERT INTO agg_t4 values (3.0::float4, 4.0::float4);
--Testcase 298:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 299:
DELETE FROM agg_t4;
--Testcase 300:
INSERT INTO agg_t4 values ('inf'::float4, 'inf'::float4);
--Testcase 301:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 302:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 303:
DELETE FROM agg_t4;
--Testcase 304:
INSERT INTO agg_t4 values ('nan'::float4, 'nan'::float4);
--Testcase 305:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 306:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 307:
CREATE FOREIGN TABLE agg_t5(a numeric, b numeric, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 308:
DELETE FROM agg_t5;
--Testcase 309:
INSERT INTO agg_t5 values (1.0::numeric, 2.0::numeric);
--Testcase 310:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 311:
DELETE FROM agg_t5;
--Testcase 312:
INSERT INTO agg_t5 values (3.0::numeric, 4.0::numeric);
--Testcase 313:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 597:
DELETE FROM agg_t5;
--Testcase 598:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 599:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 600:
DELETE FROM agg_t5;
--Testcase 601:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 602:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 314:
DELETE FROM agg_t5;
--Testcase 315:
INSERT INTO agg_t5 values ('nan'::numeric, 'nan'::numeric);
--Testcase 316:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 317:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
-- verify correct results for null and NaN inputs
--Testcase 318:
CREATE FOREIGN TABLE agg_t8(a text OPTIONS (key 'true'), b text) SERVER sqlite_svr;
--Testcase 319:
DELETE FROM agg_t8;
--Testcase 320:
INSERT INTO agg_t8 select * from generate_series(1,3);
--Testcase 321:
select sum(null::int4) from agg_t8;
--Testcase 322:
select sum(null::int8) from agg_t8;
--Testcase 323:
select sum(null::numeric) from agg_t8;
--Testcase 324:
select sum(null::float8) from agg_t8;
--Testcase 325:
select avg(null::int4) from agg_t8;
--Testcase 326:
select avg(null::int8) from agg_t8;
--Testcase 327:
select avg(null::numeric) from agg_t8;
--Testcase 328:
select avg(null::float8) from agg_t8;
--Testcase 329:
select sum('NaN'::numeric) from agg_t8;
--Testcase 330:
select avg('NaN'::numeric) from agg_t8;
-- verify correct results for infinite inputs
--Testcase 331:
DELETE FROM agg_t3;
--Testcase 332:
INSERT INTO agg_t3 VALUES ('1'::float8), ('infinity'::float8);
--Testcase 333:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 334:
DELETE FROM agg_t3;
--Testcase 335:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('1'::float8);
--Testcase 336:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 337:
DELETE FROM agg_t3;
--Testcase 338:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('infinity'::float8);
--Testcase 339:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 340:
DELETE FROM agg_t3;
--Testcase 341:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('infinity'::float8);
--Testcase 342:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 603:
DELETE FROM agg_t3;
--Testcase 604:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('-infinity'::float8);
--Testcase 605:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 606:
DELETE FROM agg_t3;
--Testcase 607:
INSERT INTO agg_t3 VALUES ('1'::numeric), ('infinity'::numeric);
--Testcase 608:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 609:
DELETE FROM agg_t3;
--Testcase 610:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('1'::numeric);
--Testcase 611:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 612:
DELETE FROM agg_t3;
--Testcase 613:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('infinity'::numeric);
--Testcase 614:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 615:
DELETE FROM agg_t3;
--Testcase 616:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('infinity'::numeric);
--Testcase 617:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 618:
DELETE FROM agg_t3;
--Testcase 619:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('-infinity'::numeric);
--Testcase 620:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
-- test accuracy with a large input offset
--Testcase 343:
CREATE FOREIGN TABLE agg_t6(a float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 344:
DELETE FROM agg_t6;
--Testcase 345:
INSERT INTO agg_t6 VALUES (100000003), (100000004), (100000006), (100000007);
--Testcase 346:
SELECT avg(a), var_pop(a) FROM agg_t6;
--Testcase 347:
DELETE FROM agg_t6;
--Testcase 348:
INSERT INTO agg_t6 VALUES (7000000000005), (7000000000007);
--Testcase 349:
SELECT avg(a), var_pop(a) FROM agg_t6;
-- SQL2003 binary aggregates
--Testcase 21:
SELECT regr_count(b, a) FROM aggtest;
--Testcase 22:
SELECT regr_sxx(b, a) FROM aggtest;
--Testcase 23:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 701:
SELECT regr_syy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 24:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 702:
SELECT regr_sxy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 25:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 703:
SELECT regr_avgx(b, a), regr_avgy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 26:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 704:
SELECT regr_r2(b, a)::numeric(20,10) FROM aggtest;
--Testcase 27:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 705:
SELECT regr_slope(b, a)::numeric(20,10), regr_intercept(b, a)::numeric(20,10) FROM aggtest;
--Testcase 28:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 706:
SELECT covar_pop(b, a)::numeric(20,10), covar_samp(b, a)::numeric(20,10) FROM aggtest;
--Testcase 29:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 707:
SELECT corr(b, a)::numeric(20,10) FROM aggtest;
-- check single-tuple behavior
--Testcase 350:
CREATE FOREIGN TABLE agg_t7(a float8, b float8, c float8, d float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 351:
DELETE FROM agg_t7;
--Testcase 352:
INSERT INTO agg_t7 VALUES (1, 2, 3, 4);
--Testcase 353:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 354:
DELETE FROM agg_t7;
--Testcase 355:
INSERT INTO agg_t7 VALUES (1, 'inf', 3, 'inf');
--Testcase 356:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 357:
DELETE FROM agg_t7;
--Testcase 358:
INSERT INTO agg_t7 VALUES (1, 'nan', 3, 'nan');
--Testcase 359:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
-- test accum and combine functions directly
--Testcase 360:
CREATE FOREIGN TABLE regr_test (x float8, y float8, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 361:
DELETE FROM regr_test;
--Testcase 362:
INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
--Testcase 363:
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);
--Testcase 364:
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 590:
EXPLAIN (VERBOSE, COSTS OFF)
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);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 365:
CREATE FOREIGN TABLE agg_t15 (a text, b int, c int, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 366:
delete from agg_t15;
--Testcase 367:
insert into agg_t15 values ('{4,140,2900}', 100);
--Testcase 368:
SELECT float8_accum(a::float8[], b) from agg_t15;
--Testcase 369:
delete from agg_t15;
--Testcase 370:
insert into agg_t15 values ('{4,140,2900,1290,83075,15050}', 200, 100);
--Testcase 371:
SELECT float8_regr_accum(a::float8[], b, c) from agg_t15;
--Testcase 372:
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);
--Testcase 373:
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);
--Testcase 374:
CREATE FOREIGN TABLE agg_t16 (a text, b text, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 375:
delete from agg_t16;
--Testcase 376:
insert into agg_t16 values ('{3,60,200}', '{0,0,0}');
--Testcase 377:
insert into agg_t16 values ('{0,0,0}', '{2,180,200}');
--Testcase 378:
insert into agg_t16 values ('{3,60,200}', '{2,180,200}');
--Testcase 379:
SELECT float8_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 380:
delete from agg_t16;
--Testcase 381:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{0,0,0,0,0,0}');
--Testcase 382:
insert into agg_t16 values ('{0,0,0,0,0,0}', '{2,180,200,740,57800,-3400}');
--Testcase 383:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{2,180,200,740,57800,-3400}');
--Testcase 384:
SELECT float8_regr_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 385:
DROP FOREIGN TABLE regr_test;
-- test count, distinct
--Testcase 30:
SELECT count(four) AS cnt_1000 FROM onek;
--Testcase 31:
SELECT count(DISTINCT four) AS cnt_4 FROM onek;
--Testcase 32:
select ten, count(*), sum(four) from onek
group by ten order by ten;
--Testcase 33:
select ten, count(four), sum(DISTINCT four) from onek
group by ten order by ten;
-- user-defined aggregates
--Testcase 386:
CREATE AGGREGATE newavg (
sfunc = int4_avg_accum, basetype = int4, stype = _int8,
finalfunc = int8_avg,
initcond1 = '{0,0}'
);
--Testcase 387:
CREATE AGGREGATE newsum (
sfunc1 = int4pl, basetype = int4, stype1 = int4,
initcond1 = '0'
);
--Testcase 388:
CREATE AGGREGATE newcnt (*) (
sfunc = int8inc, stype = int8,
initcond = '0', parallel = safe
);
--Testcase 389:
CREATE AGGREGATE newcnt ("any") (
sfunc = int8inc_any, stype = int8,
initcond = '0'
);
--Testcase 390:
CREATE AGGREGATE oldcnt (
sfunc = int8inc, basetype = 'ANY', stype = int8,
initcond = '0'
);
--Testcase 391:
create function sum3(int8,int8,int8) returns int8 as
'select $1 + $2 + $3' language sql strict immutable;
--Testcase 392:
create aggregate sum2(int8,int8) (
sfunc = sum3, stype = int8,
initcond = '0'
);
--Testcase 34:
SELECT newavg(four) AS avg_1 FROM onek;
--Testcase 35:
SELECT newsum(four) AS sum_1500 FROM onek;
--Testcase 36:
SELECT newcnt(four) AS cnt_1000 FROM onek;
--Testcase 37:
SELECT newcnt(*) AS cnt_1000 FROM onek;
--Testcase 38:
SELECT oldcnt(*) AS cnt_1000 FROM onek;
--Testcase 39:
SELECT sum2(q1,q2) FROM int8_tbl;
-- test for outer-level aggregates
-- this should work
--Testcase 40:
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
--Testcase 41:
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.
--Testcase 42:
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.
--Testcase 393:
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;
--Testcase 394:
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;
--Testcase 395:
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;
--Testcase 396:
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
--
--Testcase 397:
CREATE FOREIGN TABLE bitwise_test(
i2 INT2,
i4 INT4,
i8 INT8,
i INTEGER,
x INT2
) SERVER sqlite_svr;
-- empty case
--Testcase 43:
SELECT
BIT_AND(i2) AS "?",
BIT_OR(i4) AS "?",
BIT_XOR(i8) AS "?"
FROM bitwise_test;
--Testcase 44:
INSERT INTO bitwise_test VALUES
(1, 1, 1, 1, 1),
(3, 3, 3, null, 2),
(7, 7, 7, 3, 4);
--Testcase 45:
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_OR(i2) AS "7",
BIT_OR(i4) AS "7",
BIT_OR(i8) AS "7",
BIT_OR(i) AS "?",
BIT_OR(x) AS "7",
BIT_XOR(i2) AS "5",
BIT_XOR(i4) AS "5",
BIT_XOR(i8) AS "5",
BIT_XOR(i) AS "?",
BIT_XOR(x) AS "7"
FROM bitwise_test;
--
-- test boolean aggregates
--
-- first test all possible transition and final states
--Testcase 398:
CREATE FOREIGN TABLE bool_test_tmp(
b1 BOOL OPTIONS (key 'true'),
b2 BOOL OPTIONS (key 'true')
) SERVER sqlite_svr;
-- boolean and transitions
-- null because strict
BEGIN;
--Testcase 399:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 400:
SELECT booland_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- and actual computations
BEGIN;
--Testcase 401:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE);
--Testcase 402:
SELECT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 403:
INSERT INTO bool_test_tmp VALUES
(TRUE, FALSE),
(FALSE, TRUE),
(FALSE, FALSE);
--Testcase 404:
SELECT NOT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
-- boolean or transitions
-- null because strict
BEGIN;
--Testcase 405:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 406:
SELECT boolor_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- actual computations
BEGIN;
--Testcase 407:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE),
(TRUE, FALSE),
(FALSE, TRUE);
--Testcase 408:
SELECT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 409:
INSERT INTO bool_test_tmp VALUES
(FALSE, FALSE);
--Testcase 410:
SELECT NOT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
--Testcase 411:
CREATE FOREIGN TABLE bool_test(
b1 BOOL,
b2 BOOL,
b3 BOOL,
b4 BOOL
) SERVER sqlite_svr;
-- empty case
--Testcase 46:
SELECT
BOOL_AND(b1) AS "n",
BOOL_OR(b3) AS "n"
FROM bool_test;
--Testcase 47:
INSERT INTO bool_test VALUES
(TRUE, null, FALSE, null),
(FALSE, TRUE, null, null),
(null, TRUE, FALSE, null);
--Testcase 48:
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;
--Testcase 49:
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;
--Testcase 50:
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
--Testcase 51:
explain (costs off)
select min(unique1) from tenk1;
--Testcase 52:
select min(unique1) from tenk1;
--Testcase 53:
explain (costs off)
select max(unique1) from tenk1;
--Testcase 54:
select max(unique1) from tenk1;
--Testcase 55:
explain (costs off)
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 56:
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 57:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42;
--Testcase 58:
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;
--Testcase 628:
set local max_parallel_workers_per_gather = 0;
--Testcase 59:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42000;
--Testcase 60:
select max(unique1) from tenk1 where unique1 > 42000;
rollback;
-- multi-column index (uses tenk1_thous_tenthous)
--Testcase 61:
explain (costs off)
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 62:
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 63:
explain (costs off)
select min(tenthous) from tenk1 where thousand = 33;
--Testcase 64:
select min(tenthous) from tenk1 where thousand = 33;
-- check parameter propagation into an indexscan subquery
--Testcase 65:
explain (costs off)
select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
from int4_tbl;
--Testcase 66:
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
--Testcase 67:
explain (costs off)
select distinct max(unique2) from tenk1;
--Testcase 68:
select distinct max(unique2) from tenk1;
--Testcase 69:
explain (costs off)
select max(unique2) from tenk1 order by 1;
--Testcase 70:
select max(unique2) from tenk1 order by 1;
--Testcase 71:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2);
--Testcase 72:
select max(unique2) from tenk1 order by max(unique2);
--Testcase 73:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 74:
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 75:
explain (costs off)
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
--Testcase 76:
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
-- interesting corner case: constant gets optimized into a seqscan
--Testcase 77:
explain (costs off)
select max(100) from tenk1;
--Testcase 78:
select max(100) from tenk1;
-- try it on an inheritance tree
--Testcase 412:
create foreign table minmaxtest(f1 int) server sqlite_svr;
--Testcase 413:
create table minmaxtest1() inherits (minmaxtest);
--Testcase 414:
create table minmaxtest2() inherits (minmaxtest);
--Testcase 415:
create table minmaxtest3() inherits (minmaxtest);
--Testcase 416:
create index minmaxtest1i on minmaxtest1(f1);
--Testcase 417:
create index minmaxtest2i on minmaxtest2(f1 desc);
--Testcase 418:
create index minmaxtest3i on minmaxtest3(f1) where f1 is not null;
--Testcase 79:
insert into minmaxtest values(11), (12);
--Testcase 80:
insert into minmaxtest1 values(13), (14);
--Testcase 81:
insert into minmaxtest2 values(15), (16);
--Testcase 82:
insert into minmaxtest3 values(17), (18);
--Testcase 83:
explain (costs off)
select min(f1), max(f1) from minmaxtest;
--Testcase 84:
select min(f1), max(f1) from minmaxtest;
-- DISTINCT doesn't do anything useful here, but it shouldn't fail
--Testcase 85:
explain (costs off)
select distinct min(f1), max(f1) from minmaxtest;
--Testcase 86:
select distinct min(f1), max(f1) from minmaxtest;
-- check for correct detection of nested-aggregate errors
--Testcase 87:
select max(min(unique1)) from tenk1;
--Testcase 88:
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
--
--Testcase 419:
create foreign table agg_t1 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int, d int) server sqlite_svr;
--Testcase 420:
create foreign table agg_t2 (x int OPTIONS (key 'true'), y int OPTIONS (key 'true'), z int) server sqlite_svr;
--Testcase 421:
create foreign table agg_t9 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int) server sqlite_svr;
-- Non-primary-key columns can be removed from GROUP BY
--Testcase 89:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- No removal can happen if the complete PK is not present in GROUP BY
--Testcase 90:
explain (costs off) select a,c from agg_t1 group by a,c,d;
-- Test removal across multiple relations
--Testcase 91:
explain (costs off) select *
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.y,agg_t2.z;
-- Test case where agg_t1 can be optimized but not agg_t2
--Testcase 92:
explain (costs off) select agg_t1.*,agg_t2.x,agg_t2.z
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.z;
-- Cannot optimize when PK is deferrable
--Testcase 422:
explain (costs off) select * from agg_t9 group by a,b,c;
--Testcase 423:
create temp table t1c () inherits (agg_t1);
-- Ensure we don't remove any columns when t1 has a child table
--Testcase 424:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- Okay to remove columns if we're only querying the parent.
--Testcase 425:
explain (costs off) select * from only agg_t1 group by a,b,c,d;
-- Skip this test, sqlite_fdw does not support partition table
--create foreign table p_t1 (
-- a int options (key 'true'),
-- b int options (key 'true'),
-- c int,
-- d int,
--) partition by list(a) server sqlite_svr;
--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
--
--Testcase 426:
create foreign table t1(f1 int, f2 int) server sqlite_svr;
--Testcase 427:
create foreign table t2(f1 bigint, f2 oid) server sqlite_svr;
--Testcase 428:
select f1 from t1 left join t2 using (f1) group by f1;
--Testcase 429:
select f1 from t1 left join t2 using (f1) group by t1.f1;
--Testcase 430:
select t1.f1 from t1 left join t2 using (f1) group by t1.f1;
-- only this one should fail:
--Testcase 431:
select t1.f1 from t1 left join t2 using (f1) group by f1;
-- check case where we have to inject nullingrels into coerced join alias
select f1, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f1)) on (x0 = 0)
group by f1;
-- same, for a RelabelType coercion
select f2, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f2)) on (x0 = 0)
group by f2;
--Testcase 432:
drop foreign table t1, t2;
--
-- Test planner's selection of pathkeys for ORDER BY aggregates
--
-- Ensure we order by four. This suits the most aggregate functions.
explain (costs off)
select sum(two order by two),max(four order by four), min(four order by four)
from tenk1;
-- Ensure we order by two. It's a tie between ordering by two and four but
-- we tiebreak on the aggregate's position.
explain (costs off)
select
sum(two order by two), max(four order by four),
min(four order by four), max(two order by two)
from tenk1;
-- Similar to above, but tiebreak on ordering by four
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two)
from tenk1;
-- Ensure this one orders by ten since there are 3 aggregates that require ten
-- vs two that suit two and four.
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two),
sum(ten order by ten), min(ten order by ten), max(ten order by ten)
from tenk1;
-- Try a case involving a GROUP BY clause where the GROUP BY column is also
-- part of an aggregate's ORDER BY clause. We want a sort order that works
-- for the GROUP BY along with the first and the last aggregate.
explain (costs off)
select
sum(unique1 order by ten, two), sum(unique1 order by four),
sum(unique1 order by two, four)
from tenk1
group by ten;
-- Ensure that we never choose to provide presorted input to an Aggref with
-- a volatile function in the ORDER BY / DISTINCT clause. We want to ensure
-- these sorts are performed individually rather than at the query level.
explain (costs off)
select
sum(unique1 order by two), sum(unique1 order by four),
sum(unique1 order by four, two), sum(unique1 order by two, random()),
sum(unique1 order by two, random(), random() + 1)
from tenk1
group by ten;
-- Ensure consecutive NULLs are properly treated as distinct from each other
select array_agg(distinct val)
from (select null as val from generate_series(1, 2)) g;
-- Ensure no ordering is requested when enable_presorted_aggregate is off
set enable_presorted_aggregate to off;
explain (costs off)
select sum(two order by two) from tenk1;
reset enable_presorted_aggregate;
--
-- Test combinations of DISTINCT and/or ORDER BY
--
begin;
--Testcase 93:
delete from INT8_TBL;
--Testcase 94:
insert into INT8_TBL values (1,4),(2,3),(3,1),(4,2);
--Testcase 95:
select array_agg(q1 order by q2)
from INT8_TBL;
--Testcase 96:
select array_agg(q1 order by q1)
from INT8_TBL;
--Testcase 97:
select array_agg(q1 order by q1 desc)
from INT8_TBL;
--Testcase 98:
select array_agg(q2 order by q1 desc)
from INT8_TBL;
--Testcase 99:
delete from INT4_TBL;
--Testcase 100:
insert into INT4_TBL values (1),(2),(1),(3),(null),(2);
--Testcase 101:
select array_agg(distinct f1)
from INT4_TBL;
--Testcase 102:
select array_agg(distinct f1 order by f1)
from INT4_TBL;
--Testcase 103:
select array_agg(distinct f1 order by f1 desc)
from INT4_TBL;
--Testcase 104:
select array_agg(distinct f1 order by f1 desc nulls last)
from INT4_TBL;
rollback;
-- multi-arg aggs, strict/nonstrict, distinct/order by
--Testcase 433:
create type aggtype as (a integer, b integer, c text);
--Testcase 434:
create function aggf_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql strict immutable;
--Testcase 435:
create function aggfns_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql immutable;
--Testcase 436:
create aggregate aggfstr(integer,integer,text) (
sfunc = aggf_trans, stype = aggtype[],
initcond = '{}'
);
--Testcase 437:
create aggregate aggfns(integer,integer,text) (
sfunc = aggfns_trans, stype = aggtype[], sspace = 10000,
initcond = '{}'
);
begin;
--Testcase 105:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 106:
select aggfstr(a,b,c) from multi_arg_agg;
--Testcase 107:
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 108:
select aggfstr(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 109:
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 110:
select aggfstr(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 111:
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
-- test specific code paths
--Testcase 112:
select aggfns(distinct a,a,c order by c using ~<~,a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 113:
select aggfns(distinct a,a,c order by c using ~<~) from multi_arg_agg, generate_series(1,2) i;
--Testcase 114:
select aggfns(distinct a,a,c order by a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 115:
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
-- check node I/O via view creation and usage, also deparsing logic
--Testcase 438:
create view agg_view1 as
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 116:
select * from agg_view1;
--Testcase 117:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 439:
create or replace view agg_view1 as
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 118:
select * from agg_view1;
--Testcase 119:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 440:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 120:
select * from agg_view1;
--Testcase 121:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 441:
create or replace view agg_view1 as
select aggfns(a,b,c order by b+1) from multi_arg_agg;
--Testcase 122:
select * from agg_view1;
--Testcase 123:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 442:
create or replace view agg_view1 as
select aggfns(a,a,c order by b) from multi_arg_agg;
--Testcase 124:
select * from agg_view1;
--Testcase 125:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 443:
create or replace view agg_view1 as
select aggfns(a,b,c order by c using ~<~) from multi_arg_agg;
--Testcase 126:
select * from agg_view1;
--Testcase 127:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 444:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
--Testcase 128:
select * from agg_view1;
--Testcase 129:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 445:
drop view agg_view1;
rollback;
-- incorrect DISTINCT usage errors
--Testcase 130:
insert into multi_arg_agg values (1,1,'foo');
--Testcase 131:
select aggfns(distinct a,b,c order by i) from multi_arg_agg, generate_series(1,2) i;
--Testcase 132:
select aggfns(distinct a,b,c order by a,b+1) from multi_arg_agg, generate_series(1,2) i;
--Testcase 133:
select aggfns(distinct a,b,c order by a,b,i,c) from multi_arg_agg, generate_series(1,2) i;
--Testcase 134:
select aggfns(distinct a,a,c order by a,b) from multi_arg_agg, generate_series(1,2) i;
-- string_agg tests
begin;
--Testcase 135:
delete from varchar_tbl;
--Testcase 136:
insert into varchar_tbl values ('aaaa'),('bbbb'),('cccc');
--Testcase 137:
select string_agg(f1,',') from varchar_tbl;
--Testcase 138:
delete from varchar_tbl;
--Testcase 139:
insert into varchar_tbl values ('aaaa'),(null),('bbbb'),('cccc');
--Testcase 140:
select string_agg(f1,',') from varchar_tbl;
--Testcase 141:
delete from varchar_tbl;
--Testcase 142:
insert into varchar_tbl values (null),(null),('bbbb'),('cccc');
--Testcase 143:
select string_agg(f1,'AB') from varchar_tbl;
--Testcase 144:
delete from varchar_tbl;
--Testcase 145:
insert into varchar_tbl values (null),(null);
--Testcase 146:
select string_agg(f1,',') from varchar_tbl;
rollback;
-- check some implicit casting cases, as per bug #5564
--Testcase 147:
select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok
--Testcase 148:
select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok
--Testcase 149:
select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok
--Testcase 150:
select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok
-- string_agg bytea tests
--Testcase 446:
create foreign table bytea_test_table(v bytea) server sqlite_svr;
--Testcase 151:
select string_agg(v, '') from bytea_test_table;
--Testcase 152:
insert into bytea_test_table values(decode('ff','hex'));
--Testcase 153:
select string_agg(v, '') from bytea_test_table;
--Testcase 154:
insert into bytea_test_table values(decode('aa','hex'));
--Testcase 155:
select string_agg(v, '') from bytea_test_table;
--Testcase 156:
select string_agg(v, NULL) from bytea_test_table;
--Testcase 157:
select string_agg(v, decode('ee', 'hex')) from bytea_test_table;
--Testcase 447:
drop foreign table bytea_test_table;
-- Test parallel string_agg and array_agg
create foreign table pagg_test (x int, y int) server sqlite_svr;
insert into pagg_test
select (case x % 4 when 1 then null else x end), x % 10
from generate_series(1,5000) x;
set parallel_setup_cost TO 0;
set parallel_tuple_cost TO 0;
set parallel_leader_participation TO 0;
set min_parallel_table_scan_size = 0;
set bytea_output = 'escape';
set max_parallel_workers_per_gather = 2;
-- create a view as we otherwise have to repeat this query a few times.
create view v_pagg_test AS
select
y,
min(t) AS tmin,max(t) AS tmax,count(distinct t) AS tndistinct,
min(b) AS bmin,max(b) AS bmax,count(distinct b) AS bndistinct,
min(a) AS amin,max(a) AS amax,count(distinct a) AS andistinct,
min(aa) AS aamin,max(aa) AS aamax,count(distinct aa) AS aandistinct
from (
select
y,
unnest(regexp_split_to_array(a1.t, ','))::int AS t,
unnest(regexp_split_to_array(a1.b::text, ',')) AS b,
unnest(a1.a) AS a,
unnest(a1.aa) AS aa
from (
select
y,
string_agg(x::text, ',') AS t,
string_agg(x::text::bytea, ',') AS b,
array_agg(x) AS a,
array_agg(ARRAY[x]) AS aa
from pagg_test
group by y
) a1
) a2
group by y;
-- Ensure results are correct.
select * from v_pagg_test order by y;
-- Ensure parallel aggregation is actually being used.
explain (costs off) select * from v_pagg_test order by y;
set max_parallel_workers_per_gather = 0;
-- Ensure results are the same without parallel aggregation.
select * from v_pagg_test order by y;
-- Clean up
reset max_parallel_workers_per_gather;
reset bytea_output;
reset min_parallel_table_scan_size;
reset parallel_leader_participation;
reset parallel_tuple_cost;
reset parallel_setup_cost;
drop view v_pagg_test;
drop foreign table pagg_test;
-- FILTER tests
--Testcase 158:
select min(unique1) filter (where unique1 > 100) from tenk1;
--Testcase 159:
select sum(1/ten) filter (where ten > 0) from tenk1;
--Testcase 160:
select ten, sum(distinct four) filter (where four::text ~ '123') from onek a
group by ten;
--Testcase 161:
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);
--Testcase 448:
create foreign table agg_t17(foo text, bar text) server sqlite_svr;
--Testcase 449:
insert into agg_t17 values ('a', 'b');
--Testcase 450:
select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0')
from agg_t17;
create foreign table agg_t170(v int) server sqlite_svr;
insert into agg_t170(v) values (1), (2), (3);
select any_value(v) filter (where v > 2) from agg_t170;
-- outer reference in FILTER (PostgreSQL extension)
--Testcase 451:
create foreign table agg_t18 (inner_c int) server sqlite_svr;
--Testcase 452:
create foreign table agg_t19 (outer_c int) server sqlite_svr;
--Testcase 453:
insert into agg_t18 values (1);
--Testcase 454:
insert into agg_t19 values (2), (3);
--Testcase 455:
select (select count(*)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 456:
select (select count(*) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- outer query is aggregation query
--Testcase 457:
select (select count(inner_c) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 162:
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)
--Testcase 163:
select sum(unique1) FILTER (WHERE
unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1;
-- exercise lots of aggregate parts with FILTER
begin;
--Testcase 164:
delete from multi_arg_agg;
--Testcase 165:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 166:
select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) from multi_arg_agg, generate_series(1,2) i;
rollback;
-- check handling of bare boolean Var in FILTER
--Testcase 672:
select max(0) filter (where b1) from bool_test;
--Testcase 673:
select (select max(0) filter (where b1)) from bool_test;
-- check for correct detection of nested-aggregate errors in FILTER
--Testcase 674:
select max(unique1) filter (where sum(ten) > 0) from tenk1;
--Testcase 675:
select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1;
--Testcase 676:
select max(unique1) filter (where bool_or(ten > 0)) from tenk1;
--Testcase 677:
select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1;
-- ordered-set aggregates
begin;
--Testcase 167:
delete from FLOAT8_TBL;
--Testcase 168:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 169:
select f1, percentile_cont(f1) within group (order by x::float8)
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 170:
delete from FLOAT8_TBL;
--Testcase 171:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 172:
select f1, percentile_cont(f1 order by f1) within group (order by x) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 173:
delete from FLOAT8_TBL;
--Testcase 174:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 175:
select f1, sum() within group (order by x::float8) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 176:
delete from FLOAT8_TBL;
--Testcase 177:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 178:
select f1, percentile_cont(f1,f1) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
--Testcase 179:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 708:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10) from aggtest;
--Testcase 180:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 709:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10), sum(b)::numeric(10,3) from aggtest;
--Testcase 181:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 710:
select percentile_cont(0.5) within group (order by thousand) from tenk1;
--Testcase 182:
select percentile_disc(0.5) within group (order by thousand) from tenk1;
begin;
--Testcase 183:
delete from INT4_TBL;
--Testcase 184:
insert into INT4_TBL values (1),(1),(2),(2),(3),(3),(4);
--Testcase 185:
select rank(3) within group (order by f1) from INT4_TBL;
--Testcase 186:
select cume_dist(3) within group (order by f1) from INT4_TBL;
--Testcase 187:
insert into INT4_TBL values (5);
--Testcase 458:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 711:
select (percent_rank(3) within group (order by f1))::numeric(20,10) from INT4_TBL;
--Testcase 459:
delete from INT4_TBL where f1 = 5;
--Testcase 188:
select dense_rank(3) within group (order by f1) from INT4_TBL;
rollback;
--Testcase 189:
select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand)
from tenk1;
--Testcase 190:
select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand)
from tenk1;
--Testcase 191:
select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand)
from tenk1;
--Testcase 460:
create foreign table agg_t21 (x int) server sqlite_svr;
begin;
--Testcase 248:
insert into agg_t21 select * from generate_series(1,6);
--Testcase 249:
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 agg_t21;
rollback;
--Testcase 192:
select ten, mode() within group (order by string4) from tenk1 group by ten;
--Testcase 461:
create foreign table agg_t20 (x text) server sqlite_svr;
begin;
--Testcase 462:
insert into agg_t20 values (unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]));
--Testcase 463:
select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) from agg_t20;
rollback;
-- check collation propagates up in suitable cases:
begin;
--Testcase 464:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 465:
select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) from agg_t20;
rollback;
-- ordered-set aggs created with CREATE AGGREGATE
--Testcase 466:
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
);
--Testcase 467:
create aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") (
stype = internal,
sfunc = ordered_set_transition_multi,
finalfunc = rank_final,
finalfunc_extra = true,
hypothetical
);
--Testcase 633:
alter aggregate my_percentile_disc(float8 ORDER BY anyelement)
rename to test_percentile_disc;
--Testcase 634:
alter aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any")
rename to test_rank;
begin;
--Testcase 468:
insert into agg_t21 values (1),(1),(2),(2),(3),(3),(4);
--Testcase 469:
select test_rank(3) within group (order by x) from agg_t21;
rollback;
--Testcase 193:
select test_percentile_disc(0.5) within group (order by thousand) from tenk1;
-- ordered-set aggs can't use ungrouped vars in direct args:
begin;
--Testcase 470:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 471:
select rank(x) within group (order by x) from agg_t21;
rollback;
-- outer-level agg can't use a grouped arg of a lower level, either:
begin;
--Testcase 472:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 473:
select array(select percentile_disc(a) within group (order by x)
from (values (0.3),(0.7)) v(a) group by a)
from agg_t21;
rollback;
-- agg in the direct args is a grouping violation, too:
begin;
--Testcase 474:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 475:
select rank(sum(x)) within group (order by x) from agg_t21;
rollback;
-- hypothetical-set type unification and argument-count failures:
begin;
--Testcase 264:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 265:
select rank(3) within group (order by x) from agg_t20;
rollback;
--Testcase 194:
select rank(3) within group (order by stringu1,stringu2) from tenk1;
begin;
--Testcase 476:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 477:
select rank('fred') within group (order by x) from agg_t21;
rollback;
begin;
--Testcase 478:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 479:
select rank('adam'::text collate "C") within group (order by x collate "POSIX")
from agg_t20;
rollback;
-- hypothetical-set type unification successes:
begin;
--Testcase 480:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 481:
select rank('adam'::varchar) within group (order by x) from agg_t20;
rollback;
begin;
--Testcase 482:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 483:
select rank('3') within group (order by x) from agg_t21;
rollback;
-- divide by zero check
begin;
--Testcase 484:
insert into agg_t21 select * from generate_series(1,0);
--Testcase 485:
select percent_rank(0) within group (order by x) from agg_t21;
rollback;
-- deparse and multiple features:
--Testcase 486:
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;
--Testcase 196:
select pg_get_viewdef('aggordview1');
--Testcase 197:
select * from aggordview1 order by ten;
--Testcase 487:
drop view aggordview1;
-- variadic aggregates
--Testcase 488:
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)';
--Testcase 489:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
--Testcase 490:
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)';
--Testcase 491:
create aggregate cleast_agg(variadic items anycompatiblearray) (
stype = anycompatible, sfunc = cleast_accum);
--Testcase 198:
select least_agg(q1,q2) from int8_tbl;
--Testcase 199:
select least_agg(variadic array[q1,q2]) from int8_tbl;
--Testcase 492:
select cleast_agg(q1,q2) from int8_tbl;
--Testcase 493:
select cleast_agg(4.5,f1) from int4_tbl;
--Testcase 494:
select cleast_agg(variadic array[4.5,f1]) from int4_tbl;
--Testcase 495:
select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl;
-- test aggregates with common transition functions share the same states
--Testcase 496:
create foreign table agg_t10(one int, id int options (key 'true')) server sqlite_svr;
--Testcase 497:
create foreign table agg_t11(one int, two int, id int options (key 'true')) server sqlite_svr;
--Testcase 498:
create foreign table agg_t12(a int, id int options (key 'true')) server sqlite_svr;
begin work;
--Testcase 499:
create type avg_state as (total bigint, count bigint);
--Testcase 500:
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;
--Testcase 501:
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;
--Testcase 502:
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;
--Testcase 503:
create aggregate my_avg(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn
);
--Testcase 504:
create aggregate my_sum(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn
);
-- aggregate state should be shared as aggs are the same.
--Testcase 505:
delete from agg_t10;
--Testcase 506:
insert into agg_t10 values (1), (3);
--Testcase 507:
select my_avg(one),my_avg(one) from agg_t10;
-- aggregate state should be shared as transfn is the same for both aggs.
--Testcase 508:
select my_avg(one),my_sum(one) from agg_t10;
-- same as previous one, but with DISTINCT, which requires sorting the input.
--Testcase 509:
delete from agg_t10;
--Testcase 510:
insert into agg_t10 values (1), (3), (1);
--Testcase 511:
select my_avg(distinct one),my_sum(distinct one) from agg_t10;
-- shouldn't share states due to the distinctness not matching.
--Testcase 512:
delete from agg_t10;
--Testcase 513:
insert into agg_t10 values (1), (3);
--Testcase 514:
select my_avg(distinct one),my_sum(one) from agg_t10;
-- shouldn't share states due to the filter clause not matching.
--Testcase 515:
select my_avg(one) filter (where one > 1),my_sum(one) from agg_t10;
-- this should not share the state due to different input columns.
--Testcase 516:
delete from agg_t11;
--Testcase 517:
insert into agg_t11 values (1,2),(3,4);
--Testcase 518:
select my_avg(one),my_sum(two) from agg_t11;
-- exercise cases where OSAs share state
--Testcase 519:
delete from agg_t12;
--Testcase 520:
insert into agg_t12 values (1), (3), (5), (7);
--Testcase 521:
select
percentile_cont(0.5) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
--Testcase 522:
select
percentile_cont(0.25) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
-- these can't share state currently
--Testcase 523:
select
rank(4) within group (order by a),
dense_rank(4) within group (order by a)
from agg_t12;
-- test that aggs with the same sfunc and initcond share the same agg state
--Testcase 524:
create aggregate my_sum_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn,
initcond = '(10,0)'
);
--Testcase 525:
create aggregate my_avg_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn,
initcond = '(10,0)'
);
--Testcase 526:
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
--Testcase 527:
delete from agg_t10;
--Testcase 528:
insert into agg_t10 values (1), (3);
--Testcase 529:
select my_sum_init(one),my_avg_init(one) from agg_t10;
-- Varying INITCONDs should cause the states not to be shared.
--Testcase 530:
select my_sum_init(one),my_avg_init2(one) from agg_t10;
rollback;
-- test aggregate state sharing to ensure it works if one aggregate has a
-- finalfn and the other one has none.
begin work;
--Testcase 531:
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;
--Testcase 532:
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;
--Testcase 533:
create aggregate my_sum(int4)
(
stype = int4,
sfunc = sum_transfn
);
--Testcase 534:
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
--Testcase 535:
delete from agg_t10;
--Testcase 536:
insert into agg_t10 values (1), (2), (3), (4);
--Testcase 537:
select my_sum(one),my_half_sum(one) from agg_t10;
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;
--Testcase 538:
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$$;
--Testcase 539:
CREATE AGGREGATE balk(int4)
(
SFUNC = balkifnull(int8, int4),
STYPE = int8,
PARALLEL = SAFE,
INITCOND = '0'
);
--Testcase 200:
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;
--Testcase 540:
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$$;
--Testcase 541:
CREATE AGGREGATE balk(int4)
(
SFUNC = int4_sum(int8, int4),
STYPE = int8,
COMBINEFUNC = balkifnull(int8, int8),
PARALLEL = SAFE,
INITCOND = '0'
);
-- force use of parallelism
-- Skip this test, cannot alter foreign table tenk1
-- ALTER FOREIGN 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 multiple usage of an aggregate whose finalfn returns a R/W datum
BEGIN;
CREATE FUNCTION rwagg_sfunc(x anyarray, y anyarray) RETURNS anyarray
LANGUAGE plpgsql IMMUTABLE AS $$
BEGIN
RETURN array_fill(y[1], ARRAY[4]);
END;
$$;
CREATE FUNCTION rwagg_finalfunc(x anyarray) RETURNS anyarray
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
DECLARE
res x%TYPE;
BEGIN
-- assignment is essential for this test, it expands the array to R/W
res := array_fill(x[1], ARRAY[4]);
RETURN res;
END;
$$;
CREATE AGGREGATE rwagg(anyarray) (
STYPE = anyarray,
SFUNC = rwagg_sfunc,
FINALFUNC = rwagg_finalfunc
);
CREATE FUNCTION eatarray(x real[]) RETURNS real[]
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
BEGIN
x[1] := x[1] + 1;
RETURN x;
END;
$$;
CREATE FOREIGN TABLE float_tb(f real) SERVER sqlite_svr;
INSERT INTO float_tb(f) VALUES (1.0);
SELECT eatarray(rwagg(ARRAY[f::real])), eatarray(rwagg(ARRAY[f::real])) FROM float_tb;
ROLLBACK;
-- test coverage for aggregate combine/serial/deserial functions
BEGIN;
--Testcase 635:
SET parallel_setup_cost = 0;
--Testcase 636:
SET parallel_tuple_cost = 0;
--Testcase 637:
SET min_parallel_table_scan_size = 0;
--Testcase 638:
SET max_parallel_workers_per_gather = 4;
--Testcase 639:
SET parallel_leader_participation = off;
--Testcase 640:
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
--Testcase 542:
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;
--Testcase 543:
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
--Testcase 544:
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;
--Testcase 545:
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
--Testcase 546:
create foreign table agg_t13(x int, id int options (key 'true')) server sqlite_svr;
--Testcase 547:
insert into agg_t13 values (1),(1),(2),(2),(3),(3);
--Testcase 548:
SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM agg_t13 GROUP BY (x) ORDER BY 1;
--Testcase 549:
delete from agg_t13;
-- 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
--Testcase 550:
create foreign table agg_t14(x int, y int, id int options (key 'true')) server sqlite_svr;
--Testcase 551:
insert into agg_t14 values (1, NULL), (1, 2);
--Testcase 552:
SELECT min(x ORDER BY y) FROM agg_t14;
--Testcase 553:
SELECT min(x ORDER BY y) FROM agg_t14;
-- check collation-sensitive matching between grouping expressions
begin;
--Testcase 554:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 555:
select x||'a', case x||'a' when 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
begin;
--Testcase 556:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 557:
select x||'a', case when x||'a' = 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
-- 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
--Testcase 641:
set enable_memoize to off;
--Testcase 558:
explain (costs off)
select 1 from tenk1
where (hundred, thousand) in (select twothousand, twothousand from onek);
--Testcase 642:
reset enable_memoize;
--
-- Hash Aggregation Spill tests
--
--Testcase 643:
set enable_sort=false;
--Testcase 644:
set work_mem='64kB';
--Testcase 559:
select unique1, count(*), sum(twothousand) from tenk1
group by unique1
having sum(fivethous) > 4975
order by sum(twothousand);
--Testcase 645:
set work_mem to default;
--Testcase 646:
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.
--
--Testcase 647:
set work_mem='64kB';
--Testcase 560:
create foreign table agg_data_2k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 561:
create foreign table agg_data_20k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 562:
create foreign table agg_group_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 563:
create foreign table agg_group_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 564:
create foreign table agg_group_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 565:
create foreign table agg_group_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 566:
create foreign table agg_hash_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 567:
create foreign table agg_hash_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 568:
create foreign table agg_hash_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 569:
create foreign table agg_hash_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 570:
insert into agg_data_2k select g from generate_series(0, 1999) g;
--analyze agg_data_2k;
--Testcase 571:
insert into agg_data_20k select g from generate_series(0, 19999) g;
--analyze agg_data_20k;
-- Produce results with sorting.
--Testcase 648:
set enable_hashagg = false;
--Testcase 649:
set jit_above_cost = 0;
--Testcase 572:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 573:
insert into agg_group_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 574:
insert into agg_group_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 650:
set jit_above_cost to default;
--Testcase 575:
insert into agg_group_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 576:
insert into agg_group_4
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
--Testcase 651:
set enable_hashagg = true;
--Testcase 652:
set enable_sort = false;
--Testcase 653:
set jit_above_cost = 0;
--Testcase 577:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 578:
insert into agg_hash_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 579:
insert into agg_hash_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 654:
set jit_above_cost to default;
--Testcase 580:
insert into agg_hash_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 581:
insert into agg_hash_4
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 655:
set enable_sort = true;
--Testcase 656:
set work_mem to default;
-- Compare group aggregation results to hash aggregation results
--Testcase 582:
(select * from agg_hash_1 except select * from agg_group_1)
union all
(select * from agg_group_1 except select * from agg_hash_1);
--Testcase 583:
(select * from agg_hash_2 except select * from agg_group_2)
union all
(select * from agg_group_2 except select * from agg_hash_2);
--Testcase 584:
(select * from agg_hash_3 except select * from agg_group_3)
union all
(select * from agg_group_3 except select * from agg_hash_3);
--Testcase 585:
(select * from agg_hash_4 except select * from agg_group_4)
union all
(select * from agg_group_4 except select * from agg_hash_4);
--Testcase 712:
DELETE FROM INT4_TBL;
--Testcase 713:
DELETE FROM INT8_TBL;
--Testcase 714:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 586:
DROP SERVER sqlite_svr CASCADE;
--Testcase 587:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/encodings.sql
================================================
-- tests for PR #76 github
-- see https://www.postgresql.org/docs/current/multibyte.html
-- EUC_CN, not tested
-- EUC_JP
-- EUC_JIS_2004, not tested
-- EUC_KR
-- EUC_TW, not tested
-- ISO_8859_5
-- ISO_8859_6
-- ISO_8859_7
-- ISO_8859_8
-- KOI8R, not tested
-- KOI8U, not tested
-- LATIN1
-- LATIN2
-- LATIN3
-- LATIN4
-- LATIN5
-- LATIN6
-- LATIN7
-- LATIN8
-- LATIN9
-- LATIN10
-- MULE_INTERNAL, not tested
-- SQL_ASCII
-- WIN866, not tested
-- WIN874, not tested
-- WIN1250
-- WIN1251
-- WIN1252
-- WIN1253
-- WIN1254
-- WIN1255
-- WIN1256
-- WIN1257
-- WIN1258, not tested
-- ================
-- check all data in UTF8
-- ================
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
SELECT * FROM "Unicode data";
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
-- euc_jp
CREATE DATABASE "contrib_regression_EUC_JP" ENCODING EUC_JP LC_CTYPE='ja_JP.eucjp' LC_COLLATE='ja_JP.eucjp' template template0;
\connect "contrib_regression_EUC_JP"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_JP";
-- ko_KR.euckr
CREATE DATABASE "contrib_regression_EUC_KR" ENCODING EUC_KR LC_CTYPE='ko_KR.euckr' LC_COLLATE='ko_KR.euckr' template template0;
\connect "contrib_regression_EUC_KR"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_KR";
-- ISO_8859_5
CREATE DATABASE "contrib_regression_ISO_8859_5" ENCODING ISO_8859_5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_5";
-- ISO_8859_6
CREATE DATABASE "contrib_regression_ISO_8859_6" ENCODING ISO_8859_6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_6";
-- ISO_8859_7
CREATE DATABASE "contrib_regression_ISO_8859_7" ENCODING ISO_8859_7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_7";
-- ISO_8859_8
CREATE DATABASE "contrib_regression_ISO_8859_8" ENCODING ISO_8859_8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_8";
-- ISO_8859_9
CREATE DATABASE "contrib_regression_ISO_8859_9" ENCODING ISO_8859_9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_9";
-- LATIN1
CREATE DATABASE "contrib_regression_LATIN1" ENCODING LATIN1 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN1"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN1";
-- LATIN2
CREATE DATABASE "contrib_regression_LATIN2" ENCODING LATIN2 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN2"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN2";
-- LATIN3
CREATE DATABASE "contrib_regression_LATIN3" ENCODING LATIN3 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN3"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN3";
-- LATIN4
CREATE DATABASE "contrib_regression_LATIN4" ENCODING LATIN4 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN4"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN4";
-- LATIN5
CREATE DATABASE "contrib_regression_LATIN5" ENCODING LATIN5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN5";
-- LATIN6
CREATE DATABASE "contrib_regression_LATIN6" ENCODING LATIN6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN6";
-- LATIN7
CREATE DATABASE "contrib_regression_LATIN7" ENCODING LATIN7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN7";
-- LATIN8
CREATE DATABASE "contrib_regression_LATIN8" ENCODING LATIN8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN8";
-- LATIN9
CREATE DATABASE "contrib_regression_LATIN9" ENCODING LATIN9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN9";
-- LATIN10
CREATE DATABASE "contrib_regression_LATIN10" ENCODING LATIN10 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN10"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN10";
-- cp1250
CREATE DATABASE "contrib_regression_WIN1250" ENCODING WIN1250 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1250"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1250";
-- cp1251
CREATE DATABASE "contrib_regression_WIN1251" ENCODING WIN1251 LC_CTYPE='bg_BG' LC_COLLATE='bg_BG' template template0;
\connect "contrib_regression_WIN1251"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1251";
-- cp1252
CREATE DATABASE "contrib_regression_WIN1252" ENCODING WIN1252 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1252"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1252";
-- cp1253
CREATE DATABASE "contrib_regression_WIN1253" ENCODING WIN1253 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1253"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1253";
-- cp1254
CREATE DATABASE "contrib_regression_WIN1254" ENCODING WIN1254 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1254"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1254";
-- cp1255
CREATE DATABASE "contrib_regression_WIN1255" ENCODING WIN1255 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1255"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1255";
-- cp1256
CREATE DATABASE "contrib_regression_WIN1256" ENCODING WIN1256 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1256"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1256";
-- cp1257
CREATE DATABASE "contrib_regression_WIN1257" ENCODING WIN1257 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1257"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1257";
-- SQL_ASCII
CREATE DATABASE "contrib_regression_SQL_ASCII" ENCODING SQL_ASCII LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_SQL_ASCII"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_SQL_ASCII";
================================================
FILE: sql/14.12/extra/insert.sql
================================================
--
-- insert with DEFAULT in the target_list
--
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 18:
CREATE FOREIGN TABLE inserttest01 (col1 int4, col2 int4 NOT NULL, col3 text default 'testing') SERVER sqlite_svr;
--Testcase 1:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT);
--Testcase 2:
insert into inserttest01 (col2, col3) values (3, DEFAULT);
--Testcase 3:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, 5, DEFAULT);
--Testcase 4:
insert into inserttest01 values (DEFAULT, 5, 'test');
--Testcase 5:
insert into inserttest01 values (DEFAULT, 7);
--Testcase 6:
select * from inserttest01;
--
-- insert with similar expression / target_list values (all fail)
--
--Testcase 7:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT);
--Testcase 8:
insert into inserttest01 (col1, col2, col3) values (1, 2);
--Testcase 9:
insert into inserttest01 (col1) values (1, 2);
--Testcase 10:
insert into inserttest01 (col1) values (DEFAULT, DEFAULT);
--Testcase 11:
select * from inserttest01;
--
-- VALUES test
--
--Testcase 12:
insert into inserttest01 values(10, 20, '40'), (-1, 2, DEFAULT),
((select 2), (select i from (values(3)) as foo (i)), 'values are fun!');
--Testcase 13:
select * from inserttest01;
--
-- TOASTed value test
--
--Testcase 14:
insert into inserttest01 values(30, 50, repeat('x', 10000));
--Testcase 15:
select col1, col2, char_length(col3) from inserttest01;
--
-- tuple larger than fillfactor
-- foreign table does not support 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;
-- skip, sqlite fdw does not support customized type
/*
-- 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;
*/
-- drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 19:
DROP SERVER sqlite_svr;
--Testcase 20:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/join.sql
================================================
--
-- JOIN
-- Test JOIN clauses
--
--Testcase 360:
CREATE EXTENSION sqlite_fdw;
--Testcase 361:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 362:
CREATE FOREIGN TABLE J1_TBL (
i integer,
j integer,
t text
) SERVER sqlite_svr;
--Testcase 363:
CREATE FOREIGN TABLE J2_TBL (
i integer,
k integer
) SERVER sqlite_svr;
--Testcase 364:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 365:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 366:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 539:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 540:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 541:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 542:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 543:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 367:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 544:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 545:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 546:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 547:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 548:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
--Testcase 368:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 549:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 550:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 551:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 552:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 553:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 369:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO J1_TBL VALUES (1, 4, 'one');
--Testcase 2:
INSERT INTO J1_TBL VALUES (2, 3, 'two');
--Testcase 3:
INSERT INTO J1_TBL VALUES (3, 2, 'three');
--Testcase 4:
INSERT INTO J1_TBL VALUES (4, 1, 'four');
--Testcase 5:
INSERT INTO J1_TBL VALUES (5, 0, 'five');
--Testcase 6:
INSERT INTO J1_TBL VALUES (6, 6, 'six');
--Testcase 7:
INSERT INTO J1_TBL VALUES (7, 7, 'seven');
--Testcase 8:
INSERT INTO J1_TBL VALUES (8, 8, 'eight');
--Testcase 9:
INSERT INTO J1_TBL VALUES (0, NULL, 'zero');
--Testcase 10:
INSERT INTO J1_TBL VALUES (NULL, NULL, 'null');
--Testcase 11:
INSERT INTO J1_TBL VALUES (NULL, 0, 'zero');
--Testcase 12:
INSERT INTO J2_TBL VALUES (1, -1);
--Testcase 13:
INSERT INTO J2_TBL VALUES (2, 2);
--Testcase 14:
INSERT INTO J2_TBL VALUES (3, -3);
--Testcase 15:
INSERT INTO J2_TBL VALUES (2, 4);
--Testcase 16:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 17:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 18:
INSERT INTO J2_TBL VALUES (0, NULL);
--Testcase 19:
INSERT INTO J2_TBL VALUES (NULL, NULL);
--Testcase 20:
INSERT INTO J2_TBL VALUES (NULL, 0);
-- useful in some tests below
--Testcase 370:
create temp table onerow();
--Testcase 371:
insert into onerow default values;
analyze onerow;
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
--Testcase 21:
SELECT *
FROM J1_TBL AS tx;
--Testcase 22:
SELECT *
FROM J1_TBL tx;
--Testcase 23:
SELECT *
FROM J1_TBL AS t1 (a, b, c);
--Testcase 24:
SELECT *
FROM J1_TBL t1 (a, b, c);
--Testcase 25:
SELECT *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
--Testcase 26:
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.
--
--Testcase 27:
SELECT *
FROM J1_TBL CROSS JOIN J2_TBL;
-- ambiguous column
--Testcase 28:
SELECT i, k, t
FROM J1_TBL CROSS JOIN J2_TBL;
-- resolve previous ambiguity by specifying the table name
--Testcase 29:
SELECT t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
--Testcase 30:
SELECT ii, tt, kk
FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
--Testcase 31:
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);
--Testcase 32:
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
--Testcase 33:
SELECT *
FROM J1_TBL INNER JOIN J2_TBL USING (i);
-- Same as above, slightly different syntax
--Testcase 34:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i);
--Testcase 35:
SELECT *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a)
ORDER BY a, d;
--Testcase 36:
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
--Testcase 489:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) WHERE J1_TBL.t = 'one'; -- ok
--Testcase 490:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok
--Testcase 491:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error
--Testcase 492:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok
--Testcase 493:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error
--Testcase 494:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint)
--Testcase 495:
SELECT *
FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error
--Testcase 496:
SELECT x.*
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 497:
SELECT ROW(x.*)
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 498:
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
--
--Testcase 37:
SELECT *
FROM J1_TBL NATURAL JOIN J2_TBL;
--Testcase 38:
SELECT *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
--Testcase 39:
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
--Testcase 40:
SELECT *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
--
-- Inner joins (equi-joins)
--
--Testcase 41:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
--Testcase 42:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
--
-- Non-equi-joins
--
--Testcase 43:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
--
-- Outer joins
-- Note that OUTER is a noise word
--
--Testcase 44:
SELECT *
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 45:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 46:
SELECT *
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
--Testcase 47:
SELECT *
FROM J1_TBL RIGHT JOIN J2_TBL USING (i);
--Testcase 48:
SELECT *
FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 49:
SELECT *
FROM J1_TBL FULL JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 50:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1);
--Testcase 51:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1);
--
-- semijoin selectivity for <>
--
--Testcase 52:
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
--
--Testcase 372:
CREATE FOREIGN TABLE t11 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 373:
CREATE FOREIGN TABLE t21 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 374:
CREATE FOREIGN TABLE t31 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 53:
INSERT INTO t11 VALUES ( 'bb', 11 );
--Testcase 54:
INSERT INTO t21 VALUES ( 'bb', 12 );
--Testcase 55:
INSERT INTO t21 VALUES ( 'cc', 22 );
--Testcase 56:
INSERT INTO t21 VALUES ( 'ee', 42 );
--Testcase 57:
INSERT INTO t31 VALUES ( 'bb', 13 );
--Testcase 58:
INSERT INTO t31 VALUES ( 'cc', 23 );
--Testcase 59:
INSERT INTO t31 VALUES ( 'dd', 33 );
--Testcase 60:
SELECT * FROM t11 FULL JOIN t21 USING (name) FULL JOIN t31 USING (name);
--
-- Test interactions of join syntax and subqueries
--
-- Basic cases (we expect planner to pull up the subquery here)
--Testcase 61:
SELECT * FROM
(SELECT * FROM t21) as s2
INNER JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 62:
SELECT * FROM
(SELECT * FROM t21) as s2
LEFT JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 63:
SELECT * FROM
(SELECT * FROM t21) as s2
FULL JOIN
(SELECT * FROM t31) s3
USING (name);
-- Cases with non-nullable expressions in subquery results;
-- make sure these go to null as expected
--Testcase 64:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 65:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL LEFT JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 66:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 67:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL INNER JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 68:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL FULL JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 69:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
--Testcase 70:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
-- Constants as join keys can also be problematic
--Testcase 375:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
FULL JOIN
(SELECT name, 2 as s2_n FROM t21) as s2
ON (s1_n = s2_n);
-- Test for propagation of nullability constraints into sub-joins
--Testcase 376:
create foreign table x (x1 int, x2 int) server sqlite_svr;
--Testcase 71:
insert into x values (1,11);
--Testcase 72:
insert into x values (2,22);
--Testcase 73:
insert into x values (3,null);
--Testcase 74:
insert into x values (4,44);
--Testcase 75:
insert into x values (5,null);
--Testcase 377:
create foreign table y (y1 int, y2 int) server sqlite_svr;
--Testcase 76:
insert into y values (1,111);
--Testcase 77:
insert into y values (2,222);
--Testcase 78:
insert into y values (3,333);
--Testcase 79:
insert into y values (4,null);
--Testcase 80:
select * from x;
--Testcase 81:
select * from y;
--Testcase 82:
select * from x left join y on (x1 = y1 and x2 is not null);
--Testcase 83:
select * from x left join y on (x1 = y1 and y2 is not null);
--Testcase 84:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1);
--Testcase 85:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and x2 is not null);
--Testcase 86:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and y2 is not null);
--Testcase 87:
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
--Testcase 88:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (x2 is not null);
--Testcase 89:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (y2 is not null);
--Testcase 90:
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
--
--Testcase 91:
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
--
--Testcase 92:
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;
--Testcase 499:
set geqo = on;
--Testcase 500:
set geqo_threshold = 2;
--Testcase 93:
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
--
--Testcase 378:
create table b (aa int, bb int);
--Testcase 379:
explain (costs off)
select aa, bb, unique1, unique1
from tenk1 right join b on aa = unique1
where bb < bb and bb is null;
--Testcase 380:
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
--
--Testcase 94:
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;
--Testcase 95:
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
--
--Testcase 96:
select count(*)
from
(select t31.tenthous as x1, coalesce(t11.stringu1, t21.stringu1) as x2
from tenk1 t11
left join tenk1 t21 on t11.unique1 = t21.unique1
join tenk1 t31 on t11.unique2 = t31.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
--
--Testcase 97:
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;
--Testcase 98:
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
-- PS: Used ORDER BY to force SQLite and PG12 always order in the same way (NULLS FIRST/LAST default value for PG and Sqlite are different)
--
--Testcase 99:
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 ORDER BY j1_tbl.i, j2_tbl.k;
--Testcase 100:
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 BY j1_tbl.i, j2_tbl.k;
--
-- a different check for handling of redundant sort keys in merge joins
--
--Testcase 101:
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;
--Testcase 102:
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
--
--Testcase 381:
DROP FOREIGN TABLE t11;
--Testcase 382:
DROP FOREIGN TABLE t21;
--Testcase 383:
DROP FOREIGN TABLE t31;
--Testcase 384:
DROP FOREIGN TABLE J1_TBL;
--Testcase 385:
DROP FOREIGN TABLE J2_TBL;
-- Both DELETE and UPDATE allow the specification of additional tables
-- to "join" against to determine which rows should be modified.
--Testcase 386:
CREATE FOREIGN TABLE t12 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 387:
CREATE FOREIGN TABLE t22 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 388:
CREATE FOREIGN TABLE t32 (x int OPTIONS (key 'true'), y int) SERVER sqlite_svr;
--Testcase 103:
INSERT INTO t12 VALUES (5, 10);
--Testcase 104:
INSERT INTO t12 VALUES (15, 20);
--Testcase 105:
INSERT INTO t12 VALUES (100, 100);
--Testcase 106:
INSERT INTO t12 VALUES (200, 1000);
--Testcase 107:
INSERT INTO t22 VALUES (200, 2000);
--Testcase 108:
INSERT INTO t32 VALUES (5, 20);
--Testcase 109:
INSERT INTO t32 VALUES (6, 7);
--Testcase 110:
INSERT INTO t32 VALUES (7, 8);
--Testcase 111:
INSERT INTO t32 VALUES (500, 100);
--Testcase 112:
DELETE FROM t32 USING t12 table1 WHERE t32.x = table1.a;
--Testcase 113:
SELECT * FROM t32;
--Testcase 114:
DELETE FROM t32 USING t12 JOIN t22 USING (a) WHERE t32.x > t12.a;
--Testcase 115:
SELECT * FROM t32;
--Testcase 116:
DELETE FROM t32 USING t32 t3_other WHERE t32.x = t3_other.x AND t32.y = t3_other.y;
--Testcase 117:
SELECT * FROM t32;
-- Test join against inheritance tree
--Testcase 389:
create temp table t2a () inherits (t22);
--Testcase 118:
insert into t2a values (200, 2001);
--Testcase 119:
select * from t12 left join t22 on (t12.a = t22.a);
-- Test matching of column name with wrong alias
--Testcase 120:
select t12.x from t12 join t32 on (t12.a = t32.x);
--Testcase 536:
drop table t2a;
--
-- regression test for 8.1 merge right join bug
--
--Testcase 390:
CREATE FOREIGN TABLE tt1 ( tt1_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO tt1 VALUES (1, 11);
--Testcase 122:
INSERT INTO tt1 VALUES (2, NULL);
--Testcase 391:
CREATE FOREIGN TABLE tt2 ( tt2_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 123:
INSERT INTO tt2 VALUES (21, 11);
--Testcase 124:
INSERT INTO tt2 VALUES (22, 11);
--Testcase 501:
set enable_hashjoin to off;
--Testcase 502:
set enable_nestloop to off;
-- these should give the same results
--Testcase 125:
select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol;
--Testcase 126:
select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol;
--Testcase 503:
reset enable_hashjoin;
--Testcase 504:
reset enable_nestloop;
--
-- regression test for bug #13908 (hash join with skew tuples & nbatch increase)
--
--Testcase 505:
set work_mem to '64kB';
--Testcase 506:
set enable_mergejoin to off;
--Testcase 507:
set enable_memoize to off;
--Testcase 127:
explain (costs off)
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 128:
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 508:
reset work_mem;
--Testcase 509:
reset enable_mergejoin;
--Testcase 510:
reset enable_memoize;
--
-- regression test for 8.2 bug with improper re-ordering of left joins
--
--Testcase 392:
create foreign table tt3(f1 int, f2 text) server sqlite_svr;
--Testcase 129:
insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x;
--Testcase 393:
create foreign table tt4(f1 int) server sqlite_svr;
--Testcase 130:
insert into tt4 values (0),(1),(9999);
--Testcase 131:
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
--
--Testcase 394:
create foreign table tt4x(c1 int, c2 int, c3 int) server sqlite_svr;
--Testcase 132:
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
--
--Testcase 395:
create foreign table tt5(f1 int, f2 int) server sqlite_svr;
--Testcase 396:
create foreign table tt6(f1 int, f2 int) server sqlite_svr;
--Testcase 133:
insert into tt5 values(1, 10);
--Testcase 134:
insert into tt5 values(1, 11);
--Testcase 135:
insert into tt6 values(1, 9);
--Testcase 136:
insert into tt6 values(1, 2);
--Testcase 137:
insert into tt6 values(2, 9);
--Testcase 138:
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
--
--Testcase 397:
create foreign table xx (pkxx int) server sqlite_svr;
--Testcase 398:
create foreign table yy (pkyy int, pkxx int) server sqlite_svr;
--Testcase 139:
insert into xx values (1);
--Testcase 140:
insert into xx values (2);
--Testcase 141:
insert into xx values (3);
--Testcase 142:
insert into yy values (101, 1);
--Testcase 143:
insert into yy values (201, 2);
--Testcase 144:
insert into yy values (301, NULL);
--Testcase 145:
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)
--
--Testcase 399:
create foreign table zt1 (f1 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 400:
create foreign table zt2 (f2 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 401:
create foreign table zt3 (f3 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 146:
insert into zt1 values(53);
--Testcase 147:
insert into zt2 values(53);
--Testcase 148:
select * from
zt2 left join zt3 on (f2 = f3)
left join zt1 on (f3 = f1)
where f2 = 53;
--Testcase 402:
create temp view zv1 as select *,'dummy'::text AS junk from zt1;
--Testcase 149:
select * from
zt2 left join zt3 on (f2 = f3)
left join zv1 on (f3 = f1)
where f2 = 53;
--Testcase 537:
drop view zv1;
--
-- regression test for improper extraction of OR indexqual conditions
-- (as seen in early 8.3.x releases)
--
--Testcase 150:
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)
--
--Testcase 151:
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));
--Testcase 152:
execute foo(true);
--Testcase 153:
execute foo(false);
--
-- test for sane behavior with noncanonical merge clauses, per bug #4926
--
begin;
--Testcase 511:
set enable_mergejoin = 1;
--Testcase 512:
set enable_hashjoin = 0;
--Testcase 513:
set enable_nestloop = 0;
--Testcase 403:
create foreign table a1 (i integer) server sqlite_svr;
--Testcase 404:
create foreign table b1 (x integer, y integer) server sqlite_svr;
--Testcase 154:
select * from a1 left join b1 on i = x and i = y and x = i;
rollback;
-- skip this test, sqlite fdw does not support customized type
-- test handling of merge clauses using record_ops
--
--begin;
--create type mycomptype as (id int, v bigint);
--create foreign table tidv (idv mycomptype) server sqlite_svr;
--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;
--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
--
--Testcase 155:
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;
--Testcase 156:
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;
--Testcase 157:
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;
--Testcase 158:
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;
--Testcase 405:
create foreign table a2 (
code char OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 406:
create foreign table b2 (
a char OPTIONS (key 'true'),
num integer OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 407:
create foreign table c2 (
name char OPTIONS (key 'true'),
a char
) server sqlite_svr;
--Testcase 159:
insert into a2 (code) values ('p');
--Testcase 160:
insert into a2 (code) values ('q');
--Testcase 161:
insert into b2 (a, num) values ('p', 1);
--Testcase 162:
insert into b2 (a, num) values ('p', 2);
--Testcase 163:
insert into c2 (name, a) values ('A', 'p');
--Testcase 164:
insert into c2 (name, a) values ('B', 'q');
--Testcase 165:
insert into c2 (name, a) values ('C', null);
--Testcase 166:
select c2.name, ss.code, ss.b_cnt, ss.const
from c2 left join
(select a2.code, coalesce(b_grp.cnt, 0) as b_cnt, -1 as const
from a2 left join
(select count(1) as cnt, b2.a from b2 group by b2.a) as b_grp
on a2.code = b_grp.a
) as ss
on (c2.a = ss.code)
order by c2.name;
rollback;
--
-- test incorrect handling of placeholders that only appear in targetlists,
-- per bug #6154
--
--Testcase 408:
create foreign table sub_tbl (key1 int, key3 int, key5 int, key6 int, value1 int, id int options (key 'true')) server sqlite_svr;
--Testcase 409:
insert into sub_tbl values (1, 1, 1, 2, 42);
--Testcase 410:
SELECT * FROM
( SELECT key1 from sub_tbl) sub1
LEFT JOIN
( SELECT sub3.key3, sub4.value2, COALESCE(sub4.value2, 66) as value3 FROM
( SELECT key3 from sub_tbl) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl ) 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
--Testcase 411:
SELECT * FROM
( SELECT key1 from sub_tbl ) sub1
LEFT JOIN
( SELECT sub3.key3, value2, COALESCE(value2, 66) as value3 FROM
( SELECT key3 from sub_tbl ) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl ) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl) 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
--
--Testcase 167:
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;
--Testcase 168:
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
--
--Testcase 412:
create foreign table nt1 (
id int OPTIONS (key 'true'),
a1 boolean,
a2 boolean
) server sqlite_svr;
--Testcase 413:
create foreign table nt2 (
id int OPTIONS (key 'true'),
nt1_id int,
b1 boolean,
b2 boolean
) server sqlite_svr;
--Testcase 414:
create foreign table nt3 (
id int OPTIONS (key 'true'),
nt2_id int,
c1 boolean
) server sqlite_svr;
--Testcase 169:
insert into nt1 values (1,true,true);
--Testcase 170:
insert into nt1 values (2,true,false);
--Testcase 171:
insert into nt1 values (3,false,false);
--Testcase 172:
insert into nt2 values (1,1,true,true);
--Testcase 173:
insert into nt2 values (2,2,true,false);
--Testcase 174:
insert into nt2 values (3,3,false,false);
--Testcase 175:
insert into nt3 values (1,1,true);
--Testcase 176:
insert into nt3 values (2,2,false);
--Testcase 177:
insert into nt3 values (3,3,true);
--Testcase 178:
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;
--Testcase 179:
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
--
--Testcase 180:
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;
--Testcase 181:
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
--
--Testcase 514:
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;
--Testcase 515:
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
--
--Testcase 182:
select * from int4_tbl a full join int4_tbl b on true;
--Testcase 183:
select * from int4_tbl a full join int4_tbl b on false;
--
-- test for ability to use a cartesian join when necessary
--
--Testcase 415:
create foreign table q1(i int) server sqlite_svr;
--Testcase 416:
insert into q1 values (1);
--Testcase 417:
create foreign table q2(i int) server sqlite_svr;
--Testcase 418:
insert into q2 values (0);
--Testcase 184:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where q1.i = thousand or q2.i = thousand;
--Testcase 185:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where thousand = (q1.i + q2.i);
--
-- test ability to generate a suitable plan for a star-schema query
--
--Testcase 186:
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
--
--Testcase 187:
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;
--Testcase 188:
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
--Testcase 189:
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
--Testcase 419:
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;
--Testcase 420:
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
--Testcase 421:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
--Testcase 422:
select * from
(select key1 as x from sub_tbl as x) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
-- Test proper handling of appendrel PHVs during useless-RTE removal
--Testcase 516:
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;
--Testcase 517:
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
--
--Testcase 423:
create function f_immutable_int4(i integer) returns integer as
$$ begin return i; end; $$ language plpgsql immutable;
-- check optimization of function scan with join
--Testcase 424:
explain (costs off)
select unique1 from tenk1, (select * from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 425:
explain (verbose, costs off)
select unique1, x.*
from tenk1, (select *, random() from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 426:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = unique1;
--Testcase 427:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
--Testcase 538:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
--Testcase 428:
explain (costs off)
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
--Testcase 429:
explain (costs off)
select unique1, x from tenk1 left join f_immutable_int4(1) x on unique1 = x;
--Testcase 430:
explain (costs off)
select unique1, x from tenk1 right join f_immutable_int4(1) x on unique1 = x;
--Testcase 431:
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
--Testcase 432:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = 42;
-- test inlining of immutable functions with PlaceHolderVars
--Testcase 433:
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;
--Testcase 434:
drop function f_immutable_int4(int);
-- test inlining when function returns composite
--Testcase 435:
create function mki8(bigint, bigint) returns int8_tbl as
$$select row($1,$2)::int8_tbl$$ language sql;
--Testcase 436:
create function mki4(int) returns int4_tbl as
$$select row($1)::int4_tbl$$ language sql;
--Testcase 437:
explain (verbose, costs off)
select * from mki8(1,2);
--Testcase 438:
select * from mki8(1,2);
--Testcase 439:
explain (verbose, costs off)
select * from mki4(42);
--Testcase 440:
select * from mki4(42);
--Testcase 441:
drop function mki8(bigint, bigint);
--Testcase 442:
drop function mki4(int);
--
-- test extraction of restriction OR clauses from join OR clause
-- (we used to only do this for indexable clauses)
--
--Testcase 190:
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);
--Testcase 191:
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);
--Testcase 192:
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
--
--Testcase 193:
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;
--Testcase 194:
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;
--Testcase 195:
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;
--Testcase 196:
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;
--Testcase 197:
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;
--Testcase 198:
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;
--Testcase 199:
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;
--Testcase 200:
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;
--Testcase 201:
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;
--Testcase 202:
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
--
--Testcase 203:
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);
--Testcase 204:
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);
--Testcase 205:
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;
--Testcase 206:
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)
--
--Testcase 207:
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;
--Testcase 208:
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
--
--Testcase 209:
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);
--Testcase 210:
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
--
--Testcase 443:
create foreign table text_tbl(f1 text) server sqlite_svr;
--Testcase 211:
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);
--Testcase 212:
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);
--Testcase 213:
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);
--Testcase 214:
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);
--Testcase 215:
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);
--Testcase 216:
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);
--Testcase 217:
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;
--Testcase 218:
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
--
--Testcase 219:
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;
--Testcase 220:
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;
--Testcase 221:
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;
--Testcase 222:
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;
--Testcase 223:
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;
--Testcase 224:
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
--
--Testcase 225:
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;
--Testcase 226:
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)
--
--Testcase 227:
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));
--Testcase 228:
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
--
--Testcase 229:
explain (costs off)
select * from int4_tbl a left join tenk1 b on f1 = unique2 where f1 = 0;
--Testcase 230:
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
--
--Testcase 518:
set enable_hashjoin to off;
--Testcase 519:
set enable_nestloop to off;
--Testcase 231:
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;
--Testcase 232:
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;
--Testcase 520:
reset enable_hashjoin;
--Testcase 521:
reset enable_nestloop;
--
-- test join removal
--
begin;
--Testcase 444:
CREATE FOREIGN TABLE a3 (id int OPTIONS (key 'true'), b_id int) SERVER sqlite_svr;
--Testcase 445:
CREATE FOREIGN TABLE b3 (id int OPTIONS (key 'true'), c_id int) SERVER sqlite_svr;
--Testcase 446:
CREATE FOREIGN TABLE c3 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 447:
CREATE FOREIGN TABLE d3 (a int, b int) SERVER sqlite_svr;
--Testcase 233:
INSERT INTO a3 VALUES (0, 0), (1, NULL);
--Testcase 234:
INSERT INTO b3 VALUES (0, 0), (1, NULL);
--Testcase 235:
INSERT INTO c3 VALUES (0), (1);
--Testcase 236:
INSERT INTO d3 VALUES (1,3), (2,2), (3,1);
-- all three cases should be optimizable into a3 simple seqscan
--Testcase 237:
explain (costs off) SELECT a3.* FROM a3 LEFT JOIN b3 ON a3.b_id = b3.id;
--Testcase 238:
explain (costs off) SELECT b3.* FROM b3 LEFT JOIN c3 ON b3.c_id = c3.id;
--Testcase 239:
explain (costs off)
SELECT a3.* FROM a3 LEFT JOIN (b3 left join c3 on b3.c_id = c3.id)
ON (a3.b_id = b3.id);
-- check optimization of outer join within another special join
--Testcase 240:
explain (costs off)
select id from a3 where id in (
select b3.id from b3 left join c3 on b3.id = c3.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
--Testcase 241:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id and d3.b = s.c_id;
-- similarly, but keying off a DISTINCT clause
--Testcase 242:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id and d3.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 b3.id is a
-- primary key and so drop b3.c_id from the GROUP BY of the resulting plan;
-- but this happens too late for join removal in the outer plan level.)
--Testcase 243:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id;
-- similarly, but keying off a DISTINCT clause
--Testcase 244:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id;
-- check join removal works when uniqueness of the join condition is enforced
-- by a UNION
--Testcase 245:
explain (costs off)
select d3.* from d3 left join (select id from a3 union select id from b3) s
on d3.a = s.id;
-- check join removal with a cross-type comparison operator
--Testcase 246:
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
--Testcase 247:
explain (costs off)
select 1 from (select a3.id FROM a3 left join b3 on a3.b_id = b3.id) q,
lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
rollback;
--Testcase 448:
create foreign table parent (k int options (key 'true'), pd int) server sqlite_svr;
--Testcase 449:
create foreign table child (k int options (key 'true'), cd int) server sqlite_svr;
--Testcase 248:
insert into parent values (1, 10), (2, 20), (3, 30);
--Testcase 249:
insert into child values (1, 100), (4, 400);
-- this case is optimizable
--Testcase 250:
select p.* from parent p left join child c on (p.k = c.k);
--Testcase 251:
explain (costs off)
select p.* from parent p left join child c on (p.k = c.k);
-- this case is not
--Testcase 252:
select p.*, linked from parent p
left join (select c.*, true as linked from child c) as ss
on (p.k = ss.k);
--Testcase 253:
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
--Testcase 254:
select p.* from
parent p left join child c on (p.k = c.k)
where p.k = 1 and p.k = 2;
--Testcase 255:
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;
--Testcase 256:
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;
--Testcase 257:
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;
--Testcase 450:
CREATE FOREIGN TABLE a4 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 451:
CREATE FOREIGN TABLE b4 (id int OPTIONS (key 'true'), a_id int) SERVER sqlite_svr;
--Testcase 258:
INSERT INTO a4 VALUES (0), (1);
--Testcase 259:
INSERT INTO b4 VALUES (0, 0), (1, NULL);
--Testcase 260:
SELECT * FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
--Testcase 261:
SELECT b4.* FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
rollback;
-- another join removal bug: this is not optimizable, either
begin;
--Testcase 452:
create foreign table innertab (id int8 options (key 'true'), dat1 int8) server sqlite_svr;
--Testcase 262:
insert into innertab values(123, 42);
--Testcase 263:
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;
--Testcase 453:
create foreign table uniquetbl (f1 text) server sqlite_svr;
--Testcase 264:
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;
--Testcase 265:
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;
--Testcase 266:
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
--Testcase 522:
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;
--Testcase 523:
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
--Testcase 267:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; -- error
--Testcase 268:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; -- error
--Testcase 269:
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
--
--Testcase 270:
select t1.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t1" suggestion
--Testcase 271:
select t2.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t2" suggestion
--Testcase 272:
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
--
--Testcase 454:
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
--
--Testcase 273:
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 274:
explain (costs off)
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 275:
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 276:
explain (costs off)
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 277:
explain (costs off)
select unique2, x.*
from int4_tbl x cross join lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 278:
select unique2, x.*
from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true;
--Testcase 279:
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
--Testcase 280:
select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl;
--Testcase 281:
select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl;
-- lateral with function in FROM
--Testcase 282:
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 283:
explain (costs off)
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 284:
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
--Testcase 285:
explain (costs off)
select count(*) from tenk1 a, generate_series(1,two) g;
-- lateral with UNION ALL subselect
--Testcase 286:
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;
--Testcase 287:
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
--Testcase 288:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x;
--Testcase 289:
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
--Testcase 290:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x;
--Testcase 291:
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
--Testcase 292:
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;
--Testcase 293:
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
--Testcase 294:
select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (select x) ss2(y);
--Testcase 295:
select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (values(x)) ss2(y);
--Testcase 296:
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
--Testcase 297:
select * from (values(1)) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 298:
select * from (select f1/1000000000 from int4_tbl) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 299:
select * from (values(1)) x(lb),
lateral (values(lb)) y(lbcopy);
--Testcase 300:
select * from (values(1)) x(lb),
lateral (select lb from int4_tbl) y(lbcopy);
--Testcase 301:
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);
--Testcase 302:
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);
--Testcase 303:
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);
--Testcase 304:
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);
--Testcase 305:
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);
--Testcase 307:
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);
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 455:
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;
--Testcase 456:
select * from
int8_tbl a left join
lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1;
--Testcase 457:
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;
--Testcase 458:
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
--Testcase 308:
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;
--Testcase 309:
select * from int4_tbl i left join
lateral (select * from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 310:
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;
--Testcase 311:
select * from int4_tbl i left join
lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 312:
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;
--Testcase 313:
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
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 459:
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;
--Testcase 460:
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
--Testcase 461:
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
--Testcase 462:
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)
--Testcase 463:
delete from sub_tbl;
--Testcase 464:
insert into sub_tbl values (1, 2, 3, 4, 5);
--Testcase 465:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl offset 0) x cross join (select key3 as y from sub_tbl offset 0) y
left join lateral (
select * from (select key5 as z from sub_tbl offset 0) z where z.z = x.x
) zz on zz.z = y.y;
-- check dummy rels with lateral references (bug #15694)
--Testcase 466:
explain (verbose, costs off)
select * from int8_tbl i8 left join lateral
(select *, i8.q2 from int4_tbl where false) ss on true;
--Testcase 467:
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
--Testcase 468:
select * from
((select key3 as v from sub_tbl) union all (select key5 as v from sub_tbl)) as q1
cross join lateral
((select * from
((select key6 as v from sub_tbl) union all (select value1 as v from sub_tbl)) as q3)
union all
(select q1.v)
) as q2;
-- check we don't try to do a unique-ified semijoin with LATERAL
--Testcase 314:
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;
--Testcase 315:
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)
--Testcase 316:
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;
--Testcase 317:
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
--Testcase 318:
select f1,g from int4_tbl a, (select f1 as g) ss;
--Testcase 319:
select f1,g from int4_tbl a, (select a.f1 as g) ss;
--Testcase 320:
select f1,g from int4_tbl a cross join (select f1 as g) ss;
--Testcase 321:
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
--Testcase 322:
select f1,g from int4_tbl a right join lateral generate_series(0, a.f1) g on true;
--Testcase 323:
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
--Testcase 324:
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
--Testcase 325:
select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss;
-- check behavior of LATERAL in UPDATE/DELETE
--Testcase 469:
create temp table xx1 as select f1 as x1, -f1 as x2 from int4_tbl;
-- error, can't do this:
--Testcase 326:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss;
--Testcase 327:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss;
-- can't do it even with LATERAL:
--Testcase 328:
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:
--Testcase 329:
update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1) ss;
-- also errors:
--Testcase 330:
delete from xx1 using (select * from int4_tbl where f1 = x1) ss;
--Testcase 331:
delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss;
--Testcase 332:
delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
-- Skip this test, sqlite fdw does not support to create partition table
-- 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;
--Testcase 524:
create table fkest (x integer, x10 integer, x10b integer, x100 integer);
--Testcase 525:
insert into fkest select x, x/10, x/10, x/100 from generate_series(1,1000) x;
--Testcase 526:
create unique index on fkest(x, x10, x100);
analyze fkest;
--Testcase 527:
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;
--Testcase 528:
alter table fkest add constraint fk
foreign key (x, x10b, x100) references fkest (x, x10, x100);
--Testcase 529:
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;
--Testcase 470:
create foreign table fkest (a int options (key 'true'), b int options (key 'true'), c int) server sqlite_svr;
--Testcase 471:
create foreign table fkest1 (a int options (key 'true'), b int options (key 'true')) server sqlite_svr;
--Testcase 333:
insert into fkest select x/10, x%10, x from generate_series(1,1000) x;
--Testcase 334:
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;
--Testcase 335:
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
--
--Testcase 472:
create foreign table j11 (id int options (key 'true')) server sqlite_svr;
--Testcase 473:
create foreign table j21 (id int options (key 'true')) server sqlite_svr;
--Testcase 474:
create foreign table j31 (id int) server sqlite_svr;
--Testcase 336:
insert into j11 values(1),(2),(3);
--Testcase 337:
insert into j21 values(1),(2),(3);
--Testcase 338:
insert into j31 values(1),(1);
-- ensure join is properly marked as unique
--Testcase 339:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id = j21.id;
-- ensure join is not unique when not an equi-join
--Testcase 340:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id > j21.id;
-- ensure non-unique rel is not chosen as inner
--Testcase 341:
explain (verbose, costs off)
select * from j11 inner join j31 on j11.id = j31.id;
-- ensure left join is marked as unique
--Testcase 342:
explain (verbose, costs off)
select * from j11 left join j21 on j11.id = j21.id;
-- ensure right join is marked as unique
--Testcase 343:
explain (verbose, costs off)
select * from j11 right join j21 on j11.id = j21.id;
-- ensure full join is marked as unique
--Testcase 344:
explain (verbose, costs off)
select * from j11 full join j21 on j11.id = j21.id;
-- a clauseless (cross) join can't be unique
--Testcase 345:
explain (verbose, costs off)
select * from j11 cross join j21;
-- ensure a natural join is marked as unique
--Testcase 346:
explain (verbose, costs off)
select * from j11 natural join j21;
-- ensure a distinct clause allows the inner to become unique
--Testcase 347:
explain (verbose, costs off)
select * from j11
inner join (select distinct id from j31) j31 on j11.id = j31.id;
-- ensure group by clause allows the inner to become unique
--Testcase 348:
explain (verbose, costs off)
select * from j11
inner join (select id from j31 group by id) j31 on j11.id = j31.id;
--drop table j1;
--drop table j2;
--drop table j3;
-- test more complex permutations of unique joins
--Testcase 475:
create foreign table j12 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 476:
create foreign table j22 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 477:
create foreign table j32 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 349:
insert into j12 values(1,1),(1,2);
--Testcase 350:
insert into j22 values(1,1);
--Testcase 351:
insert into j32 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
--Testcase 352:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1;
-- ensure proper unique detection with multiple join quals
--Testcase 353:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2;
-- ensure we don't detect the join to be unique when quals are not part of the
-- join condition
--Testcase 354:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 where j12.id2 = 1;
-- as above, but for left joins.
--Testcase 355:
explain (verbose, costs off)
select * from j12
left join j22 on j12.id1 = j22.id1 where j12.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.
--Testcase 530:
set enable_nestloop to 0;
--Testcase 531:
set enable_hashjoin to 0;
--Testcase 532:
set enable_sort to 0;
-- skip, cannot create index on foreign table
-- 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
--Testcase 478:
insert into j22 values(1,2);
--analyze j2;
--Testcase 356:
explain (costs off) select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
--Testcase 357:
select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
-- Exercise array keys mark/restore B-Tree code
--Testcase 479:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
--Testcase 480:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
-- Exercise array keys "find extreme element" B-Tree code
--Testcase 481:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 482:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 533:
reset enable_nestloop;
--Testcase 534:
reset enable_hashjoin;
--Testcase 535:
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
--Testcase 483:
CREATE FOREIGN TABLE onek (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 358:
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
--Testcase 484:
create table j3 as select unique1, tenthous from onek;
vacuum analyze j3;
--Testcase 485:
create unique index on j3(unique1, tenthous);
--Testcase 359:
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;
--Testcase 486:
drop table j3;
--Testcase 554:
DELETE FROM INT4_TBL;
--Testcase 555:
DELETE FROM INT8_TBL;
--Testcase 556:
DELETE FROM FLOAT8_TBL;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 487:
DROP SERVER sqlite_svr;
--Testcase 488:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/limit.sql
================================================
--
-- LIMIT
-- Check the LIMIT/OFFSET feature of SELECT
--
--Testcase 27:
CREATE EXTENSION sqlite_fdw;
--Testcase 28:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 29:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 30:
CREATE FOREIGN TABLE int8_tbl(q1 int8 OPTIONS (key 'true'), q2 int8) SERVER sqlite_svr;
--Testcase 104:
INSERT INTO int8_tbl VALUES(' 123 ',' 456');
--Testcase 105:
INSERT INTO int8_tbl VALUES('123 ','4567890123456789');
--Testcase 106:
INSERT INTO int8_tbl VALUES('4567890123456789','123');
--Testcase 107:
INSERT INTO int8_tbl VALUES(+4567890123456789,'4567890123456789');
--Testcase 108:
INSERT INTO int8_tbl VALUES('+4567890123456789','-4567890123456789');
--Testcase 31:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 32:
CREATE FOREIGN TABLE tenk1 (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 88:
CREATE TABLE parent_table (
unique1 int4 PRIMARY KEY,
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
);
--Testcase 89:
CREATE FOREIGN table inherited_table ()
INHERITS (parent_table)
SERVER sqlite_svr options (table 'tenk1');
--Testcase 1:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
ORDER BY unique1 LIMIT 2;
--Testcase 2:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60
ORDER BY unique1 LIMIT 5;
--Testcase 3:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60 AND unique1 < 63
ORDER BY unique1 LIMIT 5;
--Testcase 4:
SELECT ''::text AS three, unique1, unique2, stringu1
FROM onek WHERE unique1 > 100
ORDER BY unique1 LIMIT 3 OFFSET 20;
--Testcase 5:
SELECT ''::text AS zero, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 8 OFFSET 99;
--Testcase 6:
SELECT ''::text AS eleven, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 20 OFFSET 39;
--Testcase 7:
SELECT ''::text AS ten, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990;
--Testcase 8:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990 LIMIT 5;
--Testcase 9:
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:
--Testcase 10:
select * from int8_tbl limit (case when random() < 0.5 then null::bigint end);
--Testcase 11:
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
begin;
declare c1 scroll cursor for select * from int8_tbl order by q1 limit 10;
--Testcase 12:
fetch all in c1;
--Testcase 13:
fetch 1 in c1;
--Testcase 14:
fetch backward 1 in c1;
--Testcase 33:
fetch backward all in c1;
--Testcase 34:
fetch backward 1 in c1;
--Testcase 35:
fetch all in c1;
declare c2 scroll cursor for select * from int8_tbl limit 3;
--Testcase 36:
fetch all in c2;
--Testcase 37:
fetch 1 in c2;
--Testcase 38:
fetch backward 1 in c2;
--Testcase 39:
fetch backward all in c2;
--Testcase 40:
fetch backward 1 in c2;
--Testcase 41:
fetch all in c2;
declare c3 scroll cursor for select * from int8_tbl offset 3;
--Testcase 42:
fetch all in c3;
--Testcase 43:
fetch 1 in c3;
--Testcase 44:
fetch backward 1 in c3;
--Testcase 45:
fetch backward all in c3;
--Testcase 46:
fetch backward 1 in c3;
--Testcase 47:
fetch all in c3;
declare c4 scroll cursor for select * from int8_tbl offset 10;
--Testcase 48:
fetch all in c4;
--Testcase 49:
fetch 1 in c4;
--Testcase 50:
fetch backward 1 in c4;
--Testcase 51:
fetch backward all in c4;
--Testcase 52:
fetch backward 1 in c4;
--Testcase 53:
fetch all in c4;
declare c5 scroll cursor for select * from int8_tbl order by q1 fetch first 2 rows with ties;
--Testcase 54:
fetch all in c5;
--Testcase 55:
fetch 1 in c5;
--Testcase 56:
fetch backward 1 in c5;
--Testcase 57:
fetch backward 1 in c5;
--Testcase 58:
fetch all in c5;
--Testcase 59:
fetch backward all in c5;
--Testcase 60:
fetch all in c5;
--Testcase 61:
fetch backward all in c5;
rollback;
-- Stress test for variable LIMIT in conjunction with bounded-heap sorting
--Testcase 62:
DELETE FROM INT8_TMP;
--Testcase 63:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series(1,10) q1;
--Testcase 64:
SELECT
(SELECT s.q1
FROM (VALUES (1)) AS x,
(SELECT q1 FROM INT8_TMP as n
ORDER BY q1 LIMIT 1 OFFSET s.q1-1) AS y) AS z
FROM INT8_TMP AS s;
--
-- Test behavior of volatile and set-returning functions in conjunction
-- with ORDER BY and LIMIT.
--
--Testcase 65:
create temp sequence testseq;
--Testcase 15:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 16:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 90:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 91:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 17:
select currval('testseq');
--Testcase 92:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 93:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 94:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 95:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 96:
select currval('testseq');
--Testcase 18:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 19:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 97:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 98:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 20:
select currval('testseq');
-- test for limit and offset when querying table and foreign table inherited
--Testcase 99:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
--Testcase 100:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
-- when querying regular tables with inherited tables, only limit is pushed-down when no offset is specified
--Testcase 101:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 102:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 103:
select currval('testseq');
--Testcase 21:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 22:
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 23:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by tenthous limit 7;
--Testcase 24:
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
--Testcase 66:
DELETE FROM INT8_TMP;
--Testcase 67:
INSERT INTO INT8_TMP VALUES (generate_series(0,2), generate_series((random()*.1)::int,2));
--Testcase 68:
explain (verbose, costs off)
select q1, q2 from int8_tmp;
--Testcase 69:
select q1, q2 from int8_tmp;
--Testcase 70:
explain (verbose, costs off)
select q1, q2 from int8_tmp order by q2 desc;
--Testcase 71:
select q1, q2 from int8_tmp order by q2 desc;
-- test for failure to set all aggregates' aggtranstype
--Testcase 25:
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;
--Testcase 26:
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
--
--Testcase 72:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW WITH TIES;
--Testcase 73:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST ROWS WITH TIES;
--Testcase 74:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES;
--Testcase 75:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW ONLY;
-- should fail
--Testcase 76:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
FETCH FIRST 2 ROW WITH TIES;
-- test ruleutils
--Testcase 77:
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;
--Testcase 78:
\d+ limit_thousand_v_1
--Testcase 79:
CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY;
--Testcase 80:
\d+ limit_thousand_v_2
--Testcase 81:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS WITH TIES; -- fails
--Testcase 82:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES;
--Testcase 83:
\d+ limit_thousand_v_3
--Testcase 84:
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
--Testcase 85:
\d+ limit_thousand_v_4
-- leave these views
--Testcase 109:
DELETE FROM int8_tbl;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 86:
DROP SERVER sqlite_svr;
--Testcase 87:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/prepare.sql
================================================
-- Regression tests for prepareable statements. We query the content
-- of the pg_prepared_statements view as prepared statements are
-- created and removed.
--Testcase 26:
CREATE EXTENSION sqlite_fdw;
--Testcase 27:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 28:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 29:
CREATE FOREIGN TABLE road (
name text,
thepath path
) SERVER sqlite_svr;
--Testcase 30:
create foreign table road_tmp (a int, b int, id int options (key 'true')) server sqlite_svr;
--Testcase 31:
insert into road_tmp values (1, 2);
--Testcase 1:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
--Testcase 2:
PREPARE q1 AS SELECT a FROM road_tmp;
--Testcase 3:
EXECUTE q1;
--Testcase 4:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- should fail
--Testcase 5:
PREPARE q1 AS SELECT b FROM road_tmp;
-- should succeed
DEALLOCATE q1;
--Testcase 6:
PREPARE q1 AS SELECT b FROM road_tmp;
--Testcase 7:
EXECUTE q1;
--Testcase 8:
PREPARE q2 AS SELECT b FROM road_tmp;
--Testcase 9:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- sql92 syntax
DEALLOCATE PREPARE q1;
--Testcase 10:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
DEALLOCATE PREPARE q2;
-- the view should return the empty set again
--Testcase 11:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- parameterized queries
--Testcase 12:
PREPARE q2(text) AS
SELECT datname, datistemplate, datallowconn
FROM pg_database WHERE datname = $1;
--Testcase 13:
EXECUTE q2('postgres');
--Testcase 14:
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;
--Testcase 15:
EXECUTE q3('AAAAxx', 5::smallint, 10.5::float, false, 4::bigint);
-- too few params
--Testcase 16:
EXECUTE q3('bool');
-- too many params
--Testcase 17:
EXECUTE q3('bytea', 5::smallint, 10.5::float, false, 4::bigint, true);
-- wrong param types
--Testcase 18:
EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'bytea');
-- invalid type
--Testcase 19:
PREPARE q4(nonexistenttype) AS SELECT * FROM road WHERE name = $1;
-- create table as execute
--Testcase 20:
PREPARE q5(int, text) AS
SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
ORDER BY unique1;
--Testcase 32:
CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA');
--Testcase 21:
SELECT * FROM q5_prep_results;
--Testcase 33:
CREATE TEMPORARY TABLE q5_prep_nodata AS EXECUTE q5(200, 'DTAAAA')
WITH NO DATA;
--Testcase 34:
SELECT * FROM q5_prep_nodata;
-- unknown or unspecified parameter types: should succeed
--Testcase 22:
PREPARE q6 AS
SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
--Testcase 23:
PREPARE q7(unknown) AS
SELECT * FROM road WHERE thepath = $1;
--Testcase 24:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
-- test DEALLOCATE ALL;
DEALLOCATE ALL;
--Testcase 25:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
--Testcase 35:
DROP FOREIGN TABLE tenk1;
--Testcase 36:
DROP FOREIGN TABLE road;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/select.sql
================================================
--
-- SELECT
--
--Testcase 43:
CREATE EXTENSION sqlite_fdw;
--Testcase 44:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 45:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 46:
CREATE FOREIGN TABLE onek2 (
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
) SERVER sqlite_svr;
--Testcase 47:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 73:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 74:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 75:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 76:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 77:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 48:
CREATE FOREIGN TABLE person (
name text,
age int4,
location point
) SERVER sqlite_svr;
-- btree index
-- awk '{if($1<10){print;}else{next;}}' onek.data | sort +0n -1
--
--Testcase 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
--
--Testcase 2:
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
--
--Testcase 3:
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
--
--Testcase 4:
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
--
--Testcase 5:
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
--
--Testcase 6:
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
--
--Testcase 7:
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
--
--Testcase 8:
SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10 order by onek2.unique1;
--
-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1
--
--Testcase 9:
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
--
--Testcase 10:
SELECT onek2.unique1, onek2.stringu1 FROM onek2
WHERE onek2.unique1 > 980 ORDER BY onek2.unique1;
RESET enable_seqscan;
RESET enable_bitmapscan;
RESET enable_sort;
--Testcase 11:
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
--Testcase 12:
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
--
--Testcase 13:
SELECT p.name, p.age FROM person* p ORDER BY age using >, name;
--
-- Test some cases involving whole-row Var referencing a subquery
--
--Testcase 49:
select foo from (select 1 offset 0) as foo;
--Testcase 50:
select foo from (select null offset 0) as foo;
--Testcase 51:
select foo from (select 'xyzzy',1,null offset 0) as foo;
--
-- Test VALUES lists
--
--Testcase 14:
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 :-)
--Testcase 15:
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
--Testcase 16:
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
--Testcase 17:
VALUES (1,2), (3,4+4), (7,77.7);
--Testcase 52:
VALUES (1,2), (3,4+4), (7,77.7)
UNION ALL
SELECT 2+2, 57
UNION ALL
TABLE int8_tbl;
--
-- Test ORDER BY options
--
--Testcase 53:
CREATE FOREIGN TABLE foo (f1 int options (key 'true')) SERVER sqlite_svr;
--Testcase 18:
INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1);
--Testcase 19:
SELECT * FROM foo ORDER BY f1;
--Testcase 20:
SELECT * FROM foo ORDER BY f1 ASC; -- same thing
--Testcase 21:
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
--Testcase 22:
SELECT * FROM foo ORDER BY f1 DESC;
--Testcase 23:
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
-- Skip, cannot create index on foreign table
-- 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
--Testcase 24:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 25:
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- actually run the query with an analyze to use the partial index
--Testcase 54:
explain (costs off, analyze on, timing off, summary off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 27:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 28:
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- partial index predicate implies clause, so no need for retest
--Testcase 29:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 30:
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 31:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 32:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
-- but if it's an update target, must retest anyway
--Testcase 33:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
--Testcase 34:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
-- partial index is not applicable
--Testcase 35:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'C';
--Testcase 36:
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;
--Testcase 37:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 38:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
RESET enable_indexscan;
-- check multi-index cases too
--Testcase 39:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 40:
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 41:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 and stringu1 < 'B') or unique1 = 0;
--Testcase 42:
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
--Testcase 55:
SELECT 1 AS x ORDER BY x;
-- But ORDER BY on a set-valued expression does
--Testcase 56:
create function sillysrf(int) returns setof int as
'values (1),(10),(2),($1)' language sql immutable;
--Testcase 57:
select sillysrf(42);
--Testcase 58:
select sillysrf(-1) order by 1;
--Testcase 59:
drop function sillysrf(int);
-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict
-- (see bug #5084)
--Testcase 60:
select * from (values (2),(null),(1)) v(k) where k = k order by k;
--Testcase 61:
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.
--Testcase 62:
create table list_parted_tbl (a int,b int) partition by list (a);
--Testcase 63:
create table list_parted_tbl1 partition of list_parted_tbl
for values in (1) partition by list(b);
--Testcase 64:
explain (costs off) select * from list_parted_tbl;
--Testcase 65:
drop table list_parted_tbl;
--Testcase 78:
DELETE FROM INT8_TBL;
--Testcase 66:
DROP FOREIGN TABLE onek;
--Testcase 67:
DROP FOREIGN TABLE onek2;
--Testcase 68:
DROP FOREIGN TABLE int8_tbl;
--Testcase 69:
DROP FOREIGN TABLE person;
--Testcase 70:
DROP FOREIGN TABLE foo;
--Testcase 71:
DROP SERVER sqlite_svr;
--Testcase 72:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/select_having.sql
================================================
--
-- SELECT_HAVING
--
--Testcase 22:
CREATE EXTENSION sqlite_fdw;
--Testcase 23:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 24:
CREATE FOREIGN TABLE test_having(a int OPTIONS (key 'true'), b int, c char(8), d char) SERVER sqlite_svr;
-- load test data
--Testcase 1:
INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A');
--Testcase 2:
INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b');
--Testcase 3:
INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c');
--Testcase 4:
INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D');
--Testcase 5:
INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e');
--Testcase 6:
INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F');
--Testcase 7:
INSERT INTO test_having VALUES (6, 4, 'cccc', 'g');
--Testcase 8:
INSERT INTO test_having VALUES (7, 4, 'cccc', 'h');
--Testcase 9:
INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I');
--Testcase 10:
INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j');
--Testcase 11:
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
--Testcase 12:
SELECT b, c FROM test_having
GROUP BY b, c HAVING b = 3 ORDER BY b, c collate "en_US.utf8";
--Testcase 13:
SELECT lower(c), count(c) FROM test_having
GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY lower(c);
--Testcase 14:
SELECT c, max(a) FROM test_having
GROUP BY c HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY c collate "en_US.utf8";
-- test degenerate cases involving HAVING without GROUP BY
-- Per SQL spec, these should generate 0 or 1 row, even without aggregates
--Testcase 15:
SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a);
--Testcase 16:
SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a);
-- errors: ungrouped column references
--Testcase 17:
SELECT a FROM test_having HAVING min(a) < max(a);
--Testcase 18:
SELECT 1 AS one FROM test_having HAVING a > 1;
-- the really degenerate case: need not scan table at all
--Testcase 19:
SELECT 1 AS one FROM test_having HAVING 1 > 2;
--Testcase 20:
SELECT 1 AS one FROM test_having HAVING 1 < 2;
-- and just to prove that we aren't scanning the table:
--Testcase 21:
SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2;
--Testcase 25:
DROP FOREIGN TABLE test_having;
--Testcase 26:
DROP SERVER sqlite_svr;
--Testcase 27:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/sqlite_fdw_post.sql
================================================
-- ===================================================================
-- create FDW objects
-- ===================================================================
--Testcase 483:
CREATE EXTENSION sqlite_fdw;
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr2 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr3 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- SQLite FDW does not need User and User Mapping.
--Testcase 484:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 485:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 756:
-- CREATE USER MAPPING FOR public SERVER sqlite_svr3;
-- ===================================================================
-- create objects used through FDW sqlite server
-- ===================================================================
--Testcase 486:
CREATE SCHEMA "S 1";
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO "S 1";
--Testcase 1:
INSERT INTO "S 1"."T 1"
SELECT id,
id % 10,
to_char(id, 'FM00000'),
'1970-01-01'::timestamptz + ((id % 100) || ' days')::interval,
'1970-01-01'::timestamp + ((id % 100) || ' days')::interval,
id % 10,
id % 10,
'foo'
FROM generate_series(1, 1000) id;
--Testcase 2:
INSERT INTO "S 1"."T 2"
SELECT id,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 3:
INSERT INTO "S 1"."T 3"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 487:
DELETE FROM "S 1"."T 3" WHERE c1 % 2 != 0; -- delete for outer join tests
--Testcase 4:
INSERT INTO "S 1"."T 4"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 488:
DELETE FROM "S 1"."T 4" WHERE c1 % 3 != 0; -- delete for outer join tests
/*ANALYZE "S 1"."T 1";
ANALYZE "S 1"."T 2";
ANALYZE "S 1"."T 3";
ANALYZE "S 1"."T 4";*/
-- ===================================================================
-- create foreign tables
-- ===================================================================
--Testcase 489:
CREATE FOREIGN TABLE ft1 (
c0 int,
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr;
--Testcase 757:
ALTER FOREIGN TABLE ft1 DROP COLUMN c0;
--Testcase 490:
CREATE FOREIGN TABLE ft2 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
cx int,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft2',
c8 text
) SERVER sqlite_svr;
--Testcase 758:
ALTER FOREIGN TABLE ft2 DROP COLUMN cx;
--Testcase 491:
CREATE FOREIGN TABLE ft4 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 3');
--Testcase 492:
CREATE FOREIGN TABLE ft5 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 4');
--Testcase 493:
CREATE FOREIGN TABLE ft6 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr2 OPTIONS (table 'T 4');
--Testcase 759:
CREATE FOREIGN TABLE ft7 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr3 OPTIONS (table 'T 4');
--Testcase 760:
ALTER FOREIGN TABLE ft1 OPTIONS (table 'T 1');
--Testcase 761:
ALTER FOREIGN TABLE ft2 OPTIONS (table 'T 1');
--Testcase 762:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 763:
ALTER FOREIGN TABLE ft2 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 5:
\det+
-- Test that alteration of server options causes reconnection
-- Remote's errors might be non-English, so hide them to ensure stable results
\set VERBOSITY terse
--Testcase 6:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work
--Testcase 764:
ALTER SERVER sqlite_svr OPTIONS (SET database 'no such database');
--Testcase 7:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should fail
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_svr
OPTIONS (SET database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
--Testcase 8:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work again
\set VERBOSITY default
-- Now we should be able to run ANALYZE.
-- To exercise multiple code paths, we use local stats on ft1
-- and remote-estimate mode on ft2.
--ANALYZE ft1;
--ALTER FOREIGN TABLE ft2 OPTIONS (use_remote_estimate 'true');
-- ===================================================================
-- simple queries
-- ===================================================================
-- single table without alias
--Testcase 9:
EXPLAIN (COSTS OFF) SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
--Testcase 10:
SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
-- single table with alias - also test that tableoid sort is not pushed to remote side
--Testcase 11:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
--Testcase 12:
SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
-- whole-row reference
--Testcase 13:
EXPLAIN (VERBOSE, COSTS OFF) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 14:
SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- empty result
--Testcase 15:
SELECT * FROM ft1 WHERE false;
-- with WHERE clause
--Testcase 16:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
--Testcase 17:
SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
-- with FOR UPDATE/SHARE
--Testcase 18:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 19:
SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 20:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
--Testcase 21:
SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
-- aggregate
--Testcase 22:
SELECT COUNT(*) FROM ft1 t1;
-- subquery
--Testcase 23:
SELECT * FROM ft1 t1 WHERE t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 <= 10) ORDER BY c1;
-- subquery+MAX
--Testcase 24:
SELECT * FROM ft1 t1 WHERE t1.c3 = (SELECT MAX(c3) FROM ft2 t2) ORDER BY c1;
-- used in CTE
--Testcase 25:
WITH t1 AS (SELECT * FROM ft1 WHERE c1 <= 10) SELECT t2.c1, t2.c2, t2.c3, t2.c4 FROM t1, ft2 t2 WHERE t1.c1 = t2.c1 ORDER BY t1.c1;
-- fixed values
--Testcase 26:
SELECT 'fixed', NULL FROM ft1 t1 WHERE c1 = 1;
-- Test forcing the remote server to produce sorted data for a merge join.
--Testcase 765:
SET enable_hashjoin TO false;
--Testcase 766:
SET enable_nestloop TO false;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 27:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 28:
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 29:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 30:
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- A join between local table and foreign join. ORDER BY clause is added to the
-- foreign join so that the local table can be joined using merge join strategy.
--Testcase 31:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 32:
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above, except that the full join prevents any equivalence
-- classes from being merged. This produces single relation equivalence classes
-- included in join restrictions.
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 34:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above with all full outer joins
--Testcase 35:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 36:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 767:
RESET enable_hashjoin;
--Testcase 768:
RESET enable_nestloop;
-- Test executing assertion in estimate_path_cost_size() that makes sure that
-- retrieved_rows for foreign rel re-used to cost pre-sorted foreign paths is
-- a sensible value even when the rel has tuples=0
-- CREATE TABLE loct_empty (c1 int NOT NULL, c2 text);
--Testcase 769:
CREATE FOREIGN TABLE ft_empty (c1 int NOT NULL, c2 text)
SERVER sqlite_svr OPTIONS (table 'loct_empty');
--Testcase 770:
INSERT INTO "S 1".loct_empty
SELECT id, 'AAA' || to_char(id, 'FM000') FROM generate_series(1, 100) id;
--Testcase 771:
DELETE FROM "S 1".loct_empty;
-- ANALYZE ft_empty;
--Testcase 772:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1;
-- ===================================================================
-- WHERE with remotely-executable conditions
-- ===================================================================
--Testcase 37:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 1; -- Var, OpExpr(b), Const
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = 0; -- BoolExpr
--Testcase 39:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NULL; -- NullTest
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NOT NULL; -- NullTest
--Testcase 41:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = -c1; -- OpExpr(l)
--Testcase 44:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE (c1 IS NOT NULL) IS DISTINCT FROM (c1 IS NOT NULL); -- DistinctExpr
--Testcase 45:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = ANY(ARRAY[c2, 1, c1 + 0]); -- ScalarArrayOpExpr
--Testcase 46:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = (ARRAY[c1,c2,3])[1]; -- SubscriptingRef
--Testcase 47:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c6 = E'foo''s\\bar'; -- check special chars
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c8 = 'foo'; -- can't be sent to remote
-- parameterized remote path for foreign table
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2;
--Testcase 50:
SELECT * FROM ft2 a, ft2 b WHERE a.c1 = 47 AND b.c1 = a.c2;
-- check both safe and unsafe join conditions
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
--Testcase 52:
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
-- bug before 9.3.5 due to sloppy handling of remote-estimate parameters
--Testcase 53:
SELECT * FROM ft1 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft2 WHERE c1 < 5));
--Testcase 54:
SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5));
-- we should not push order by clause with volatile expressions or unsafe
-- collations
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, random();
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C";
-- user-defined operator/function
--Testcase 494:
CREATE FUNCTION sqlite_fdw_abs(int) RETURNS int AS $$
BEGIN
RETURN abs($1);
END
$$ LANGUAGE plpgsql IMMUTABLE;
--Testcase 495:
CREATE OPERATOR === (
LEFTARG = int,
RIGHTARG = int,
PROCEDURE = int4eq,
COMMUTATOR = ===
);
-- built-in operators and functions can be shipped for remote execution
--Testcase 57:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 58:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 59:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 60:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
-- by default, user-defined ones cannot
--Testcase 61:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 62:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 63:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 64:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- ORDER BY can be shipped, though
--Testcase 496:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 497:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- but let's put them in an extension ...
--Testcase 773:
ALTER EXTENSION sqlite_fdw ADD FUNCTION sqlite_fdw_abs(int);
--Testcase 774:
ALTER EXTENSION sqlite_fdw ADD OPERATOR === (int, int);
--ALTER SERVER sqlite_svr2 OPTIONS (ADD extensions 'sqlite_fdw');
-- ... now they can be shipped
--Testcase 498:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 499:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 500:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 501:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- and both ORDER BY and LIMIT can be shipped
--Testcase 502:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 503:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- ===================================================================
-- JOIN queries
-- ===================================================================
-- Analyze ft4 and ft5 so that we have better statistics. These tables do not
-- have use_remote_estimate set.
--ANALYZE ft4;
--ANALYZE ft5;
-- join two tables
--Testcase 65:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 66:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join three tables
--Testcase 67:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 68:
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
-- left outer join
--Testcase 69:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 70:
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- left outer join three tables
--Testcase 71:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 72:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- left outer join + placement of clauses.
-- clauses within the nullable side are not pulled up, but top level clause on
-- non-nullable side is pushed into non-nullable side
--Testcase 73:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
--Testcase 74:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
-- clauses within the nullable side are not pulled up, but the top level clause
-- on nullable side is not pushed down into nullable side
--Testcase 75:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
--Testcase 76:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
-- right outer join
--Testcase 77:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 78:
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
-- right outer join three tables
--Testcase 79:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 80:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- full outer join
--Testcase 81:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
--Testcase 82:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
-- full outer join with restrictions on the joining relations
-- a. the joining relations are both base relations
--Testcase 83:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 84:
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 85:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
--Testcase 86:
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
-- b. one of the joining relations is a base relation and the other is a join
-- relation
--Testcase 87:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 88:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- c. test deparsing the remote query as nested subqueries
--Testcase 89:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 90:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- d. test deparsing rowmarked relations as subqueries
--Testcase 91:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
--Testcase 92:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
-- full outer join + inner join
--Testcase 93:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
--Testcase 94:
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
-- full outer join three tables
--Testcase 95:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 96:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + right outer join
--Testcase 97:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 98:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- right outer join + full outer join
--Testcase 99:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 100:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + left outer join
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 102:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- left outer join + full outer join
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 104:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
--Testcase 775:
SET enable_memoize TO off;
-- right outer join + left outer join
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 106:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 776:
RESET enable_memoize;
-- left outer join + right outer join
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 108:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause, only matched rows
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 110:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause with shippable extensions set
--Testcase 504:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--ALTER SERVER sqlite_svr2 OPTIONS (DROP extensions);
-- full outer join + WHERE clause with shippable extensions not set
--Testcase 505:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--Testcase 777:
ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- join two tables with FOR UPDATE clause
-- tests whole-row reference for row marks
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 112:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
--Testcase 114:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
-- join two tables with FOR SHARE clause
--Testcase 115:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 116:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
--Testcase 118:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
-- join in CTE
--Testcase 119:
EXPLAIN (VERBOSE, COSTS OFF)
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
--Testcase 120:
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
-- ctid with whole-row reference
--Testcase 121:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- SEMI JOIN, not pushed down
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 123:
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- ANTI JOIN, not pushed down
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 125:
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- CROSS JOIN can be pushed down
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 127:
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- different server, not pushed down. No result expected.
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 129:
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe join conditions (c8 has a UDT), not pushed down. Practically a CROSS
-- JOIN since c8 in both tables has same value.
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 131:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe conditions on one side (c8 has a UDT), not pushed down.
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 133:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join where unsafe to pushdown condition in WHERE clause has a column not
-- in the SELECT clause. In this test unsafe clause needs to have column
-- references from both joining sides so that the clause is not pushed down
-- into one of the joining sides.
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 135:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- Aggregate after UNION, for testing setrefs
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
--Testcase 137:
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
-- join with lateral reference
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
--Testcase 139:
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
-- non-Var items in targetlist of the nullable rel of a join preventing
-- push-down in some cases
-- unable to push {ft1, ft2}
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
--Testcase 141:
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
-- ok to push {ft1, ft2} but not {ft1, ft2, ft4}
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
--Testcase 143:
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
-- join with nullable side with some columns with null values
--Testcase 144:
UPDATE ft5 SET c3 = null where c1 % 9 = 0;
--Testcase 145:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
--Testcase 146:
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
-- multi-way join involving multiple merge joins
-- (this case used to have EPQ-related planning problems)
--Testcase 506:
CREATE TABLE local_tbl (c1 int NOT NULL, c2 int NOT NULL, c3 text, CONSTRAINT local_tbl_pkey PRIMARY KEY (c1));
--Testcase 507:
INSERT INTO local_tbl SELECT id, id % 10, to_char(id, 'FM0000') FROM generate_series(1, 1000) id;
ANALYZE local_tbl;
--Testcase 778:
SET enable_nestloop TO false;
--Testcase 779:
SET enable_hashjoin TO false;
--Testcase 147:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 FOR UPDATE;
--Testcase 148:
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 ORDER BY ft1.c1 FOR UPDATE;
--Testcase 780:
RESET enable_nestloop;
--Testcase 781:
RESET enable_hashjoin;
--DROP TABLE local_tbl;
-- check join pushdown in situations where multiple userids are involved
-- Although SQLite FDW does not need User and User mapping to connect to
-- the database file, however, JOIN pushdown is decided by the core code.
-- If outer and inner relation are foreign tables (or joins) belonging to
-- the same server and assigned to the same user, join will be pushed down.
-- Otherwise, join cannot be pushed down.
-- In addition to an exact match of userid, we allow the case where one side
-- has zero userid (implying current user) and the other side has explicit
-- userid that happens to equal the current user; but in that case, pushdown of
-- the join is only valid for the current user.
--Testcase 508:
CREATE ROLE regress_view_owner SUPERUSER;
--Testcase 509:
-- CREATE USER MAPPING FOR regress_view_owner SERVER sqlite_svr;
GRANT SELECT ON ft4 TO regress_view_owner;
GRANT SELECT ON ft5 TO regress_view_owner;
--Testcase 510:
CREATE VIEW v4 AS SELECT * FROM ft4;
--Testcase 511:
CREATE VIEW v5 AS SELECT * FROM ft5;
--Testcase 782:
ALTER VIEW v5 OWNER TO regress_view_owner;
--Testcase 149:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, different view owners
--Testcase 150:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 783:
ALTER VIEW v4 OWNER TO regress_view_owner;
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 152:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, view owner not current user
--Testcase 154:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 784:
ALTER VIEW v4 OWNER TO CURRENT_USER;
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 156:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 785:
ALTER VIEW v4 OWNER TO regress_view_owner;
-- cleanup
--Testcase 512:
DROP OWNED BY regress_view_owner;
--Testcase 513:
DROP ROLE regress_view_owner;
-- ===================================================================
-- Aggregate and grouping queries
-- ===================================================================
-- Simple aggregates
--Testcase 157:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 158:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 514:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
--Testcase 515:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
-- Aggregate is not pushed down as aggregation contains random()
--Testcase 159:
explain (verbose, costs off)
select sum(c1 * (random() <= 1)::int) as sum, avg(c1) from ft1;
-- Aggregate over join query
--Testcase 160:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
--Testcase 161:
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
-- Not pushed down due to local conditions present in underneath input rel
--Testcase 162:
explain (verbose, costs off)
select sum(t1.c1), count(t2.c1) from ft1 t1 inner join ft2 t2 on (t1.c1 = t2.c1) where ((t1.c1 * t2.c1)/(t1.c1 * t2.c1)) * random() <= 1;
-- GROUP BY clause having expressions
--Testcase 163:
explain (verbose, costs off)
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
--Testcase 164:
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
-- Aggregates in subquery are pushed down.
--Testcase 165:
explain (verbose, costs off)
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
--Testcase 166:
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
-- Aggregate is still pushed down by taking unshippable expression out
--Testcase 167:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
--Testcase 168:
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
-- Aggregate with unshippable GROUP BY clause are not pushed
--Testcase 169:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as c2 from ft2 group by c2 * (random() <= 1)::int order by 1;
-- GROUP BY clause in various forms, cardinal, alias and constant expression
--Testcase 516:
explain (verbose, costs off)
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
--Testcase 517:
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
-- GROUP BY clause referring to same column multiple times
-- Also, ORDER BY contains an aggregate function
--Testcase 170:
explain (verbose, costs off)
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
--Testcase 171:
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
-- Testing HAVING clause shippability
--Testcase 172:
explain (verbose, costs off)
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
--Testcase 173:
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
-- Unshippable HAVING clause will be evaluated locally, and other qual in HAVING clause is pushed down
--Testcase 174:
explain (verbose, costs off)
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
--Testcase 175:
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
-- Aggregate in HAVING clause is not pushable, and thus aggregation is not pushed down
--Testcase 176:
explain (verbose, costs off)
select sum(c1) from ft1 group by c2 having avg(c1 * (random() <= 1)::int) > 100 order by 1;
-- Remote aggregate in combination with a local Param (for the output
-- of an initplan) can be trouble, per bug #15781
--Testcase 518:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 519:
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 520:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
--Testcase 521:
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
-- Testing ORDER BY, DISTINCT, FILTER, Ordered-sets and VARIADIC within aggregates
-- ORDER BY within aggregate, same column used to order
--Testcase 177:
explain (verbose, costs off)
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
--Testcase 178:
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
-- ORDER BY within aggregate, different column used to order also using DESC
--Testcase 179:
explain (verbose, costs off)
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
--Testcase 180:
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
-- DISTINCT within aggregate
--Testcase 181:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 182:
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- DISTINCT combined with ORDER BY within aggregate
--Testcase 183:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 184:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 185:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 186:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- FILTER within aggregate
--Testcase 187:
explain (verbose, costs off)
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
--Testcase 188:
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
-- DISTINCT, ORDER BY and FILTER within aggregate
--Testcase 189:
explain (verbose, costs off)
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
--Testcase 190:
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
-- Outer query is aggregation query
--Testcase 191:
explain (verbose, costs off)
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 192:
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Inner query is aggregation query
--Testcase 193:
explain (verbose, costs off)
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 194:
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Aggregate not pushed down as FILTER condition is not pushable
--Testcase 195:
explain (verbose, costs off)
select sum(c1) filter (where (c1 / c1) * random() <= 1) from ft1 group by c2 order by 1;
--Testcase 196:
explain (verbose, costs off)
select sum(c2) filter (where c2 in (select c2 from ft1 where c2 < 5)) from ft1;
-- Ordered-sets within aggregate
--Testcase 197:
explain (verbose, costs off)
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
--Testcase 198:
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
-- Using multiple arguments within aggregates
--Testcase 199:
explain (verbose, costs off)
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
--Testcase 200:
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
-- User defined function for user defined aggregate, VARIADIC
--Testcase 522:
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)';
--Testcase 523:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
-- Disable hash aggregation for plan stability.
--Testcase 786:
set enable_hashagg to false;
-- Not pushed down due to user defined aggregate
--Testcase 524:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Add function and aggregate into extension
--alter extension postgres_fdw add function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw add aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now aggregate will be pushed. Aggregate will display VARIADIC argument.
--Testcase 525:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
--Testcase 526:
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
-- Remove function and aggregate from extension
--alter extension postgres_fdw drop function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw drop aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Not pushed down as we have dropped objects from extension.
--Testcase 527:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Cleanup
--Testcase 787:
reset enable_hashagg;
--Testcase 528:
drop aggregate least_agg(variadic items anyarray);
--Testcase 529:
drop function least_accum(anyelement, variadic anyarray);
-- Testing USING OPERATOR() in ORDER BY within aggregate.
-- For this, we need user defined operators along with operator family and
-- operator class. Create those and then add them in extension. Note that
-- user defined objects are considered unshippable unless they are part of
-- the extension.
--Testcase 530:
create operator public.<^ (
leftarg = int4,
rightarg = int4,
procedure = int4eq
);
--Testcase 531:
create operator public.=^ (
leftarg = int4,
rightarg = int4,
procedure = int4lt
);
--Testcase 532:
create operator public.>^ (
leftarg = int4,
rightarg = int4,
procedure = int4gt
);
--Testcase 533:
create operator family my_op_family using btree;
--Testcase 534:
create function my_op_cmp(a int, b int) returns int as
$$begin return btint4cmp(a, b); end $$ language plpgsql;
--Testcase 535:
create operator class my_op_class for type int using btree family my_op_family as
operator 1 public.<^,
operator 3 public.=^,
operator 5 public.>^,
function 1 my_op_cmp(int, int);
-- This will not be pushed as user defined sort operator is not part of the
-- extension yet.
--Testcase 536:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Update local stats on ft2
--ANALYZE ft2;
-- Add into extension
--Testcase 788:
alter extension sqlite_fdw add operator class my_op_class using btree;
--Testcase 789:
alter extension sqlite_fdw add function my_op_cmp(a int, b int);
--Testcase 790:
alter extension sqlite_fdw add operator family my_op_family using btree;
--Testcase 791:
alter extension sqlite_fdw add operator public.<^(int, int);
--Testcase 792:
alter extension sqlite_fdw add operator public.=^(int, int);
--Testcase 793:
alter extension sqlite_fdw add operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now this will be pushed as sort operator is part of the extension.
--Testcase 537:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
--Testcase 538:
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Remove from extension
--Testcase 794:
alter extension sqlite_fdw drop operator class my_op_class using btree;
--Testcase 795:
alter extension sqlite_fdw drop function my_op_cmp(a int, b int);
--Testcase 796:
alter extension sqlite_fdw drop operator family my_op_family using btree;
--Testcase 797:
alter extension sqlite_fdw drop operator public.<^(int, int);
--Testcase 798:
alter extension sqlite_fdw drop operator public.=^(int, int);
--Testcase 799:
alter extension sqlite_fdw drop operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- This will not be pushed as sort operator is now removed from the extension.
--Testcase 539:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Cleanup
--Testcase 540:
drop operator class my_op_class using btree;
--Testcase 541:
drop function my_op_cmp(a int, b int);
--Testcase 542:
drop operator family my_op_family using btree;
--Testcase 543:
drop operator public.>^(int, int);
--Testcase 544:
drop operator public.=^(int, int);
--Testcase 545:
drop operator public.<^(int, int);
-- Input relation to aggregate push down hook is not safe to pushdown and thus
-- the aggregate cannot be pushed down to foreign server.
--Testcase 201:
explain (verbose, costs off)
select count(t1.c3) from ft2 t1 left join ft2 t2 on (t1.c1 = random() * t2.c2);
-- Subquery in FROM clause having aggregate
--Testcase 202:
explain (verbose, costs off)
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
--Testcase 203:
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
-- FULL join with IS NULL check in HAVING
--Testcase 204:
explain (verbose, costs off)
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
--Testcase 205:
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
-- Aggregate over FULL join needing to deparse the joining relations as
-- subqueries.
--Testcase 206:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
--Testcase 207:
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
-- ORDER BY expression is part of the target list but not pushed down to
-- foreign server.
--Testcase 208:
explain (verbose, costs off)
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
--Testcase 209:
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
-- LATERAL join, with parameterization
--Testcase 800:
set enable_hashagg to false;
--Testcase 210:
explain (verbose, costs off)
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 211:
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 801:
reset enable_hashagg;
-- bug #15613: bad plan for foreign table scan with lateral reference
--Testcase 546:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
--Testcase 547:
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
-- Check with placeHolderVars
--Testcase 212:
explain (verbose, costs off)
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
--Testcase 213:
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
-- Not supported cases
-- Grouping sets
--Testcase 214:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 215:
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 216:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 217:
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 218:
explain (verbose, costs off)
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 219:
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 220:
explain (verbose, costs off)
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
--Testcase 221:
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
-- DISTINCT itself is not pushed down, whereas underneath aggregate is pushed
--Testcase 222:
explain (verbose, costs off)
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
--Testcase 223:
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
-- WindowAgg
--Testcase 224:
explain (verbose, costs off)
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 225:
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 226:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 227:
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 228:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 229:
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
-- ===================================================================
-- parameterized queries
-- ===================================================================
-- simple join
--Testcase 230:
PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $1 AND t2.c1 = $2;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2);
--Testcase 232:
EXECUTE st1(1, 1);
--Testcase 233:
EXECUTE st1(101, 101);
-- subquery using stable function (can't be sent to remote)
--Testcase 234:
PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1;
--Testcase 235:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st2(10, 20);
--Testcase 236:
EXECUTE st2(10, 20);
--Testcase 237:
EXECUTE st2(101, 121);
-- subquery using immutable function (can be sent to remote)
--Testcase 238:
PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1;
--Testcase 239:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st3(10, 20);
--Testcase 240:
EXECUTE st3(10, 20);
--Testcase 241:
EXECUTE st3(20, 30);
-- custom plan should be chosen initially
--Testcase 242:
PREPARE st4(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 = $1;
--Testcase 243:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 244:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 245:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 246:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 247:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- once we try it enough times, should switch to generic plan
--Testcase 248:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- value of $1 should not be sent to remote
--Testcase 249:
PREPARE st5(text,int) AS SELECT * FROM ft1 t1 WHERE c8 = $1 and c1 = $2;
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 254:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 255:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 256:
EXECUTE st5('foo', 1);
-- altering FDW options requires replanning
--Testcase 257:
PREPARE st6 AS SELECT * FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 258:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 259:
PREPARE st7 AS INSERT INTO ft1 (c1,c2,c3) VALUES (1001,101,'foo');
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 548:
INSERT INTO "S 1"."T 0" SELECT * FROM "S 1"."T 1";
--Testcase 802:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 0');
--Testcase 261:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 262:
EXECUTE st6;
--Testcase 263:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 803:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 1');
--Testcase 549:
PREPARE st8 AS SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 550:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 551:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--Testcase 552:
EXECUTE st8;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- cleanup
DEALLOCATE st1;
DEALLOCATE st2;
DEALLOCATE st3;
DEALLOCATE st4;
DEALLOCATE st5;
DEALLOCATE st6;
DEALLOCATE st7;
DEALLOCATE st8;
-- System columns, except ctid and oid, should not be sent to remote
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'pg_class'::regclass LIMIT 1;
--Testcase 265:
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'ft1'::regclass LIMIT 1;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 267:
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 553:
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 554:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ctid, * FROM ft1 t1 LIMIT 1;
--Testcase 271:
SELECT ctid, * FROM ft1 t1 LIMIT 1;
-- ===================================================================
-- used in PL/pgSQL function
-- ===================================================================
--Testcase 555:
CREATE OR REPLACE FUNCTION f_test(p_c1 int) RETURNS int AS $$
DECLARE
v_c1 int;
BEGIN
--Testcase 556:
SELECT c1 INTO v_c1 FROM ft1 WHERE c1 = p_c1 LIMIT 1;
PERFORM c1 FROM ft1 WHERE c1 = p_c1 AND p_c1 = v_c1 LIMIT 1;
RETURN v_c1;
END;
$$ LANGUAGE plpgsql;
--Testcase 272:
SELECT f_test(100);
--Testcase 557:
DROP FUNCTION f_test(int);
-- ===================================================================
-- REINDEX
-- ===================================================================
-- remote table is not created here
--Testcase 804:
CREATE FOREIGN TABLE reindex_foreign (c1 int, c2 int)
SERVER sqlite_svr2 OPTIONS (table 'reindex_local');
REINDEX TABLE reindex_foreign; -- error
REINDEX TABLE CONCURRENTLY reindex_foreign; -- error
--Testcase 805:
DROP FOREIGN TABLE reindex_foreign;
-- partitions and foreign tables
--Testcase 806:
CREATE TABLE reind_fdw_parent (c1 int) PARTITION BY RANGE (c1);
--Testcase 807:
CREATE TABLE reind_fdw_0_10 PARTITION OF reind_fdw_parent
FOR VALUES FROM (0) TO (10);
--Testcase 808:
CREATE FOREIGN TABLE reind_fdw_10_20 PARTITION OF reind_fdw_parent
FOR VALUES FROM (10) TO (20)
SERVER sqlite_svr OPTIONS (table 'reind_local_10_20');
REINDEX TABLE reind_fdw_parent; -- ok
REINDEX TABLE CONCURRENTLY reind_fdw_parent; -- ok
--Testcase 809:
DROP TABLE reind_fdw_parent;
-- ===================================================================
-- conversion error
-- ===================================================================
--Testcase 810:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE int;
--Testcase 273:
SELECT * FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8) WHERE x1 = 1;
--Testcase 274:
SELECT ftx.x1, ft2.c2, ftx.x8 FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 275:
SELECT ftx.x1, ft2.c2, ftx FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 276:
SELECT sum(c2), array_agg(c8) FROM ft1 GROUP BY c8;
--Testcase 811:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE text;
-- ===================================================================
-- subtransaction
-- + local/remote error doesn't break cursor
-- ===================================================================
BEGIN;
DECLARE c CURSOR FOR SELECT * FROM ft1 ORDER BY c1;
--Testcase 277:
FETCH c;
SAVEPOINT s;
ERROR OUT; -- ERROR
ROLLBACK TO s;
--Testcase 278:
FETCH c;
SAVEPOINT s;
--Testcase 279:
SELECT * FROM ft1 WHERE 1 / (c1 - 1) > 0; -- ERROR
ROLLBACK TO s;
--Testcase 280:
FETCH c;
--Testcase 281:
SELECT * FROM ft1 ORDER BY c1 LIMIT 1;
COMMIT;
-- ===================================================================
-- test handling of collations
-- ===================================================================
--Testcase 558:
create foreign table ft3 (f1 text collate "C", f2 text, f3 varchar(10)) server sqlite_svr;
-- can be sent to remote
--Testcase 559:
explain (verbose, costs off) select * from ft3 where f1 = 'foo';
--Testcase 560:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "C" = 'foo';
--Testcase 561:
explain (verbose, costs off) select * from ft3 where f2 = 'foo';
--Testcase 562:
explain (verbose, costs off) select * from ft3 where f3 = 'foo';
--Testcase 563:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 and l.f1 = 'foo';
-- can't be sent to remote
--Testcase 564:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "POSIX" = 'foo';
--Testcase 565:
explain (verbose, costs off) select * from ft3 where f1 = 'foo' COLLATE "C";
--Testcase 566:
explain (verbose, costs off) select * from ft3 where f2 COLLATE "C" = 'foo';
--Testcase 567:
explain (verbose, costs off) select * from ft3 where f2 = 'foo' COLLATE "C";
--Testcase 568:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 COLLATE "POSIX" and l.f1 = 'foo';
-- ===================================================================
-- test writable foreign table stuff
-- ===================================================================
--Testcase 282:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 283:
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 284:
INSERT INTO ft2 (c1,c2,c3) VALUES (1101,201,'aaa'), (1102,202,'bbb'), (1103,203,'ccc');
--Testcase 285:
SELECT * FROM ft2 WHERE c1 >= 1101;
--Testcase 286:
INSERT INTO ft2 (c1,c2,c3) VALUES (1104,204,'ddd'), (1105,205,'eee');
--Testcase 287:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3; -- can be pushed down
--Testcase 288:
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3;
--Testcase 289:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7; -- can be pushed down
--Testcase 290:
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7;
--Testcase 291:
SELECT * FROM ft2 WHERE c1 % 10 = 7;
--Testcase 292:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9; -- can be pushed down
--Testcase 293:
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9;
--Testcase 294:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 % 10 = 5; -- can be pushed down
--Testcase 295:
SELECT c1, c4 FROM ft2 WHERE c1 % 10 = 5;
--Testcase 569:
DELETE FROM ft2 WHERE c1 % 10 = 5;
--Testcase 297:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2; -- can be pushed down
--Testcase 298:
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
--Testcase 299:
SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1;
--Testcase 300:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 301:
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 302:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200; -- can be pushed down
--Testcase 303:
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200;
--Testcase 304:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 = 1200; -- can be pushed down
--Testcase 305:
DELETE FROM ft2 WHERE c1 = 1200;
-- Test UPDATE/DELETE on a three-table join
--Testcase 306:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id;
--Testcase 307:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 308:
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1;
--Testcase 309:
SELECT ft2, ft2.*, ft4, ft4.*
FROM ft2 INNER JOIN ft4 ON (ft2.c1 > 1200 AND ft2.c2 = ft4.c1)
INNER JOIN ft5 ON (ft4.c1 = ft5.c1);
--Testcase 310:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 311:
SELECT 100 FROM ft2, ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 570:
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 312:
DELETE FROM ft2 WHERE ft2.c1 > 1200;
-- Test UPDATE with a MULTIEXPR sub-select
-- (maybe someday this'll be remotely executable, but not today)
--Testcase 571:
EXPLAIN (verbose, costs off)
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 572:
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 573:
UPDATE ft2 AS target SET (c2) = (
SELECT c2 / 10
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
-- Test UPDATE involving a join that can be pushed down,
-- but a SET clause that can't be
--Testcase 812:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
--Testcase 813:
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
-- Test UPDATE/DELETE with WHERE or JOIN/ON conditions containing
-- user-defined operators/functions
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 574:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id % 10, to_char(id, 'FM00000') FROM generate_series(2001, 2010) id;
--Testcase 575:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000; -- can't be pushed down
--Testcase 576:
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 577:
SELECT * FROM ft2 WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 578:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1; -- can't be pushed down
--Testcase 579:
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 580:
SELECT ft2.*, ft4.*, ft5.*
FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 581:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 582:
SELECT ft2.c1, ft2.c2, ft2.c3 FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 583:
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1;
--Testcase 584:
DELETE FROM ft2 WHERE ft2.c1 > 2000;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- Test that trigger on remote table works as expected
--Testcase 585:
CREATE OR REPLACE FUNCTION "S 1".F_BRTRIG() RETURNS trigger AS $$
BEGIN
NEW.c3 = NEW.c3 || '_trig_update';
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
--Testcase 586:
CREATE TRIGGER t1_br_insert BEFORE INSERT OR UPDATE
ON ft2 FOR EACH ROW EXECUTE PROCEDURE "S 1".F_BRTRIG();
--Testcase 313:
INSERT INTO ft2 (c1,c2,c3) VALUES (1208, 818, 'fff');
--Testcase 314:
SELECT * FROM ft2 WHERE c1 = 1208;
--Testcase 315:
INSERT INTO ft2 (c1,c2,c3,c6) VALUES (1218, 818, 'ggg', '(--;');
--Testcase 316:
SELECT * FROM ft2 WHERE c1 = 1218;
--Testcase 317:
UPDATE ft2 SET c2 = c2 + 600, c3 = c3 WHERE c1 % 10 = 8 AND c1 < 1200;
--Testcase 318:
SELECT * FROM ft2 WHERE c1 % 10 = 8 AND c1 < 1200;
-- Test errors thrown on remote side during update
-- create table in the remote server with check contraint
--Testcase 738:
CREATE FOREIGN TABLE ft1_constraint (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr OPTIONS (table 't1_constraint');
--Testcase 747:
INSERT INTO ft1_constraint SELECT * FROM ft1 ON CONFLICT DO NOTHING;
-- c2 must be greater than or equal to 0, so this case is ignored.
--Testcase 754:
INSERT INTO ft1_constraint(c1, c2) VALUES (2222, -2) ON CONFLICT DO NOTHING; -- ignore, do nothing
--Testcase 755:
SELECT c1, c2 FROM ft1_constraint WHERE c1 = 2222 or c2 = -2; -- empty result
--Testcase 748:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 749:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
--Testcase 319:
INSERT INTO ft1(c1, c2) VALUES(11, 12); -- duplicate key
--Testcase 320:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO NOTHING; -- unsupported
--Testcase 321:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO UPDATE SET c3 = 'ffg'; -- unsupported
--Testcase 743:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 744:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 750:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_constraint;
--Testcase 751:
ALTER FOREIGN TABLE ft1_org RENAME TO ft1;
-- Test savepoint/rollback behavior
--Testcase 322:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 323:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
begin;
--Testcase 324:
update ft2 set c2 = 42 where c2 = 0;
--Testcase 325:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s1;
--Testcase 326:
update ft2 set c2 = 44 where c2 = 4;
--Testcase 327:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s1;
--Testcase 328:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s2;
--Testcase 329:
update ft2 set c2 = 46 where c2 = 6;
--Testcase 330:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
rollback to savepoint s2;
--Testcase 331:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s2;
--Testcase 332:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s3;
--Testcase 333:
--skip, does not support CHECK
--update ft2 set c2 = -2 where c2 = 42 and c1 = 10; -- fail on remote side
rollback to savepoint s3;
--Testcase 334:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s3;
--Testcase 335:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
-- none of the above is committed yet remotely
--Testcase 336:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
commit;
--Testcase 337:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 338:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
--VACUUM ANALYZE "S 1"."T 1";
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
-- FIRST behavior here.
-- ORDER BY DESC NULLS LAST options
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
--Testcase 340:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
-- ORDER BY DESC NULLS FIRST options
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 342:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ORDER BY ASC NULLS FIRST options
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 344:
SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ===================================================================
-- test check constraints
-- ===================================================================
--Testcase 752:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 753:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
-- Consistent check constraints provide consistent results
--Testcase 814:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2positive CHECK (c2 >= 0);
--Testcase 587:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 588:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 815:
SET constraint_exclusion = 'on';
--Testcase 589:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 590:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 816:
RESET constraint_exclusion;
-- check constraint is enforced on the remote side, not locally
--Testcase 745:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 746:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 817:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2positive;
-- But inconsistent check constraints provide inconsistent results
--Testcase 818:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2negative CHECK (c2 < 0);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 592:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 819:
SET constraint_exclusion = 'on';
--Testcase 593:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 594:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 820:
RESET constraint_exclusion;
-- local check constraint is not actually enforced
--Testcase 595:
INSERT INTO ft1(c1, c2) VALUES(1111, 2);
--Testcase 596:
UPDATE ft1 SET c2 = c2 + 1 WHERE c1 = 1;
--Testcase 821:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2negative;
-- ===================================================================
-- test WITH CHECK OPTION constraints
-- ===================================================================
--Testcase 597:
CREATE FUNCTION row_before_insupd_trigfunc() RETURNS trigger AS $$BEGIN NEW.a := NEW.a + 10; RETURN NEW; END$$ LANGUAGE plpgsql;
--Testcase 598:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 599:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 600:
CREATE VIEW rw_view AS SELECT * FROM foreign_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 601:
\d+ rw_view
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 602:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 603:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 604:
INSERT INTO rw_view VALUES (0, 15); -- error
--Testcase 605:
SELECT * FROM foreign_tbl;
--Testcase 606:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 607:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 608:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 609:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 610:
SELECT * FROM foreign_tbl;
--Testcase 611:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 612:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
-- test WCO for partitions
--Testcase 613:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 614:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 615:
CREATE TABLE parent_tbl (a int, b int) PARTITION BY RANGE(a);
--Testcase 822:
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
--Testcase 616:
CREATE VIEW rw_view AS SELECT * FROM parent_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 617:
\d+ rw_view
--Testcase 618:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 619:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 620:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 621:
INSERT INTO rw_view VALUES (0, 15); -- ok
--Testcase 622:
SELECT * FROM foreign_tbl;
--Testcase 623:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 624:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 625:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 626:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 627:
SELECT * FROM foreign_tbl;
--Testcase 628:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
--Testcase 629:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 630:
DROP TABLE parent_tbl CASCADE;
--Testcase 631:
DROP FUNCTION row_before_insupd_trigfunc;
-- ===================================================================
-- test serial columns (ie, sequence-based defaults)
-- ===================================================================
--Testcase 632:
create foreign table loc1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr;
--Testcase 633:
create foreign table rem1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr options(table 'loc1');
--Testcase 352:
select pg_catalog.setval('rem1_f1_seq', 10, false);
--Testcase 353:
insert into loc1(f2) values('hi');
--Testcase 634:
insert into rem1(f2) values('hi remote');
--Testcase 354:
insert into loc1(f2) values('bye');
--Testcase 635:
insert into rem1(f2) values('bye remote');
--Testcase 355:
select f1, f2 from loc1;
--Testcase 636:
select f1, f2 from rem1;
-- ===================================================================
-- test generated columns
-- ===================================================================
--Testcase 637:
create foreign table grem1 (
a int options (key 'true'),
b int generated always as (a * 2) stored)
server sqlite_svr options(table 'grem1_post14');
--Testcase 638:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 823:
insert into grem1 (a) values (1), (2);
--Testcase 639:
explain (verbose, costs off)
update grem1 set a = 22 where a = 2;
--Testcase 824:
update grem1 set a = 22 where a = 2;
--Testcase 640:
select * from grem1;
--Testcase 825:
delete from grem1;
-- -- test copy from
-- copy grem1 from stdin;
-- 1
-- 2
-- \.
-- select * from grem1;
-- delete from grem1;
-- test batch insert
--Testcase 826:
alter server sqlite_svr options (add batch_size '10');
--Testcase 827:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 828:
insert into grem1 (a) values (1), (2);
--Testcase 829:
select * from grem1;
--Testcase 830:
delete from grem1;
--Testcase 831:
alter server sqlite_svr options (drop batch_size);
-- ===================================================================
-- test local triggers
-- ===================================================================
-- Trigger functions "borrowed" from triggers regress test.
--Testcase 641:
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;$$;
--Testcase 642:
CREATE TRIGGER trig_stmt_before BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 643:
CREATE TRIGGER trig_stmt_after AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 644:
CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger
LANGUAGE plpgsql AS $$
declare
oldnew text[];
relid text;
argstr text;
begin
relid := TG_relid::regclass;
argstr := '';
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 '%(%) % % % ON %',
tg_name, argstr, TG_when, TG_level, TG_OP, relid;
oldnew := '{}'::text[];
if TG_OP != 'INSERT' then
oldnew := array_append(oldnew, format('OLD: %s', OLD));
end if;
if TG_OP != 'DELETE' then
oldnew := array_append(oldnew, format('NEW: %s', NEW));
end if;
RAISE NOTICE '%', array_to_string(oldnew, ',');
if TG_OP = 'DELETE' then
return OLD;
else
return NEW;
end if;
end;
$$;
-- Test basic functionality
--Testcase 645:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 646:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 356:
delete from rem1;
--Testcase 357:
insert into rem1 values(1,'insert');
--Testcase 358:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 359:
update rem1 set f2 = f2 || f2;
-- cleanup
--Testcase 647:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 648:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 649:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 650:
DROP TRIGGER trig_stmt_after ON rem1;
--Testcase 360:
DELETE from rem1;
-- Test multiple AFTER ROW triggers on a foreign table
--Testcase 651:
CREATE TRIGGER trig_row_after1
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 652:
CREATE TRIGGER trig_row_after2
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 653:
insert into rem1 values(1,'insert');
--Testcase 654:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 655:
update rem1 set f2 = f2 || f2;
--Testcase 656:
delete from rem1;
-- cleanup
--Testcase 657:
DROP TRIGGER trig_row_after1 ON rem1;
--Testcase 658:
DROP TRIGGER trig_row_after2 ON rem1;
-- Test WHEN conditions
--Testcase 659:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 660:
CREATE TRIGGER trig_row_after_insupd
AFTER INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Insert or update not matching: nothing happens
--Testcase 363:
INSERT INTO rem1 values(1, 'insert');
--Testcase 364:
UPDATE rem1 set f2 = 'test';
-- Insert or update matching: triggers are fired
--Testcase 365:
INSERT INTO rem1 values(2, 'update');
--Testcase 366:
UPDATE rem1 set f2 = 'update update' where f1 = '2';
--Testcase 661:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 662:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Trigger is fired for f1=2, not for f1=1
--Testcase 369:
DELETE FROM rem1;
-- cleanup
--Testcase 663:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 664:
DROP TRIGGER trig_row_after_insupd ON rem1;
--Testcase 665:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 666:
DROP TRIGGER trig_row_after_delete ON rem1;
-- Test various RETURN statements in BEFORE triggers.
--Testcase 667:
CREATE FUNCTION trig_row_before_insupdate() RETURNS TRIGGER AS $$
BEGIN
NEW.f2 := NEW.f2 || ' triggered !';
RETURN NEW;
END
$$ language plpgsql;
--Testcase 668:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
-- The new values should have 'triggered' appended
--Testcase 370:
INSERT INTO rem1 values(1, 'insert');
--Testcase 371:
SELECT f1, f2 from rem1;
--Testcase 372:
INSERT INTO rem1 values(2, 'insert');
--Testcase 373:
SELECT f1, f2 from rem1;
--Testcase 374:
UPDATE rem1 set f2 = '';
--Testcase 375:
SELECT f1, f2 from rem1;
--Testcase 376:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 377:
SELECT f1, f2 from rem1;
--Testcase 669:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f1 = 10; -- all columns should be transmitted
--Testcase 670:
UPDATE rem1 set f1 = 10;
--Testcase 671:
SELECT f1, f2 from rem1;
--Testcase 378:
DELETE FROM rem1;
-- Add a second trigger, to check that the changes are propagated correctly
-- from trigger to trigger
--Testcase 672:
CREATE TRIGGER trig_row_before_insupd2
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 379:
INSERT INTO rem1 values(1, 'insert');
--Testcase 380:
SELECT f1, f2 from rem1;
--Testcase 381:
INSERT INTO rem1 values(2, 'insert');
--Testcase 382:
SELECT f1, f2 from rem1;
--Testcase 383:
UPDATE rem1 set f2 = '';
--Testcase 384:
SELECT f1, f2 from rem1;
--Testcase 385:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 386:
SELECT f1, f2 from rem1;
--Testcase 673:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 674:
DROP TRIGGER trig_row_before_insupd2 ON rem1;
--Testcase 387:
DELETE from rem1;
--Testcase 388:
INSERT INTO rem1 VALUES (1, 'test');
-- Test with a trigger returning NULL
--Testcase 675:
CREATE FUNCTION trig_null() RETURNS TRIGGER AS $$
BEGIN
RETURN NULL;
END
$$ language plpgsql;
--Testcase 676:
CREATE TRIGGER trig_null
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_null();
-- Nothing should have changed.
--Testcase 389:
INSERT INTO rem1 VALUES (2, 'test2');
--Testcase 390:
SELECT f1, f2 from rem1;
--Testcase 391:
UPDATE rem1 SET f2 = 'test2';
--Testcase 392:
SELECT f1, f2 from rem1;
--Testcase 393:
DELETE from rem1;
--Testcase 394:
SELECT f1, f2 from rem1;
--Testcase 677:
DROP TRIGGER trig_null ON rem1;
--Testcase 395:
DELETE from rem1;
-- Test a combination of local and remote triggers
--Testcase 678:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 679:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 680:
CREATE TRIGGER trig_local_before BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 681:
INSERT INTO rem1(f2) VALUES ('test');
--Testcase 682:
UPDATE rem1 SET f2 = 'testo';
-- Test returning a system attribute
--Testcase 683:
INSERT INTO rem1(f2) VALUES ('test');
-- cleanup
--Testcase 684:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 685:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 686:
DROP TRIGGER trig_local_before ON rem1;
-- Test direct foreign table modification functionality
--Testcase 832:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 833:
EXPLAIN (verbose, costs off)
DELETE FROM rem1 WHERE false; -- currently can't be pushed down
-- Test with statement-level triggers
--Testcase 687:
CREATE TRIGGER trig_stmt_before
BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 396:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 397:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 688:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 689:
CREATE TRIGGER trig_stmt_after
AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 398:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 399:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 690:
DROP TRIGGER trig_stmt_after ON rem1;
-- Test with row-level ON INSERT triggers
--Testcase 691:
CREATE TRIGGER trig_row_before_insert
BEFORE INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 400:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 401:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 692:
DROP TRIGGER trig_row_before_insert ON rem1;
--Testcase 693:
CREATE TRIGGER trig_row_after_insert
AFTER INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 402:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 403:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 694:
DROP TRIGGER trig_row_after_insert ON rem1;
-- Test with row-level ON UPDATE triggers
--Testcase 695:
CREATE TRIGGER trig_row_before_update
BEFORE UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 404:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 405:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 696:
DROP TRIGGER trig_row_before_update ON rem1;
--Testcase 697:
CREATE TRIGGER trig_row_after_update
AFTER UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 406:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 407:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 698:
DROP TRIGGER trig_row_after_update ON rem1;
-- Test with row-level ON DELETE triggers
--Testcase 699:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 408:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 409:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 700:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 701:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 410:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 411:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 702:
DROP TRIGGER trig_row_after_delete ON rem1;
-- ===================================================================
-- test inheritance features
-- ===================================================================
--Testcase 703:
CREATE TABLE a (aa TEXT);
--Testcase 834:
ALTER TABLE a SET (autovacuum_enabled = 'false');
--Testcase 704:
CREATE FOREIGN TABLE b (aa TEXT OPTIONS (key 'true'), bb TEXT) INHERITS (a)
SERVER sqlite_svr OPTIONS (table 'loct');
--Testcase 412:
INSERT INTO a(aa) VALUES('aaa');
--Testcase 413:
INSERT INTO a(aa) VALUES('aaaa');
--Testcase 414:
INSERT INTO a(aa) VALUES('aaaaa');
--Testcase 415:
INSERT INTO b(aa) VALUES('bbb');
--Testcase 416:
INSERT INTO b(aa) VALUES('bbbb');
--Testcase 417:
INSERT INTO b(aa) VALUES('bbbbb');
--Testcase 418:
SELECT tableoid::regclass, * FROM a;
--Testcase 419:
SELECT tableoid::regclass, * FROM b;
--Testcase 420:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 421:
UPDATE a SET aa = 'zzzzzz' WHERE aa LIKE 'aaaa%';
--Testcase 422:
SELECT tableoid::regclass, * FROM a;
--Testcase 423:
SELECT tableoid::regclass, * FROM b;
--Testcase 424:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 425:
UPDATE b SET aa = 'new';
--Testcase 426:
SELECT tableoid::regclass, * FROM a;
--Testcase 427:
SELECT tableoid::regclass, * FROM b;
--Testcase 428:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 429:
UPDATE a SET aa = 'newtoo';
--Testcase 430:
SELECT tableoid::regclass, * FROM a;
--Testcase 431:
SELECT tableoid::regclass, * FROM b;
--Testcase 432:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 433:
DELETE FROM a;
--Testcase 434:
SELECT tableoid::regclass, * FROM a;
--Testcase 435:
SELECT tableoid::regclass, * FROM b;
--Testcase 436:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 705:
DROP TABLE a CASCADE;
-- Check SELECT FOR UPDATE/SHARE with an inherited source table
--Testcase 706:
create table foo (f1 int, f2 int);
--Testcase 707:
create foreign table foo2 (f3 int OPTIONS (key 'true')) inherits (foo)
server sqlite_svr options (table 'loct1');
--Testcase 708:
create table bar (f1 int, f2 int);
--Testcase 709:
create foreign table bar2 (f3 int OPTIONS (key 'true')) inherits (bar)
server sqlite_svr options (table 'loct2');
--Testcase 835:
alter table foo set (autovacuum_enabled = 'false');
--Testcase 836:
alter table bar set (autovacuum_enabled = 'false');
--Testcase 437:
insert into foo values(1,1);
--Testcase 438:
insert into foo values(3,3);
--Testcase 439:
insert into foo2 values(2,2,2);
--Testcase 440:
insert into foo2 values(4,4,4);
--Testcase 441:
insert into bar values(1,11);
--Testcase 442:
insert into bar values(2,22);
--Testcase 443:
insert into bar values(6,66);
--Testcase 444:
insert into bar2 values(3,33,33);
--Testcase 445:
insert into bar2 values(4,44,44);
--Testcase 446:
insert into bar2 values(7,77,77);
--Testcase 447:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 448:
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 449:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for share;
--Testcase 450:
select * from bar where f1 in (select f1 from foo) for share;
-- Now check SELECT FOR UPDATE/SHARE with an inherited source table,
-- where the parent is itself a foreign table
--Testcase 837:
create foreign table foo2child (f3 int) inherits (foo2)
server sqlite_svr options (table 'loct4_2');
--Testcase 838:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 839:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 840:
drop foreign table foo2child;
-- And with a local child relation of the foreign table parent
--Testcase 841:
create table foo2child (f3 int) inherits (foo2);
--Testcase 842:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 843:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 844:
drop table foo2child;
-- Check UPDATE with inherited target and an inherited source table
--Testcase 451:
explain (verbose, costs off)
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 452:
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 453:
select tableoid::regclass, * from bar order by 1,2;
-- Check UPDATE with inherited target and an appendrel subquery
--Testcase 454:
explain (verbose, costs off)
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 455:
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 456:
select tableoid::regclass, * from bar order by 1,2;
-- Test forcing the remote server to produce sorted data for a merge join,
-- but the foreign table is an inheritance child.
--truncate table loct1;
--Testcase 710:
delete from foo2;
truncate table only foo;
\set num_rows_foo 2000
--Testcase 711:
insert into foo2 select generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2);
--Testcase 712:
insert into foo select generate_series(1, :num_rows_foo, 2), generate_series(1, :num_rows_foo, 2);
--Testcase 845:
SET enable_hashjoin to false;
--Testcase 846:
SET enable_nestloop to false;
--alter foreign table foo2 options (use_remote_estimate 'true');
--create index i_loct1_f1 on loct1(f1);
--Testcase 713:
create index i_foo_f1 on foo(f1);
analyze foo;
--analyze loct1;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 714:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 715:
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 716:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 717:
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 847:
RESET enable_hashjoin;
--Testcase 848:
RESET enable_nestloop;
-- Test that WHERE CURRENT OF is not supported
begin;
declare c cursor for select * from bar where f1 = 7;
--Testcase 457:
fetch from c;
--Testcase 458:
update bar set f2 = null where current of c;
rollback;
--Testcase 459:
explain (verbose, costs off)
delete from foo where f1 < 5;
--Testcase 460:
delete from foo where f1 < 5;
--Testcase 461:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 462:
update bar set f2 = f2 + 100;
--Testcase 463:
select * from bar;
-- Test that UPDATE/DELETE with inherited target works with row-level triggers
--Testcase 718:
CREATE TRIGGER trig_row_before
BEFORE UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 719:
CREATE TRIGGER trig_row_after
AFTER UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 464:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 465:
update bar set f2 = f2 + 100;
--Testcase 466:
explain (verbose, costs off)
delete from bar where f2 < 400;
--Testcase 467:
delete from bar where f2 < 400;
-- cleanup
--Testcase 720:
drop table foo cascade;
--Testcase 721:
drop table bar cascade;
-- Test pushing down UPDATE/DELETE joins to the remote server
--Testcase 722:
create table parent (a int, b text);
--Testcase 723:
create foreign table remt1 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct3');
--Testcase 724:
create foreign table remt2 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct4');
--Testcase 849:
alter foreign table remt1 inherit parent;
--Testcase 468:
insert into remt1 values (1, 'foo');
--Testcase 469:
insert into remt1 values (2, 'bar');
--Testcase 470:
insert into remt2 values (1, 'foo');
--Testcase 471:
insert into remt2 values (2, 'bar');
--Testcase 472:
explain (verbose, costs off)
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 473:
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 474:
select * from parent inner join remt2 on (parent.a = remt2.a);
--Testcase 475:
explain (verbose, costs off)
delete from parent using remt2 where parent.a = remt2.a;
--Testcase 476:
delete from parent using remt2 where parent.a = remt2.a;
-- cleanup
--Testcase 725:
drop foreign table remt1;
--Testcase 726:
drop foreign table remt2;
--Testcase 727:
drop table parent;
/*
-- Skip these tests, sqlite fdw does not support partition table, check constraint, copy from
-- ===================================================================
-- test tuple routing for foreign-table partitions
-- ===================================================================
-- Test insert tuple routing
create table itrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table itrtest attach partition remp1 for values in (1);
alter table itrtest attach partition remp2 for values in (2);
insert into itrtest values (1, 'foo');
insert into itrtest values (1, 'bar') returning *;
insert into itrtest values (2, 'baz');
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
select tableoid::regclass, * FROM itrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
delete from itrtest;
create unique index loct1_idx on loct1 (a);
-- DO NOTHING without an inference specification is supported
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
-- But other cases are not supported
insert into itrtest values (1, 'bar') on conflict (a) do nothing;
insert into itrtest values (1, 'bar') on conflict (a) do update set b = excluded.b;
select tableoid::regclass, * FROM itrtest;
delete from itrtest;
drop index loct1_idx;
-- Test that remote triggers work with insert tuple routing
create function br_insert_trigfunc() returns trigger as $$
begin
new.b := new.b || ' triggered !';
return new;
end
$$ language plpgsql;
create trigger loct1_br_insert_trigger before insert on loct1
for each row execute procedure br_insert_trigfunc();
create trigger loct2_br_insert_trigger before insert on loct2
for each row execute procedure br_insert_trigfunc();
-- The new values are concatenated with ' triggered !'
insert into itrtest values (1, 'foo') returning *;
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
with result as (insert into itrtest values (1, 'test1'), (2, 'test2') returning *) select * from result;
drop trigger loct1_br_insert_trigger on loct1;
drop trigger loct2_br_insert_trigger on loct2;
drop table itrtest;
drop table loct1;
drop table loct2;
-- Test update tuple routing
create table utrtest (a int, b text) partition by list (a);
create table loct (a int check (a in (1)), b text);
create foreign table remp (a int check (a in (1)), b text) server loopback options (table_name 'loct');
create table locp (a int check (a in (2)), b text);
alter table utrtest attach partition remp for values in (1);
alter table utrtest attach partition locp for values in (2);
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- It's not allowed to move a row from a partition that is foreign to another
update utrtest set a = 2 where b = 'foo' returning *;
-- But the reverse is allowed
update utrtest set a = 1 where b = 'qux' returning *;
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- The executor should not let unexercised FDWs shut down
update utrtest set a = 1 where b = 'foo';
-- Test that remote triggers work with update tuple routing
create trigger loct_br_insert_trigger before insert on loct
for each row execute procedure br_insert_trigfunc();
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition is a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 1 or a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 1 or a = 2 returning *;
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition isn't a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 2 returning *;
drop trigger loct_br_insert_trigger on loct;
-- We can move rows to a foreign partition that has been updated already,
-- but can't move rows to a foreign partition that hasn't been updated yet
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- Test the former case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 returning *;
update utrtest set a = 1 returning *;
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
-- Change the definition of utrtest so that the foreign partition get updated
-- after the local partition
delete from utrtest;
alter table utrtest detach partition remp;
drop foreign table remp;
alter table loct drop constraint loct_a_check;
alter table loct add check (a in (3));
create foreign table remp (a int check (a in (3)), b text) server loopback options (table_name 'loct');
alter table utrtest attach partition remp for values in (3);
insert into utrtest values (2, 'qux');
insert into utrtest values (3, 'xyzzy');
-- Test the latter case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 returning *;
update utrtest set a = 3 returning *; -- ERROR
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *;
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *; -- ERROR
drop table utrtest;
drop table loct;
-- Test copy tuple routing
create table ctrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table ctrtest attach partition remp1 for values in (1);
alter table ctrtest attach partition remp2 for values in (2);
copy ctrtest from stdin;
1 foo
2 qux
\.
select tableoid::regclass, * FROM ctrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
-- Copying into foreign partitions directly should work as well
copy remp1 from stdin;
1 bar
\.
select tableoid::regclass, * FROM remp1;
drop table ctrtest;
drop table loct1;
drop table loct2;
-- ===================================================================
-- test COPY FROM
-- ===================================================================
create table loc2 (f1 int, f2 text);
alter table loc2 set (autovacuum_enabled = 'false');
create foreign table rem2 (f1 int, f2 text) server loopback options(table_name 'loc2');
-- Test basic functionality
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
delete from rem2;
-- Test check constraints
alter table loc2 add constraint loc2_f1positive check (f1 >= 0);
alter foreign table rem2 add constraint rem2_f1positive check (f1 >= 0);
-- check constraint is enforced on the remote side, not locally
copy rem2 from stdin;
1 foo
2 bar
\.
copy rem2 from stdin; -- ERROR
-1 xyzzy
\.
select * from rem2;
alter foreign table rem2 drop constraint rem2_f1positive;
alter table loc2 drop constraint loc2_f1positive;
delete from rem2;
-- Test local triggers
create trigger trig_stmt_before before insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_stmt_after after insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before on rem2;
drop trigger trig_row_after on rem2;
drop trigger trig_stmt_before on rem2;
drop trigger trig_stmt_after on rem2;
delete from rem2;
create trigger trig_row_before_insert before insert on rem2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on rem2;
delete from rem2;
create trigger trig_null before insert on rem2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on rem2;
delete from rem2;
-- Test remote triggers
create trigger trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on loc2;
delete from rem2;
create trigger trig_null before insert on loc2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on loc2;
delete from rem2;
-- Test a combination of local and remote triggers
create trigger rem2_trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger rem2_trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger loc2_trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger rem2_trig_row_before on rem2;
drop trigger rem2_trig_row_after on rem2;
drop trigger loc2_trig_row_before_insert on loc2;
delete from rem2;
-- test COPY FROM with foreign table created in the same transaction
create table loc3 (f1 int, f2 text);
begin;
create foreign table rem3 (f1 int, f2 text)
server loopback options(table_name 'loc3');
copy rem3 from stdin;
1 foo
2 bar
\.
commit;
select * from rem3;
drop foreign table rem3;
drop table loc3;
*/
-- ===================================================================
-- test for TRUNCATE
-- ===================================================================
--Testcase 850:
CREATE FOREIGN TABLE tru_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable0');
--Testcase 851:
INSERT INTO "S 1".tru_rtable0 (SELECT x FROM generate_series(1,10) x);
-- CREATE TABLE tru_ptable (id int) PARTITION BY HASH(id);
-- CREATE TABLE tru_ptable__p0 PARTITION OF tru_ptable
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0);
-- CREATE TABLE tru_rtable1 (id int primary key);
-- CREATE FOREIGN TABLE tru_ftable__p1 (id int)
-- SERVER sqlite_svr OPTIONS (table 'tru_ptable');
-- INSERT INTO tru_ptable (SELECT x FROM generate_series(11,20) x);
--Testcase 852:
INSERT INTO "S 1".tru_pk_table (SELECT x FROM generate_series(1,10) x);
--Testcase 853:
INSERT INTO "S 1".tru_fk_table(fkey) (SELECT x % 10 + 1 FROM generate_series(5,25) x);
--Testcase 854:
CREATE FOREIGN TABLE tru_pk_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_pk_table');
--Testcase 855:
CREATE FOREIGN TABLE tru_ftable_parent (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_parent');
--Testcase 856:
CREATE FOREIGN TABLE tru_ftable_child () INHERITS (tru_ftable_parent)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_child');
--Testcase 857:
INSERT INTO "S 1".tru_rtable_parent (SELECT x FROM generate_series(1,8) x);
--Testcase 858:
INSERT INTO "S 1".tru_rtable_child (SELECT x FROM generate_series(10, 18) x);
-- normal truncate
--Testcase 859:
SELECT sum(id) FROM tru_ftable; -- 55
TRUNCATE tru_ftable;
--Testcase 860:
SELECT count(*) FROM "S 1".tru_rtable0; -- 0
--Testcase 861:
SELECT count(*) FROM tru_ftable; -- 0
-- 'truncatable' option
--Testcase 862:
ALTER SERVER sqlite_svr OPTIONS (ADD truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 863:
ALTER FOREIGN TABLE tru_ftable OPTIONS (ADD truncatable 'true');
TRUNCATE tru_ftable; -- accepted
--Testcase 864:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 865:
ALTER SERVER sqlite_svr OPTIONS (DROP truncatable);
--Testcase 866:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 867:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'true');
TRUNCATE tru_ftable; -- accepted
-- -- partitioned table with both local and foreign tables as partitions
-- SELECT sum(id) FROM tru_ptable; -- 155
-- TRUNCATE tru_ptable;
-- SELECT count(*) FROM tru_ptable; -- 0
-- SELECT count(*) FROM tru_ptable__p0; -- 0
-- SELECT count(*) FROM tru_ftable__p1; -- 0
-- SELECT count(*) FROM tru_rtable1; -- 0
-- 'CASCADE' option
--Testcase 868:
SELECT sum(id) FROM tru_pk_ftable; -- 55
-- SQLite FDW support TRUNCATE command by executing DELETE statement without WHERE clause.
-- In order to delete records in parent and child table subsequently,
-- SQLite FDW executes "PRAGMA foreign_keys = ON" before executing DELETE statement.
TRUNCATE tru_pk_ftable; -- success
TRUNCATE tru_pk_ftable CASCADE; -- success
--Testcase 869:
SELECT count(*) FROM tru_pk_ftable; -- 0
--Testcase 870:
SELECT count(*) FROM "S 1".tru_fk_table; -- also truncated,0
-- truncate two tables at a command
--Testcase 871:
INSERT INTO tru_ftable (SELECT x FROM generate_series(1,8) x);
--Testcase 872:
INSERT INTO tru_pk_ftable (SELECT x FROM generate_series(3,10) x);
--Testcase 873:
SELECT count(*) from tru_ftable; -- 8
--Testcase 874:
SELECT count(*) from tru_pk_ftable; -- 8
TRUNCATE tru_ftable, tru_pk_ftable;
--Testcase 875:
SELECT count(*) from tru_ftable; -- 0
--Testcase 876:
SELECT count(*) from tru_pk_ftable; -- 0
-- truncate with ONLY clause
-- Since ONLY is specified, the table tru_ftable_child that inherits
-- tru_ftable_parent locally is not truncated.
TRUNCATE ONLY tru_ftable_parent;
--Testcase 877:
SELECT sum(id) FROM tru_ftable_parent; -- 126
TRUNCATE tru_ftable_parent;
--Testcase 878:
SELECT count(*) FROM tru_ftable_parent; -- 0
-- -- in case when remote table has inherited children
-- CREATE TABLE tru_rtable0_child () INHERITS (tru_rtable0);
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(5,9) x);
-- INSERT INTO "S 1".tru_rtable0_child (SELECT x FROM generate_series(10,14) x);
-- SELECT sum(id) FROM tru_ftable; -- 95
-- -- Both parent and child tables in the foreign server are truncated
-- -- even though ONLY is specified because ONLY has no effect
-- -- when truncating a foreign table.
-- TRUNCATE ONLY tru_ftable;
-- SELECT count(*) FROM tru_ftable; -- 0
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(21,25) x);
-- INSERT INTO tru_rtable0_child (SELECT x FROM generate_series(26,30) x);
-- SELECT sum(id) FROM tru_ftable; -- 255
-- TRUNCATE tru_ftable; -- truncate both of parent and child
-- SELECT count(*) FROM tru_ftable; -- 0
-- cleanup
--Testcase 879:
DROP FOREIGN TABLE tru_ftable_parent, tru_ftable_child, tru_pk_ftable,tru_ftable;
-- DROP TABLE tru_rtable0, tru_rtable1, tru_ptable, tru_ptable__p0, tru_pk_table, tru_fk_table,
-- tru_rtable_parent,tru_rtable_child, tru_rtable0_child;
-- ===================================================================
-- test IMPORT FOREIGN SCHEMA
-- ===================================================================
--Testcase 728:
CREATE SCHEMA import_dest1;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest1;
--Testcase 477:
\det+ import_dest1.*
--Testcase 478:
\d import_dest1.*
-- Options
--Testcase 729:
CREATE SCHEMA import_dest2;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest2
OPTIONS (import_default 'true');
--Testcase 479:
\det+ import_dest2.*
--Testcase 480:
\d import_dest2.*
-- Check LIMIT TO and EXCEPT
--Testcase 730:
CREATE SCHEMA import_dest3;
IMPORT FOREIGN SCHEMA public LIMIT TO ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 481:
\det+ import_dest3.*
IMPORT FOREIGN SCHEMA public EXCEPT ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 482:
\det+ import_dest3.*
-- Assorted error cases
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest3;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO notthere;
IMPORT FOREIGN SCHEMA public FROM SERVER nowhere INTO notthere;
/*
-- Skip these test, sqlite fdw does not support fetch_size option, partition table
-- Check case of a type present only on the remote server.
-- We can fake this by dropping the type locally in our transaction.
CREATE TYPE "Colors" AS ENUM ('red', 'green', 'blue');
CREATE TABLE import_source.t5 (c1 int, c2 text collate "C", "Col" "Colors");
CREATE SCHEMA import_dest5;
BEGIN;
DROP TYPE "Colors" CASCADE;
IMPORT FOREIGN SCHEMA import_source LIMIT TO (t5)
FROM SERVER loopback INTO import_dest5; -- ERROR
ROLLBACK;
BEGIN;
CREATE SERVER fetch101 FOREIGN DATA WRAPPER postgres_fdw OPTIONS( fetch_size '101' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
ALTER SERVER fetch101 OPTIONS( SET fetch_size '202' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=202'];
CREATE FOREIGN TABLE table30000 ( x int ) SERVER fetch101 OPTIONS ( fetch_size '30000' );
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '60000');
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=60000'];
ROLLBACK;
-- ===================================================================
-- test partitionwise joins
-- ===================================================================
SET enable_partitionwise_join=on;
CREATE TABLE fprt1 (a int, b int, c varchar) PARTITION BY RANGE(a);
CREATE TABLE fprt1_p1 (LIKE fprt1);
CREATE TABLE fprt1_p2 (LIKE fprt1);
ALTER TABLE fprt1_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt1_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt1_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 2) i;
INSERT INTO fprt1_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 2) i;
CREATE FOREIGN TABLE ftprt1_p1 PARTITION OF fprt1 FOR VALUES FROM (0) TO (250)
SERVER loopback OPTIONS (table_name 'fprt1_p1', use_remote_estimate 'true');
CREATE FOREIGN TABLE ftprt1_p2 PARTITION OF fprt1 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (TABLE_NAME 'fprt1_p2');
ANALYZE fprt1;
ANALYZE fprt1_p1;
ANALYZE fprt1_p2;
CREATE TABLE fprt2 (a int, b int, c varchar) PARTITION BY RANGE(b);
CREATE TABLE fprt2_p1 (LIKE fprt2);
CREATE TABLE fprt2_p2 (LIKE fprt2);
ALTER TABLE fprt2_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt2_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt2_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 3) i;
INSERT INTO fprt2_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 3) i;
CREATE FOREIGN TABLE ftprt2_p1 (b int, c varchar, a int)
SERVER loopback OPTIONS (table_name 'fprt2_p1', use_remote_estimate 'true');
ALTER TABLE fprt2 ATTACH PARTITION ftprt2_p1 FOR VALUES FROM (0) TO (250);
CREATE FOREIGN TABLE ftprt2_p2 PARTITION OF fprt2 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (table_name 'fprt2_p2', use_remote_estimate 'true');
ANALYZE fprt2;
ANALYZE fprt2_p1;
ANALYZE fprt2_p2;
-- inner join three tables
EXPLAIN (COSTS OFF)
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
-- left outer join + nullable clause
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
-- with whole-row reference; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
-- join with lateral reference
EXPLAIN (COSTS OFF)
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
-- with PHVs, partitionwise join selected but no join pushdown
EXPLAIN (COSTS OFF)
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
-- test FOR UPDATE; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
RESET enable_partitionwise_join;
-- ===================================================================
-- test partitionwise aggregates
-- ===================================================================
CREATE TABLE pagg_tab (a int, b int, c text) PARTITION BY RANGE(a);
CREATE TABLE pagg_tab_p1 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p2 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p3 (LIKE pagg_tab);
INSERT INTO pagg_tab_p1 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 10;
INSERT INTO pagg_tab_p2 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 20 and (i % 30) >= 10;
INSERT INTO pagg_tab_p3 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 30 and (i % 30) >= 20;
-- Create foreign partitions
CREATE FOREIGN TABLE fpagg_tab_p1 PARTITION OF pagg_tab FOR VALUES FROM (0) TO (10) SERVER loopback OPTIONS (table_name 'pagg_tab_p1');
CREATE FOREIGN TABLE fpagg_tab_p2 PARTITION OF pagg_tab FOR VALUES FROM (10) TO (20) SERVER loopback OPTIONS (table_name 'pagg_tab_p2');
CREATE FOREIGN TABLE fpagg_tab_p3 PARTITION OF pagg_tab FOR VALUES FROM (20) TO (30) SERVER loopback OPTIONS (table_name 'pagg_tab_p3');
ANALYZE pagg_tab;
ANALYZE fpagg_tab_p1;
ANALYZE fpagg_tab_p2;
ANALYZE fpagg_tab_p3;
-- When GROUP BY clause matches with PARTITION KEY.
-- Plan with partitionwise aggregates is disabled
SET enable_partitionwise_aggregate TO false;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Plan with partitionwise aggregates is enabled
SET enable_partitionwise_aggregate TO true;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Check with whole-row reference
-- Should have all the columns in the target list for the given relation
EXPLAIN (VERBOSE, COSTS OFF)
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- When GROUP BY clause does not match with PARTITION KEY.
EXPLAIN (COSTS OFF)
SELECT b, avg(a), max(a), count(*) FROM pagg_tab GROUP BY b HAVING sum(a) < 700 ORDER BY 1;
*/
/*
-- Skip these tests, sqlite fdw does not support nosuper user.
-- ===================================================================
-- access rights and superuser
-- ===================================================================
-- Non-superuser cannot create a FDW without a password in the connstr
CREATE ROLE regress_nosuper NOSUPERUSER;
GRANT USAGE ON FOREIGN DATA WRAPPER sqlite_fdw TO regress_nosuper;
SET ROLE regress_nosuper;
SHOW is_superuser;
-- This will be OK, we can create the FDW
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_nopw FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- But creation of user mappings for non-superusers should fail
CREATE USER MAPPING FOR public SERVER sqlite_nopw;
CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
CREATE FOREIGN TABLE ft1_nopw (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_nopw;
ALTER FOREIGN TABLE ft1_nopw OPTIONS (table 'T 1');
ALTER FOREIGN TABLE ft1_nopw ALTER COLUMN c1 OPTIONS (column_name 'C 1');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- If we add a password to the connstr it'll fail, because we don't allow passwords
-- in connstrs only in user mappings.
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw')$$;
END;
$d$;
-- If we add a password for our user mapping instead, we should get a different
-- error because the password wasn't actually *used* when we run with trust auth.
--
-- This won't work with installcheck, but neither will most of the FDW checks.
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- Unpriv user cannot make the mapping passwordless
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- But the superuser can
ALTER USER MAPPING FOR regress_nosuper SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SET ROLE regress_nosuper;
-- Should finally work now
SELECT 1 FROM ft1_nopw LIMIT 1;
-- unpriv user also cannot set sslcert / sslkey on the user mapping
-- first set password_required so we see the right error messages
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (SET password_required 'true');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslcert 'foo.crt');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslkey 'foo.key');
-- We're done with the role named after a specific user and need to check the
-- changes to the public mapping.
DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
-- This will fail again as it'll resolve the user mapping for public, which
-- lacks password_required=false
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- The user mapping for public is passwordless and lacks the password_required=false
-- mapping option, but will work because the current user is a superuser.
SELECT 1 FROM ft1_nopw LIMIT 1;
-- cleanup
DROP USER MAPPING FOR public SERVER sqlite_nopw;
DROP OWNED BY regress_nosuper;
DROP ROLE regress_nosuper;
-- Clean-up
RESET enable_partitionwise_aggregate;
*/
-- Two-phase transactions are not supported.
BEGIN;
--Testcase 731:
SELECT count(*) FROM ft1;
-- error here
--Testcase 732:
PREPARE TRANSACTION 'fdw_tpc';
ROLLBACK;
-- ===================================================================
-- reestablish new connection
-- ===================================================================
-- -- Test case relative with option application_name is not suitable for SQLite FDW.
-- -- Because this option is in libpq of postgres.
-- -- Change application_name of remote connection to special one
-- -- so that we can easily terminate the connection later.
-- ALTER SERVER sqlite_svr OPTIONS (application_name 'fdw_retry_check');
-- -- If debug_discard_caches is active, it results in
-- -- dropping remote connections after every transaction, making it
-- -- impossible to test termination meaningfully. So turn that off
-- -- for this test.
-- SET debug_discard_caches = 0;
-- -- Make sure we have a remote connection.
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- Terminate the remote connection and wait for the termination to complete.
-- SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- -- This query should detect the broken connection when starting new remote
-- -- transaction, reestablish new connection, and then succeed.
-- BEGIN;
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- If we detect the broken connection when starting a new remote
-- -- subtransaction, we should fail instead of establishing a new connection.
-- -- Terminate the remote connection and wait for the termination to complete.
-- SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- SAVEPOINT s;
-- -- The text of the error might vary across platforms, so only show SQLSTATE.
-- \set VERBOSITY sqlstate
-- SELECT 1 FROM ft1 LIMIT 1; -- should fail
-- \set VERBOSITY default
-- COMMIT;
-- RESET debug_discard_caches;
-- =============================================================================
-- test connection invalidation cases and sqlite_fdw_get_connections function
-- =============================================================================
-- Let's ensure to close all the existing cached connections.
--Testcase 880:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 881:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- This test case is for closing the connection in sqlitefdw_xact_callback
BEGIN;
-- Connection xact depth becomes 1 i.e. the connection is in midst of the xact.
--Testcase 882:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 883:
SELECT 1 FROM ft7 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3 should be
-- output.
--Testcase 884:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Connections are not closed at the end of the alter and drop statements.
-- That's because the connections are in midst of this xact,
-- they are just marked as invalid in sqlitefdw_inval_callback.
--Testcase 885:
ALTER SERVER sqlite_svr OPTIONS (ADD keep_connections 'off');
--Testcase 886:
DROP SERVER sqlite_svr3 CASCADE;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3
-- should be output as invalid connections. Also the server name for
-- sqlite_svr3 should be NULL because the server was dropped.
--Testcase 887:
SELECT * FROM sqlite_fdw_get_connections() ORDER BY 1;
-- The invalid connections get closed in sqlitefdw_xact_callback during commit.
COMMIT;
--Testcase 888:
ALTER SERVER sqlite_svr OPTIONS (DROP keep_connections);
-- All cached connections were closed while committing above xact, so no
-- records should be output.
--Testcase 889:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =======================================================================
-- test sqlite_fdw_disconnect and sqlite_fdw_disconnect_all functions
-- =======================================================================
BEGIN;
-- Ensure to cache loopback connection.
--Testcase 890:
SELECT 1 FROM ft1 LIMIT 1;
-- Ensure to cache loopback2 connection.
--Testcase 891:
SELECT 1 FROM ft6 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 892:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Issue a warning and return false as sqlite_svr connection is still in use and
-- can not be closed.
--Testcase 893:
SELECT sqlite_fdw_disconnect('sqlite_svr');
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 894:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Return false as connections are still in use, warnings are issued.
-- But disable warnings temporarily because the order of them is not stable.
--Testcase 895:
SET client_min_messages = 'ERROR';
--Testcase 896:
SELECT sqlite_fdw_disconnect_all();
--Testcase 897:
RESET client_min_messages;
COMMIT;
-- Ensure that sqlite_svr2 connection is closed.
--Testcase 898:
SELECT 1 FROM sqlite_fdw_disconnect('sqlite_svr2');
--Testcase 899:
SELECT server_name FROM sqlite_fdw_get_connections() WHERE server_name = 'sqlite_svr2';
-- Return false as sqlite_svr2 connection is closed already.
--Testcase 900:
SELECT sqlite_fdw_disconnect('sqlite_svr2');
-- Return an error as there is no foreign server with given name.
--Testcase 901:
SELECT sqlite_fdw_disconnect('unknownserver');
-- Let's ensure to close all the existing cached connections.
--Testcase 902:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 903:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =============================================================================
-- test case for having multiple cached connections for a foreign server
-- SQLite FDW does not support User Mapping, so cached connection is identified
-- by only serverid (not like other FDWs use key including serverid and userid),
-- and there is only one server for all users, so there is only one cached connection.
-- In case of using key including serverid and userid, if many users are used,
-- there will be many cached connections.
-- =============================================================================
--Testcase 904:
CREATE ROLE regress_multi_conn_user1 SUPERUSER;
--Testcase 905:
CREATE ROLE regress_multi_conn_user2 SUPERUSER;
--Testcase 906:
-- CREATE USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 907:
-- CREATE USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
BEGIN;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user1
--Testcase 908:
SET ROLE regress_multi_conn_user1;
--Testcase 909:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 910:
RESET ROLE;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user2
--Testcase 911:
SET ROLE regress_multi_conn_user2;
--Testcase 912:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 913:
RESET ROLE;
-- Should output one cached connection for sqlite_svr server
--Testcase 914:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
COMMIT;
-- Let's ensure to close all the existing cached connections.
--Testcase 915:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 916:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Clean up
--Testcase 917:
-- DROP USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 918:
-- DROP USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
--Testcase 919:
DROP ROLE regress_multi_conn_user1;
--Testcase 920:
DROP ROLE regress_multi_conn_user2;
-- ===================================================================
-- Test foreign server level option keep_connections
-- ===================================================================
-- By default, the connections associated with foreign server are cached i.e.
-- keep_connections option is on. Set it to off.
--Testcase 921:
ALTER SERVER sqlite_svr OPTIONS (keep_connections 'off');
-- connection to sqlite_svr server is closed at the end of xact
-- as keep_connections was set to off.
--Testcase 922:
SELECT 1 FROM ft1 LIMIT 1;
-- No cached connections, so no records should be output.
--Testcase 923:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
--Testcase 924:
ALTER SERVER sqlite_svr OPTIONS (SET keep_connections 'on');
-- ===================================================================
-- batch insert
-- ===================================================================
BEGIN;
--Testcase 925:
CREATE SERVER batch10 FOREIGN DATA WRAPPER sqlite_fdw OPTIONS( batch_size '10' );
--Testcase 926:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 927:
ALTER SERVER batch10 OPTIONS( SET batch_size '20' );
--Testcase 928:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 929:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=20'];
--Testcase 930:
CREATE FOREIGN TABLE table30 ( x int ) SERVER batch10 OPTIONS ( batch_size '30' );
--Testcase 931:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 932:
ALTER FOREIGN TABLE table30 OPTIONS ( SET batch_size '40');
--Testcase 933:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 934:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=40'];
ROLLBACK;
--Testcase 935:
CREATE FOREIGN TABLE ftable ( x int OPTIONS (key 'true') ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '10' );
--Testcase 936:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 937:
INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 938:
INSERT INTO ftable SELECT * FROM generate_series(11, 31) i;
--Testcase 939:
INSERT INTO ftable VALUES (32);
--Testcase 940:
INSERT INTO ftable VALUES (33), (34);
--Testcase 941:
SELECT COUNT(*) FROM ftable;
--Testcase 942:
DELETE FROM ftable;
--Testcase 943:
DROP FOREIGN TABLE ftable;
-- try if large batches exceed max number of bind parameters
--Testcase 944:
CREATE FOREIGN TABLE ftable ( x int OPTIONS (key 'true') ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '100000' );
--Testcase 945:
INSERT INTO ftable SELECT * FROM generate_series(1, 70000) i;
--Testcase 946:
SELECT COUNT(*) FROM ftable;
--Testcase 947:
DELETE FROM ftable;
--Testcase 948:
DROP FOREIGN TABLE ftable;
-- Disable batch insert
--Testcase 949:
CREATE FOREIGN TABLE ftable ( x int ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '1' );
--Testcase 950:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (1), (2);
--Testcase 951:
INSERT INTO ftable VALUES (1), (2);
--Testcase 952:
SELECT COUNT(*) FROM ftable;
--Testcase 953:
DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- -- Use partitioning
-- CREATE TABLE batch_table ( x int ) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 0)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p0', batch_size '10');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 1)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p1', batch_size '1');
-- CREATE TABLE batch_table_p2
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 2);
-- INSERT INTO "S 1".batch_table SELECT * FROM generate_series(1, 66) i;
-- SELECT COUNT(*) FROM "S 1".batch_table;
-- -- Check that enabling batched inserts doesn't interfere with cross-partition
-- -- updates
-- CREATE TABLE batch_cp_upd_test (a int) PARTITION BY LIST (a);
-- CREATE TABLE batch_cp_upd_test1 (LIKE batch_cp_upd_test);
-- CREATE FOREIGN TABLE batch_cp_upd_test1_f
-- PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (1)
-- SERVER sqlite_svr
-- OPTIONS (table_name 'batch_cp_upd_test1', batch_size '10');
-- CREATE TABLE batch_cp_up_test1 PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (2);
-- INSERT INTO batch_cp_upd_test VALUES (1), (2);
-- -- The following moves a row from the local partition to the foreign one
-- UPDATE batch_cp_upd_test t SET a = 1 FROM (VALUES (1), (2)) s(a) WHERE t.a = s.a;
-- SELECT tableoid::regclass, * FROM batch_cp_upd_test;
-- -- Clean up
-- DROP TABLE batch_table, batch_cp_upd_test, batch_table_p0, batch_table_p1 CASCADE;
-- -- Use partitioning
-- ALTER SERVER loopback OPTIONS (ADD batch_size '10');
-- CREATE TABLE batch_table ( x int, field1 text, field2 text) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- ALTER TABLE batch_table_p0 ADD CONSTRAINT p0_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p0');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- ALTER TABLE batch_table_p1 ADD CONSTRAINT p1_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 1)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p1');
-- INSERT INTO batch_table SELECT i, 'test'||i, 'test'|| i FROM generate_series(1, 50) i;
-- SELECT COUNT(*) FROM batch_table;
-- SELECT * FROM batch_table ORDER BY x;
-- ALTER SERVER loopback OPTIONS (DROP batch_size);
-- ===================================================================
-- test asynchronous execution
-- ===================================================================
-- ALTER SERVER loopback OPTIONS (DROP extensions);
-- ALTER SERVER loopback OPTIONS (ADD async_capable 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD async_capable 'true');
-- CREATE TABLE async_pt (a int, b int, c text) PARTITION BY RANGE (a);
-- CREATE TABLE base_tbl1 (a int, b int, c text);
-- CREATE TABLE base_tbl2 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p1 PARTITION OF async_pt FOR VALUES FROM (1000) TO (2000)
-- SERVER loopback OPTIONS (table_name 'base_tbl1');
-- CREATE FOREIGN TABLE async_p2 PARTITION OF async_pt FOR VALUES FROM (2000) TO (3000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl2');
-- INSERT INTO async_p1 SELECT 1000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- INSERT INTO async_p2 SELECT 2000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- -- simple queries
-- CREATE TABLE result_tbl (a int, b int, c text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- Check case where multiple partitions use the same connection
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl3');
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- DROP FOREIGN TABLE async_p3;
-- DROP TABLE base_tbl3;
-- -- Check case where the partitioned table has local/remote partitions
-- CREATE TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000);
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- partitionwise joins
-- SET enable_partitionwise_join TO true;
-- CREATE TABLE join_tbl (a1 int, b1 int, c1 text, a2 int, b2 int, c2 text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_partitionwise_join;
-- -- Test rescan of an async Append node with do_exec_prune=false
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_hashjoin;
-- -- Test interaction of async execution with plan-time partition pruning
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 3000;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 2000;
-- -- Test interaction of async execution with run-time partition pruning
-- SET plan_cache_mode TO force_generic_plan;
-- PREPARE async_pt_query (int, int) AS
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE a < $1 AND b === $2;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (3000, 505);
-- EXECUTE async_pt_query (3000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (2000, 505);
-- EXECUTE async_pt_query (2000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- RESET plan_cache_mode;
-- CREATE TABLE local_tbl(a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo'), (2505, 505, 'bar');
-- ANALYZE local_tbl;
-- CREATE INDEX base_tbl1_idx ON base_tbl1 (a);
-- CREATE INDEX base_tbl2_idx ON base_tbl2 (a);
-- CREATE INDEX async_p3_idx ON async_p3 (a);
-- ANALYZE base_tbl1;
-- ANALYZE base_tbl2;
-- ANALYZE async_p3;
-- ALTER FOREIGN TABLE async_p1 OPTIONS (use_remote_estimate 'true');
-- ALTER FOREIGN TABLE async_p2 OPTIONS (use_remote_estimate 'true');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- ALTER FOREIGN TABLE async_p1 OPTIONS (DROP use_remote_estimate);
-- ALTER FOREIGN TABLE async_p2 OPTIONS (DROP use_remote_estimate);
-- DROP TABLE local_tbl;
-- DROP INDEX base_tbl1_idx;
-- DROP INDEX base_tbl2_idx;
-- DROP INDEX async_p3_idx;
-- -- Test that pending requests are processed properly
-- SET enable_mergejoin TO false;
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- CREATE TABLE local_tbl (a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo');
-- ANALYZE local_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- -- Check with foreign modify
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE remote_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl3');
-- INSERT INTO remote_tbl VALUES (2505, 505, 'bar');
-- CREATE TABLE base_tbl4 (a int, b int, c text);
-- CREATE FOREIGN TABLE insert_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl4');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- SELECT * FROM insert_tbl ORDER BY a;
-- -- Check with direct modify
-- EXPLAIN (VERBOSE, COSTS OFF)
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- DROP TABLE local_tbl;
-- DROP FOREIGN TABLE remote_tbl;
-- DROP FOREIGN TABLE insert_tbl;
-- DROP TABLE base_tbl3;
-- DROP TABLE base_tbl4;
-- RESET enable_mergejoin;
-- RESET enable_hashjoin;
-- -- Test that UPDATE/DELETE with inherited target works with async_capable enabled
-- EXPLAIN (VERBOSE, COSTS OFF)
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- -- Check EXPLAIN ANALYZE for a query that scans empty partitions asynchronously
-- DELETE FROM async_p1;
-- DELETE FROM async_p2;
-- DELETE FROM async_p3;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt;
-- -- Clean up
-- DROP TABLE async_pt;
-- DROP TABLE base_tbl1;
-- DROP TABLE base_tbl2;
-- DROP TABLE result_tbl;
-- DROP TABLE join_tbl;
-- ALTER SERVER loopback OPTIONS (DROP async_capable);
-- ALTER SERVER loopback2 OPTIONS (DROP async_capable);
-- ===================================================================
-- test invalid server and foreign table options
-- ===================================================================
-- -- Invalid fdw_startup_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_startup_cost '100$%$#$#');
-- -- Invalid fdw_tuple_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_tuple_cost '100$%$#$#');
-- -- Invalid fetch_size option
-- CREATE FOREIGN TABLE inv_fsz (c1 int )
-- SERVER loopback OPTIONS (fetch_size '100$%$#$#');
-- Invalid batch_size option
--Testcase 954:
CREATE FOREIGN TABLE inv_bsz (c1 int )
SERVER sqlite_svr OPTIONS (batch_size '100$%$#$#');
-- Clean-up
--Testcase 733:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 734:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 735:
DROP SERVER sqlite_svr CASCADE;
--Testcase 736:
DROP SERVER sqlite_svr2 CASCADE;
--Testcase 737:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/extra/update.sql
================================================
--
-- UPDATE syntax tests
--
--Testcase 32:
CREATE EXTENSION sqlite_fdw;
--Testcase 33:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 34:
CREATE FOREIGN TABLE update_test (
i INT OPTIONS (key 'true'),
a INT DEFAULT 10,
b INT,
c TEXT
) SERVER sqlite_svr;
--Testcase 35:
CREATE FOREIGN TABLE upsert_test (
a INT OPTIONS (key 'true'),
b TEXT
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO update_test VALUES (1, 5, 10, 'foo');
--Testcase 2:
INSERT INTO update_test(i, b, a) VALUES (2, 15, 10);
--Testcase 3:
SELECT * FROM update_test;
--Testcase 4:
UPDATE update_test SET a = DEFAULT, b = DEFAULT;
--Testcase 5:
SELECT * FROM update_test;
-- aliases for the UPDATE target table
--Testcase 6:
UPDATE update_test AS t SET b = 10 WHERE t.a = 10;
--Testcase 7:
SELECT * FROM update_test;
--Testcase 8:
UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10;
--Testcase 9:
SELECT * FROM update_test;
--
-- Test VALUES in FROM
--
--Testcase 10:
UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j)
WHERE update_test.b = v.j;
--Testcase 11:
SELECT * FROM update_test;
-- fail, wrong data type:
--Testcase 12:
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
--
--Testcase 13:
INSERT INTO update_test SELECT i+2,a,b+1,c FROM update_test;
--Testcase 14:
SELECT * FROM update_test;
--Testcase 15:
UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo';
--Testcase 16:
SELECT * FROM update_test;
--Testcase 17:
UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10;
--Testcase 18:
SELECT * FROM update_test;
-- fail, multi assignment to same column:
--Testcase 19:
UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10;
-- uncorrelated sub-select:
--Testcase 20:
UPDATE update_test
SET (b,a) = (select a,b from update_test where b = 41 and c = 'car')
WHERE a = 100 AND b = 20;
--Testcase 21:
SELECT * FROM update_test;
-- correlated sub-select:
--Testcase 22:
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);
--Testcase 23:
SELECT * FROM update_test;
-- fail, multiple rows supplied:
--Testcase 24:
UPDATE update_test SET (b,a) = (select a+1,b from update_test);
-- set to null if no rows supplied:
--Testcase 25:
UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000)
WHERE a = 11;
--Testcase 26:
SELECT * FROM update_test;
-- *-expansion should work in this context:
--Testcase 27:
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:
--Testcase 28:
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
--Testcase 29:
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.
--Testcase 30:
UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car';
--Testcase 31:
SELECT a, b, char_length(c) FROM update_test;
-- Check multi-assignment with a Result node to handle a one-time filter.
--Testcase 36:
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;
--Testcase 37:
UPDATE update_test t
SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a)
WHERE CURRENT_USER = SESSION_USER;
--Testcase 38:
SELECT a, b, char_length(c) FROM update_test;
/* Skip, sqlite fdw does not support ON CONFLICT DO UPDATE
-- 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 FOREIGN TABLE update_test;
DROP FOREIGN TABLE upsert_test;
*/
/*Skip, sqlite fdw does not support create partition table
-- 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);
*/
--drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 39:
DROP SERVER sqlite_svr;
--Testcase 40:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/libsqlite.sql
================================================
-- Test for SQLite library code source and defaults
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
SELECT sqlite_fdw_sqlite_version();
--Testcase 3:
SELECT length(sqlite_fdw_sqlite_code_source());
--Testcase 4:
SELECT sqlite_fdw_sqlite_code_source();
--Testcase 7:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/selectfunc.sql
================================================
SET datestyle=ISO;
SET timezone='Japan';
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER server1 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/selectfunc.db');
--CREATE USER MAPPING FOR CURRENT_USER SERVER server1 OPTIONS(user 'user', password 'pass');
--IMPORT FOREIGN SCHEMA public FROM SERVER server1 INTO public OPTIONS(import_time_text 'false');
--Testcase 3:
CREATE FOREIGN TABLE s3(id text OPTIONS (key 'true'), time timestamp, tag1 text, value1 float, value2 int, value3 float, value4 int, str1 text, str2 text) SERVER server1;
-- s3 (value1 as float8, value2 as bigint)
--Testcase 4:
\d s3;
--Testcase 5:
SELECT * FROM s3;
-- select float8() (not pushdown, remove float8, explain)
-- EXPLAIN VERBOSE
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select float8() (not pushdown, remove float8, result)
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select sqrt (builtin function, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (buitin function, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function,, not pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, not pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select abs (builtin function, explain)
--Testcase 6:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (buitin function, result)
--Testcase 7:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (builtin function, not pushdown constraints, explain)
--Testcase 8:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, not pushdown constraints, result)
--Testcase 9:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, pushdown constraints, explain)
--Testcase 10:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select abs (builtin function, pushdown constraints, result)
--Testcase 11:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select log (builtin function, need to swap arguments, numeric cast, explain)
-- log_(v) : postgresql (base, v), sqlite (v, base)
-- EXPLAIN VERBOSE
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (builtin function, need to swap arguments, numeric cast, result)
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, result)
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, result)
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, result)
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log2 (stub function, explain)
-- EXPLAIN VERBOSE
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select log2 (stub function, result)
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select spread (stub agg function, explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, result)
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, raise exception if not expected type)
-- SELECT spread(value1::numeric),spread(value2::numeric),spread(value3::numeric),spread(value4::numeric) FROM s3;
-- sqlite fdw does not have spread()
-- select abs as nest function with agg (pushdown, explain)
--Testcase 12:
EXPLAIN VERBOSE
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest function with agg (pushdown, result)
--Testcase 13:
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest with log2 (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs as nest with log2 (pushdown, result)
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs with non pushdown func and explicit constant (explain)
--Testcase 14:
EXPLAIN VERBOSE
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select abs with non pushdown func and explicit constant (result)
--Testcase 15:
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select sqrt as nest function with agg and explicit constant (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant (pushdown, result)
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant and tag (error, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1, tag1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select spread (stub agg function and group by influx_time() and tag) (explain)
-- EXPLAIN VERBOSE
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by influx_time() and tag) (result)
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by tag only) (result)
-- SELECT tag1,spread("value1") FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY tag1;
-- sqlite fdw does not have spread()
-- select spread (stub agg function and other aggs) (result)
-- SELECT sum("value1"),spread("value1"),count("value1") FROM s3;
-- sqlite fdw does not have spread()
-- select abs with order by (explain)
--Testcase 16:
EXPLAIN VERBOSE
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by (result)
--Testcase 17:
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by index (result)
--Testcase 18:
SELECT value1, abs(1-value1) FROM s3 order by 2,1;
-- select abs with order by index (result)
--Testcase 19:
SELECT value1, abs(1-value1) FROM s3 order by 1,2;
-- select abs and as
--Testcase 20:
SELECT abs(value3) as abs1 FROM s3;
-- select spread over join query (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread over join query (result, stub call error)
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread with having (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select spread with having (explain, cannot pushdown, stub call error)
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select abs with arithmetic and tag in the middle (explain)
--Testcase 21:
EXPLAIN VERBOSE
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select abs with arithmetic and tag in the middle (result)
--Testcase 22:
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select with order by limit (explain)
--Testcase 23:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select with order by limit (explain)
--Testcase 24:
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select mixing with non pushdown func (all not pushdown, explain)
--Testcase 25:
EXPLAIN VERBOSE
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- select mixing with non pushdown func (result)
--Testcase 26:
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- sqlite data prep
-- sqlite pushdown supported functions (explain)
--Testcase 27:
EXPLAIN VERBOSE
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown supported functions (result)
--Testcase 28:
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown nest functions (explain)
--Testcase 32:
EXPLAIN VERBOSE
SELECT round(abs(value2), 0) FROM s3;
-- sqlite pushdown nest functions (result)
--Testcase 33:
SELECT round(abs(value2), 0) FROM s3;
-- select mod (builtin function, explain)
--Testcase 34:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, result)
--Testcase 35:
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, not pushdown constraints, explain)
--Testcase 36:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, not pushdown constraints, result)
--Testcase 37:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, pushdown constraints, explain)
--Testcase 38:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, pushdown constraints, result)
--Testcase 39:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 40:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 41:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 42:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 43:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod as nest function with agg (pushdown, explain)
--Testcase 44:
EXPLAIN VERBOSE
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest function with agg (pushdown, result)
--Testcase 45:
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, explain)
--Testcase 46:
EXPLAIN VERBOSE
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, result)
--Testcase 47:
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod with non pushdown func and explicit constant (explain)
--Testcase 48:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with non pushdown func and explicit constant (result)
--Testcase 49:
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with order by (explain)
--Testcase 50:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by (result)
--Testcase 51:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by index (result)
--Testcase 52:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 2,1;
-- select mod with order by index (result)
--Testcase 53:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 1,2;
-- select mod with group by (explain)
--Testcase 54:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by (result)
--Testcase 55:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by index (result)
--Testcase 56:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 2,1;
-- select mod with group by index (result)
--Testcase 57:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2;
-- select mod with group by having (explain)
--Testcase 58:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by having (result)
--Testcase 59:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by index having (result)
--Testcase 60:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2 HAVING value1 > 1;
-- select mod and as
--Testcase 61:
SELECT value1, mod(value2, 2) as mod1 FROM s3;
--Testcase 29:
DROP FOREIGN TABLE s3;
--Testcase 30:
DROP SERVER server1;
--Testcase 31:
DROP EXTENSION sqlite_fdw;
================================================
FILE: sql/14.12/sqlite_fdw.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 129:
CREATE EXTENSION sqlite_fdw;
--Testcase 130:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 131:
CREATE FOREIGN TABLE department(department_id int OPTIONS (key 'true'), department_name text) SERVER sqlite_svr;
--Testcase 132:
CREATE FOREIGN TABLE employee(emp_id int OPTIONS (key 'true'), emp_name text, emp_dept_id int) SERVER sqlite_svr;
--Testcase 133:
CREATE FOREIGN TABLE empdata(emp_id int OPTIONS (key 'true'), emp_dat bytea) SERVER sqlite_svr;
--Testcase 134:
CREATE FOREIGN TABLE numbers(a int OPTIONS (key 'true'), b varchar(255)) SERVER sqlite_svr;
--Testcase 135:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 136:
CREATE FOREIGN TABLE noprimary(a int, b text) SERVER sqlite_svr;
-- readonly/readwrite test github pull 59
CREATE FOREIGN TABLE RO_RW_test(i int OPTIONS (key 'true'), a text, b float, c int) SERVER sqlite_svr;
--Testcase 1:
SELECT * FROM department LIMIT 10;
--Testcase 2:
SELECT * FROM employee LIMIT 10;
--Testcase 3:
SELECT * FROM empdata LIMIT 10;
--Testcase 4:
INSERT INTO department VALUES(generate_series(1,100), 'dept - ' || generate_series(1,100));
--Testcase 5:
INSERT INTO employee VALUES(generate_series(1,100), 'emp - ' || generate_series(1,100), generate_series(1,100));
--Testcase 6:
INSERT INTO empdata VALUES(1, decode ('01234567', 'hex'));
--Testcase 7:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 8:
INSERT INTO numbers VALUES(2, 'Two');
--Testcase 9:
INSERT INTO numbers VALUES(3, 'Three');
--Testcase 10:
INSERT INTO numbers VALUES(4, 'Four');
--Testcase 11:
INSERT INTO numbers VALUES(5, 'Five');
--Testcase 12:
INSERT INTO numbers VALUES(6, 'Six');
--Testcase 13:
INSERT INTO numbers VALUES(7, 'Seven');
--Testcase 14:
INSERT INTO numbers VALUES(8, 'Eight');
--Testcase 15:
INSERT INTO numbers VALUES(9, 'Nine');
--Testcase 16:
SELECT count(*) FROM department;
--Testcase 17:
SELECT count(*) FROM employee;
--Testcase 18:
SELECT count(*) FROM empdata;
--Testcase 19:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 20:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) LIMIT 10;
--Testcase 21:
SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 22:
SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) ORDER BY d.department_id LIMIT 10;
--Testcase 23:
SELECT * FROM empdata;
--Testcase 24:
DELETE FROM employee WHERE emp_id = 10;
--Testcase 25:
SELECT COUNT(*) FROM department LIMIT 10;
--Testcase 26:
SELECT COUNT(*) FROM employee WHERE emp_id = 10;
--Testcase 27:
UPDATE employee SET emp_name = 'UPDATEd emp' WHERE emp_id = 20;
--Testcase 28:
SELECT emp_id, emp_name FROM employee WHERE emp_name like 'UPDATEd emp';
--Testcase 29:
UPDATE empdata SET emp_dat = decode ('0123', 'hex');
--Testcase 30:
SELECT * FROM empdata;
--Testcase 31:
SELECT * FROM employee LIMIT 10;
--Testcase 32:
SELECT * FROM employee WHERE emp_id IN (1);
--Testcase 33:
SELECT * FROM employee WHERE emp_id IN (1,3,4,5);
--Testcase 34:
SELECT * FROM employee WHERE emp_id IN (10000,1000);
--Testcase 35:
SELECT * FROM employee WHERE emp_id NOT IN (1) LIMIT 5;
--Testcase 36:
SELECT * FROM employee WHERE emp_id NOT IN (1,3,4,5) LIMIT 5;
--Testcase 37:
SELECT * FROM employee WHERE emp_id NOT IN (10000,1000) LIMIT 5;
--Testcase 38:
SELECT * FROM employee WHERE emp_id NOT IN (SELECT emp_id FROM employee WHERE emp_id IN (1,10));
--Testcase 39:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 1', 'emp - 2') LIMIT 5;
--Testcase 40:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 10') LIMIT 5;
--Testcase 41:
SELECT * FROM numbers WHERE (CASE WHEN a % 2 = 0 THEN 1 WHEN a % 5 = 0 THEN 1 ELSE 0 END) = 1;
--Testcase 42:
SELECT * FROM numbers WHERE (CASE b WHEN 'Two' THEN 1 WHEN 'Six' THEN 1 ELSE 0 END) = 1;
--Testcase 152:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 153:
SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 137:
create or replace function test_param_WHERE() returns void as $$
DECLARE
n varchar;
BEGIN
FOR x IN 1..9 LOOP
--Testcase 138:
SELECT b INTO n from numbers WHERE a=x;
raise notice 'Found number %', n;
end loop;
return;
END
$$ LANGUAGE plpgsql;
--Testcase 43:
SELECT test_param_WHERE();
--Testcase 44:
SELECT b from numbers WHERE a=1;
--Testcase 45:
EXPLAIN(COSTS OFF) SELECT b from numbers WHERE a=1;
--Testcase 46:
SELECT a FROM numbers WHERE b = (SELECT NULL::text);
--Testcase 47:
PREPARE stmt1 (int, int) AS
SELECT * FROM numbers WHERE a=$1 or a=$2;
--Testcase 48:
EXECUTE stmt1(1,2);
--Testcase 49:
EXECUTE stmt1(2,2);
--Testcase 50:
EXECUTE stmt1(3,2);
--Testcase 51:
EXECUTE stmt1(4,2);
-- generic plan
--Testcase 52:
EXECUTE stmt1(5,2);
--Testcase 53:
EXECUTE stmt1(6,2);
--Testcase 54:
EXECUTE stmt1(7,2);
--Testcase 55:
DELETE FROM employee;
--Testcase 56:
DELETE FROM department;
--Testcase 57:
DELETE FROM empdata;
--Testcase 58:
DELETE FROM numbers;
BEGIN;
--Testcase 59:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 60:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
--Testcase 61:
SELECT * from numbers;
BEGIN;
--Testcase 62:
INSERT INTO numbers VALUES(3, 'Three');
ROLLBACK;
--Testcase 63:
SELECT * from numbers;
BEGIN;
--Testcase 64:
INSERT INTO numbers VALUES(4, 'Four');
SAVEPOINT my_savepoint;
--Testcase 65:
INSERT INTO numbers VALUES(5, 'Five');
ROLLBACK TO SAVEPOINT my_savepoint;
--Testcase 66:
INSERT INTO numbers VALUES(6, 'Six');
COMMIT;
--Testcase 67:
SELECT * from numbers;
-- duplicate key
--Testcase 68:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 69:
DELETE from numbers;
BEGIN;
--Testcase 70:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 71:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
-- violate unique constraint
--Testcase 72:
UPDATE numbers SET b='Two' WHERE a = 1;
--Testcase 73:
SELECT * from numbers;
-- push down
--Testcase 74:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
-- (1,2,3) is pushed down
--Testcase 75:
explain (verbose, costs off) SELECT * from numbers WHERE a in (1,2,3) AND (1,2) < (a,5);
--Testcase 76:
explain (verbose, costs off) SELECT * from numbers WHERE a in (a+2*a,5);
--Testcase 77:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
--Testcase 78:
SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
--Testcase 79:
SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
-- ANY with ARRAY expression
--Testcase 154:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 155:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 156:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 157:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 158:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 159:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 160:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 161:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 162:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 163:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 164:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
--Testcase 165:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
-- ANY with ARRAY const
--Testcase 166:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 167:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 168:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 169:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 170:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 171:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 172:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 173:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 174:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 175:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 176:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 177:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 210:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 211:
SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 212:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
--Testcase 213:
SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
-- ALL with ARRAY expression
--Testcase 178:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 179:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 180:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 181:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 182:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 183:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 184:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 185:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 186:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 187:
SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 188:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
--Testcase 189:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
-- ALL with ARRAY const
--Testcase 190:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 191:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 192:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 193:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 194:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 195:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 196:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 197:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 198:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 199:
SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 200:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
--Testcase 201:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
-- ANY/ALL with TEXT ARRAY const
--Testcase 202:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 203:
SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 204:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 205:
SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 206:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 207:
SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 208:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 209:
SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 80:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 81:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 82:
UPDATE multiprimary SET b = 10 WHERE c = 3;
--Testcase 83:
SELECT * from multiprimary;
--Testcase 84:
UPDATE multiprimary SET a = 10 WHERE a = 1;
--Testcase 85:
SELECT * from multiprimary;
--Testcase 86:
UPDATE multiprimary SET a = 100, b=200, c=300 WHERE a=10 AND b=10;
--Testcase 87:
SELECT * from multiprimary;
--Testcase 88:
UPDATE multiprimary SET a = 1234;
--Testcase 89:
SELECT * from multiprimary;
--Testcase 90:
UPDATE multiprimary SET a = a+1, b=b+1 WHERE b=200 AND c=300;
--Testcase 91:
SELECT * from multiprimary;
--Testcase 92:
DELETE from multiprimary WHERE a = 1235;
--Testcase 93:
SELECT * from multiprimary;
--Testcase 94:
DELETE from multiprimary WHERE b = 2;
--Testcase 95:
SELECT * from multiprimary;
--Testcase 96:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 97:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 98:
INSERT INTO multiprimary VALUES(1,10,20);
--Testcase 99:
INSERT INTO multiprimary VALUES(2,20,40);
--Testcase 100:
SELECT count(distinct a) from multiprimary;
--Testcase 101:
SELECT sum(b),max(b), min(b) from multiprimary;
--Testcase 102:
SELECT sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 103:
SELECT sum(a) from multiprimary group by b having sum(a) > 0 order by sum(a);
--Testcase 104:
SELECT sum(a) A from multiprimary group by b having avg(abs(a)) > 0 AND sum(a) > 0 order by A;
--Testcase 105:
SELECT count(nullif(a, 1)) FROM multiprimary;
--Testcase 106:
SELECT a,a FROM multiprimary group by 1,2;
--Testcase 107:
SELECT * from multiprimary, numbers WHERE multiprimary.a=numbers.a;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 109:
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 110:
INSERT INTO numbers VALUES(4, 'Four');
-- All where clauses are pushed down
--Testcase 111:
SELECT * FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
--Testcase 112:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
-- Only "length(b) = 4" are pushed down
--Testcase 113:
SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 114:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 115:
INSERT INTO multiprimary (b,c) VALUES (99, 100);
--Testcase 116:
SELECT c FROM multiprimary WHERE COALESCE(a,b,c) = 99;
--Testcase 139:
CREATE FOREIGN TABLE multiprimary2(a int, b int, c int OPTIONS(column_name 'b')) SERVER sqlite_svr OPTIONS (table 'multiprimary');
--Testcase 117:
SELECT * FROM multiprimary2;
--Testcase 214:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN a OPTIONS(ADD column_name 'b');
--Testcase 118:
SELECT * FROM multiprimary2;
--Testcase 215:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN b OPTIONS (column_name 'nosuch column');
--Testcase 119:
SELECT * FROM multiprimary2;
--Testcase 140:
EXPLAIN (VERBOSE) SELECT * FROM multiprimary2;
--Testcase 120:
SELECT a FROM multiprimary2 WHERE b = 1;
--Testcase 141:
CREATE FOREIGN TABLE columntest(a int OPTIONS(column_name 'a a', key 'true'), "b b" int OPTIONS(key 'true'), c int OPTIONS(column_name 'c c')) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO columntest VALUES(1,2,3);
--Testcase 122:
UPDATE columntest SET c=10 WHERE a = 1;
--Testcase 123:
SELECT * FROM columntest;
--Testcase 124:
UPDATE columntest SET a=100 WHERE c = 10;
--Testcase 125:
SELECT * FROM columntest;
--Testcase 126:
INSERT INTO noprimary VALUES(1,'2');
--Testcase 127:
INSERT INTO noprimary SELECT * FROM noprimary;
--Testcase 128:
SELECT * FROM noprimary;
--get version
--Testcase 153:
\df sqlite*
--Testcase 154:
SELECT * FROM public.sqlite_fdw_version();
--Testcase 155:
SELECT sqlite_fdw_version();
-- issue #44 github
--Testcase 156:
CREATE FOREIGN TABLE fts_table (name text, description text) SERVER sqlite_svr;
--Testcase 157:
INSERT INTO fts_table VALUES ('this is name', 'this is description');
--Testcase 158:
SELECT * FROM fts_table; -- should work
--Testcase 159:
ALTER TABLE fts_table ALTER COLUMN name TYPE int;
--Testcase 160:
SELECT * FROM fts_table; -- should fail
-- issue #62 github
--Testcase 236:
INSERT INTO noprimary VALUES (4, 'Test''s');
--Testcase 237:
INSERT INTO noprimary VALUES (5, 'Test');
--Testcase 238:
SELECT * FROM noprimary;
--Testcase 239:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 240:
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 241:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b in ('Test''s', 'Test');
--Testcase 242:
SELECT * FROM noprimary where b in ('Test''s', 'Test');
-- INSERT/UPDATE whole row with generated column
--Testcase 216:
CREATE FOREIGN TABLE grem1_1 (
a int generated always as (0) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_1');
--Testcase 217:
INSERT INTO grem1_1 DEFAULT VALUES;
--Testcase 218:
SELECT * FROM grem1_1;
--Testcase 219:
CREATE FOREIGN TABLE grem1_2 (
a int generated always as (0) stored,
b int generated always as (1) stored,
c int generated always as (2) stored,
d int generated always as (3) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_2');
--Testcase 220:
INSERT INTO grem1_2 DEFAULT VALUES;
--Testcase 221:
SELECT * FROM grem1_2;
-- Executable test case for pushdown CASE expressions (results)
--Testcase 224:
CREATE FOREIGN TABLE case_exp(c1 int OPTIONS (key 'true'), c3 text, c6 varchar(10)) SERVER sqlite_svr;
--Testcase 225:
INSERT INTO case_exp
SELECT id,
to_char(id, 'FM00000'),
id % 10
FROM generate_series(1, 10) id;
--Testcase 226:
SELECT * FROM case_exp;
-- CASE arg WHEN
--Testcase 227:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
--Testcase 228:
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 229:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 230:
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 232:
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 233:
SELECT * FROM case_exp WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 234:
DELETE FROM case_exp;
-- readonly/readwrite tests
-- Full combinations
-- force_RO default SERVER default TABLE default
-- force_RO default SERVER true TABLE default
-- force_RO default SERVER false TABLE default
-- force_RO default SERVER default TABLE true
-- force_RO default SERVER default TABLE false
-- force_RO default SERVER true TABLE true
-- force_RO default SERVER false TABLE true
-- force_RO default SERVER false TABLE false
-- force_RO default SERVER true TABLE false
-- force_RO false SERVER default TABLE default
-- force_RO false SERVER true TABLE default
-- force_RO false SERVER false TABLE default
-- force_RO false SERVER default TABLE true
-- force_RO false SERVER default TABLE false
-- force_RO false SERVER true TABLE true
-- force_RO false SERVER false TABLE true
-- force_RO false SERVER false TABLE false
-- force_RO false SERVER true TABLE false
-- force_RO true SERVER default TABLE default
-- force_RO true SERVER true TABLE default
-- force_RO true SERVER false TABLE default
-- force_RO true SERVER default TABLE true
-- force_RO true SERVER default TABLE false
-- force_RO true SERVER true TABLE true
-- force_RO true SERVER false TABLE true
-- force_RO true SERVER false TABLE false
-- force_RO true SERVER true TABLE false
-- force_RO default SERVER default TABLE default
--Testcase 235:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 236:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 237:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO default SERVER true TABLE default
--Testcase 238:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 239:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 240:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 241:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 242:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO default SERVER false TABLE default
--Testcase 243:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 244:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 245:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 246:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER default TABLE true
--Testcase 247:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 248:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 249:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 250:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 251:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO default SERVER default TABLE false
--Testcase 252:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 253:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 254:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 255:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER true TABLE true
--Testcase 256:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 257:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 258:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 258:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 260:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 261:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO default SERVER false TABLE true
--Testcase 262:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 263:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 264:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 265:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO default SERVER false TABLE false
--Testcase 266:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 267:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 268:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 269:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO default SERVER true TABLE false
--Testcase 270:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 271:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 272:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 273:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 274:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 275:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 276:
SELECT * FROM RO_RW_test ORDER BY i;
--Bind error message test for some unsupported data type
--Testcase 277:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 278:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 279:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 277:
DELETE FROM RO_RW_test;
--Testcase 278:
ALTER SERVER sqlite_svr OPTIONS (ADD force_readonly 'false');
-- force_RO false SERVER default TABLE default
--Testcase 279:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 280:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 281:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO false SERVER true TABLE default
--Testcase 282:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 283:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 284:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 285:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 286:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO false SERVER false TABLE default
--Testcase 287:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 288:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 289:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 290:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER default TABLE true
--Testcase 291:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 292:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 293:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 294:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 295:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO false SERVER default TABLE false
--Testcase 296:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 297:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 298:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 299:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER true TABLE true
--Testcase 300:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 301:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 302:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 303:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 304:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 305:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO false SERVER false TABLE true
--Testcase 306:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 307:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 308:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 309:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO false SERVER false TABLE false
--Testcase 310:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 311:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 312:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 313:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO false SERVER true TABLE false
--Testcase 314:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 315:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 316:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 317:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 318:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 319:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 320:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 321:
DELETE FROM RO_RW_test;
--Testcase 322:
ALTER SERVER sqlite_svr OPTIONS (SET force_readonly 'true');
-- force_RO true SERVER default TABLE default
--Testcase 323:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- ERR
--Testcase 324:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- ERR
--Testcase 325:
DELETE FROM RO_RW_test WHERE i=2; -- ERR
-- force_RO true SERVER true TABLE default
--Testcase 326:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 327:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- ERR
--Testcase 328:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- ERR
--Testcase 329:
DELETE FROM RO_RW_test WHERE i=3; -- ERR
--Testcase 330:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- ERR
-- force_RO true SERVER false TABLE default
--Testcase 331:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 332:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 333:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 334:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER default TABLE true
--Testcase 335:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 336:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 337:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- ERR
--Testcase 338:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- ERR
--Testcase 339:
DELETE FROM RO_RW_test WHERE i=6; -- ERR
-- force_RO true SERVER default TABLE false
--Testcase 340:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 341:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 342:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 343:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER true TABLE true
--Testcase 344:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true'); -- ERR
--Testcase 345:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true'); -- ERR
--Testcase 346:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- ERR
--Testcase 347:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 348:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 349:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- ERR
-- force_RO true SERVER false TABLE true
--Testcase 350:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 351:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- ERR
--Testcase 352:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- ERR
--Testcase 353:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER false TABLE false
--Testcase 354:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 355:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 356:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 357:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER true TABLE false
--Testcase 358:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 359:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 360:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 361:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 362:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 363:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 364:
ALTER SERVER sqlite_svr OPTIONS (DROP force_readonly);
--Testcase 365:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 366:
DROP FOREIGN TABLE RO_RW_test;
-- End of RO/RW test
--Bind error message test for some unsupported data type
--Testcase 366:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 367:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 368:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 142:
DROP FUNCTION test_param_WHERE();
--Testcase 143:
DROP FOREIGN TABLE numbers;
--Testcase 144:
DROP FOREIGN TABLE department;
--Testcase 145:
DROP FOREIGN TABLE employee;
--Testcase 146:
DROP FOREIGN TABLE empdata;
--Testcase 147:
DROP FOREIGN TABLE multiprimary;
--Testcase 148:
DROP FOREIGN TABLE multiprimary2;
--Testcase 149:
DROP FOREIGN TABLE columntest;
--Testcase 150:
DROP FOREIGN TABLE noprimary;
--Testcase 161:
DROP FOREIGN TABLE fts_table;
--Testcase 222:
DROP FOREIGN TABLE grem1_1;
--Testcase 223:
DROP FOREIGN TABLE grem1_2;
--Testcase 235:
DROP FOREIGN TABLE case_exp;
--Testcase 151:
DROP SERVER sqlite_svr;
--Testcase 152:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/bitstring.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 02:
CREATE FOREIGN TABLE "type_BIT"( "i" int OPTIONS (key 'true'), "b" bit(6)) SERVER sqlite_svr OPTIONS (table 'type_BIT');
--Testcase 03:
DROP FOREIGN TABLE IF EXISTS "type_BIT+";
--Testcase 04:
CREATE FOREIGN TABLE "type_BIT+"( "i" int OPTIONS (key 'true'), "b" bit(6), "t" text, "l" smallint, "bi" bigint OPTIONS (column_name 'b')) SERVER sqlite_svr OPTIONS (table 'type_BIT+');
--Testcase 05: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (1, 1);
--Testcase 06: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (2, 2);
--Testcase 07: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (3, '1');
--Testcase 08: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (4, '10');
--Testcase 09: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (5, '101');
--Testcase 10:
INSERT INTO "type_BIT" ("i", "b") VALUES (6, '110110');
--Testcase 11:
INSERT INTO "type_BIT" ("i", "b") VALUES (7, '111001');
--Testcase 12:
INSERT INTO "type_BIT" ("i", "b") VALUES (8, '110000');
--Testcase 13:
INSERT INTO "type_BIT" ("i", "b") VALUES (9, '100001');
--Testcase 14: type mismatch with proper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (10, 53);
--Testcase 15:
SELECT * FROM "type_BIT+";
--Testcase 16:
SELECT * FROM "type_BIT" WHERE b < '110110';
--Testcase 17:
SELECT * FROM "type_BIT" WHERE b > '110110';
--Testcase 18:
SELECT * FROM "type_BIT" WHERE b = '110110';
--Testcase 20:
CREATE FOREIGN TABLE "type_VARBIT"( "i" int OPTIONS (key 'true'), "b" varbit(70)) SERVER sqlite_svr OPTIONS (table 'type_VARBIT');
--Testcase 21:
DROP FOREIGN TABLE IF EXISTS "type_VARBIT+";
--Testcase 22:
CREATE FOREIGN TABLE "type_VARBIT+"( "i" int OPTIONS (key 'true'), "b" varbit(70), "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_VARBIT+');
--Testcase 23:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (1, '1');
--Testcase 24:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (2, '10');
--Testcase 25:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (3, '11');
--Testcase 26:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (4, '100');
--Testcase 27:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (5, '101');
--Testcase 28:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (6, '110110');
--Testcase 29:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (7, '111001');
--Testcase 30:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (8, '110000');
--Testcase 31:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (9, '100001');
--Testcase 32:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (10, '0100100101011001010010101000111110110101101101111011000101010');
--Testcase 33:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (11, '01001001010110010100101010001111101101011011011110110001010101');
--Testcase 34:
SELECT * FROM "type_VARBIT+";
--Testcase 35:
SELECT * FROM "type_VARBIT+" WHERE b < '110110';
--Testcase 36:
SELECT * FROM "type_VARBIT+" WHERE b > '110110';
--Testcase 37:
SELECT * FROM "type_VARBIT+" WHERE b = '110110';
--Testcase 38:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (12, '010010010101100101001010100011111011010110110111101100010101010');
--Testcase 39:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (13, '0100100101011001010010101000111110110101101101111011000101010101');
--Testcase 40: very long bit string, expected ERROR, 65 bits
INSERT INTO "type_VARBIT" ("i", "b") VALUES (14, '01001001010110010100101010001111101101011011011110110001010101010');
--Testcase 41:
SELECT * FROM "type_VARBIT+" WHERE "i" > 10;
--Testcase 42:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 43:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 44:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 45:
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 46:
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 47:
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 48:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 49:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 50:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 51:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 52:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 53:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 54:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 55:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 56:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 57:
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 58:
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 59:
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 60:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 61:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 62:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 63:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 64:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 65:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 66:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 67:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 68:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 69:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 70:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 71:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 72:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 73:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 74:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 75:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 76:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 77:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 78:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 79:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 80:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 81:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 82:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 83:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 84:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 85:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 86:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 87:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 88:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 89:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 90:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 91:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 92:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 93:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 94:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 95:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 005:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/bool.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 000:
CREATE EXTENSION sqlite_fdw;
--Testcase 001:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 01:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int OPTIONS (key 'true'), b bool) SERVER sqlite_svr;
--Testcase 02:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (1, TRUE);
--Testcase 03:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (2, FALSE);
--Testcase 04:
CREATE FOREIGN TABLE "type_BOOLEAN+"( "i" int, "b" bool, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN+');
--Testcase 05:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE text;
--Testcase 06:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (3, TRUE);
--Testcase 07:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (4, FALSE);
--Testcase 08:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (5, true);
--Testcase 09:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (6, false);
--Testcase 10:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (7, 'Yes');
--Testcase 11:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (8, 'YeS');
--Testcase 12:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (9, 'yes');
--Testcase 13:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (10, 'no');
--Testcase 14:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (11, 'No');
--Testcase 15:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (12, 'nO');
--Testcase 16:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (13, 'off');
--Testcase 17:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (14, 'oFf');
--Testcase 18:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (15, 'on');
--Testcase 19:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (16, 'ON');
--Testcase 20:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (17, 't');
--Testcase 21:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (18, 'T');
--Testcase 22:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (19, 'Y');
--Testcase 23:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (20, 'y');
--Testcase 24:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (21, 'F');
--Testcase 25:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (22, 'f');
--Testcase 26:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (23, 'x');
--Testcase 27:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (24, '0');
--Testcase 28:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (25, '1');
--Testcase 29:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (26, NULL);
--Testcase 30:
SELECT * FROM "type_BOOLEAN";
--Testcase 31:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 32:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN";
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN+";
--Testcase 34: ERR - invalid text affinity because not ISO:SQL text input
SELECT * FROM "type_BOOLEAN+";
--Testcase 35
DELETE FROM "type_BOOLEAN" WHERE i = 23;
--Testcase 36:
SELECT * FROM "type_BOOLEAN+";
--Testcase 37:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NULL;
--Testcase 38:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NOT NULL;
--Testcase 39:
SELECT * FROM "type_BOOLEAN+" WHERE b;
--Testcase 40:
SELECT * FROM "type_BOOLEAN+" WHERE NOT b;
--Testcase 41:
CREATE FOREIGN TABLE "type_BOOLEANpk" (col bool OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 42:
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 43:
INSERT INTO "type_BOOLEANpk" VALUES (FALSE);
--Testcase 44: ERR - primary key
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 45:
DELETE FROM "type_BOOLEANpk";
--Testcase 46:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE float8;
--Testcase 47:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (27, 3.14159265358979);
--Testcase 48:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 49: ERR - invalid float for bool column
SELECT * FROM "type_BOOLEAN+";
--Testcase 50
DELETE FROM "type_BOOLEAN" WHERE i = 27;
--Testcase 51:
SELECT * FROM "type_BOOLEAN+";
--Testcase 52:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE b;
--Testcase 53:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE NOT b;
--Testcase 54:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE b;
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE NOT b;
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 57:
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 58:
CREATE FOREIGN TABLE "type_BOOLEAN_oper"( "i" int OPTIONS (key 'true'), i1 smallint, b1 boolean, i2 smallint, b2 boolean) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN_oper');
--Testcase 59: see INIT.SQL with mixed affinity boolean data
SELECT * FROM "type_BOOLEAN_oper";
--Testcase 60:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 61:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 62:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 63:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 64:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 65:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 66:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 67:
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 68:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 69:
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 70:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 71:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 72:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 73:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 74:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 75:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b2;
--Testcase 76:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 77:
DELETE FROM "type_BOOLEAN_oper" WHERE b2;
--Testcase 78:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 79:
DELETE FROM "type_BOOLEAN";
--Testcase 003:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/float4.sql
================================================
--
-- FLOAT4
--
--Testcase 46:
CREATE EXTENSION sqlite_fdw;
--Testcase 47:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 48:
CREATE FOREIGN TABLE FLOAT4_TBL(f1 float4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 49:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0');
--Testcase 2:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 ');
--Testcase 4:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20');
--Testcase 5:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20');
-- test for over and under flow
--Testcase 6:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70');
--Testcase 7:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
--Testcase 8:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
--Testcase 9:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
--Testcase 50:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8);
--Testcase 51:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8);
--Testcase 52:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8);
--Testcase 53:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8);
--Testcase 54:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
--Testcase 55:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
--Testcase 56:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
--Testcase 57:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
-- bad input
--Testcase 10:
INSERT INTO FLOAT4_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
--Testcase 17:
INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
-- special inputs
--Testcase 18:
DELETE FROM FLOAT4_TMP;
--Testcase 58:
INSERT INTO FLOAT4_TMP VALUES ('NaN'::float4);
--Testcase 59:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 20:
DELETE FROM FLOAT4_TMP;
--Testcase 60:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4);
--Testcase 61:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 21:
DELETE FROM FLOAT4_TMP;
--Testcase 62:
INSERT INTO FLOAT4_TMP VALUES (' NAN '::float4);
--Testcase 63:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 22:
DELETE FROM FLOAT4_TMP;
--Testcase 64:
INSERT INTO FLOAT4_TMP VALUES ('infinity'::float4);
--Testcase 65:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 23:
DELETE FROM FLOAT4_TMP;
--Testcase 66:
INSERT INTO FLOAT4_TMP VALUES (' -INFINiTY '::float4);
--Testcase 67:
SELECT f1 FROM FLOAT4_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT4_TMP;
--Testcase 68:
INSERT INTO FLOAT4_TMP VALUES ('N A N'::float4);
--Testcase 69:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 26:
DELETE FROM FLOAT4_TMP;
--Testcase 70:
INSERT INTO FLOAT4_TMP VALUES ('NaN x'::float4);
--Testcase 71:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 27:
DELETE FROM FLOAT4_TMP;
--Testcase 72:
INSERT INTO FLOAT4_TMP VALUES (' INFINITY x'::float4);
--Testcase 73:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 28:
DELETE FROM FLOAT4_TMP;
--Testcase 74:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 + 100.0);
--Testcase 75:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 30:
DELETE FROM FLOAT4_TMP;
--Testcase 76:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 / 'Infinity'::float4);
--Testcase 77:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 185:
DELETE FROM FLOAT4_TMP;
--Testcase 186:
INSERT INTO FLOAT4_TMP VALUES ('42'::float4 / 'Infinity'::float4);
--Testcase 187:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 31:
DELETE FROM FLOAT4_TMP;
--Testcase 78:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / 'nan'::float4);
--Testcase 79:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 188:
DELETE FROM FLOAT4_TMP;
--Testcase 189:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / '0'::float4);
--Testcase 190:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 32:
DELETE FROM FLOAT4_TMP;
--Testcase 80:
INSERT INTO FLOAT4_TMP VALUES ('nan'::numeric::float4);
--Testcase 81:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 34:
SELECT * FROM FLOAT4_TBL;
--SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3';
--SELECT '' AS one, f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3';
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1;
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3';
--Testcase 35:
SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1;
--Testcase 36:
SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3';
--Testcase 37:
SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 38:
SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 39:
SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 40:
SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
-- test divide by zero
--Testcase 41:
SELECT f.f1 / '0.0' from FLOAT4_TBL f;
--Testcase 42:
SELECT * FROM FLOAT4_TBL;
-- test the unary float4abs operator
--Testcase 43:
SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f;
--Testcase 44:
UPDATE FLOAT4_TBL
SET f1 = FLOAT4_TBL.f1 * '-1'
WHERE FLOAT4_TBL.f1 > '0.0';
--Testcase 45:
SELECT * FROM FLOAT4_TBL;
-- test edge-case coercions to integer
--Testcase 82:
DELETE FROM FLOAT4_TMP;
--Testcase 83:
INSERT INTO FLOAT4_TMP VALUES ('32767.4'::float4);
--Testcase 84:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 85:
DELETE FROM FLOAT4_TMP;
--Testcase 86:
INSERT INTO FLOAT4_TMP VALUES ('32767.6'::float4);
--Testcase 87:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 88:
DELETE FROM FLOAT4_TMP;
--Testcase 89:
INSERT INTO FLOAT4_TMP VALUES ('-32768.4'::float4);
--Testcase 90:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 91:
DELETE FROM FLOAT4_TMP;
--Testcase 92:
INSERT INTO FLOAT4_TMP VALUES ('-32768.6'::float4);
--Testcase 93:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 94:
DELETE FROM FLOAT4_TMP;
--Testcase 95:
INSERT INTO FLOAT4_TMP VALUES ('2147483520'::float4);
--Testcase 96:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 97:
DELETE FROM FLOAT4_TMP;
--Testcase 98:
INSERT INTO FLOAT4_TMP VALUES ('2147483647'::float4);
--Testcase 99:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 100:
DELETE FROM FLOAT4_TMP;
--Testcase 101:
INSERT INTO FLOAT4_TMP VALUES ('-2147483648.5'::float4);
--Testcase 102:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 103:
DELETE FROM FLOAT4_TMP;
--Testcase 104:
INSERT INTO FLOAT4_TMP VALUES ('-2147483900'::float4);
--Testcase 105:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 106:
DELETE FROM FLOAT4_TMP;
--Testcase 107:
INSERT INTO FLOAT4_TMP VALUES ('9223369837831520256'::float4);
--Testcase 108:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 109:
DELETE FROM FLOAT4_TMP;
--Testcase 110:
INSERT INTO FLOAT4_TMP VALUES ('9223372036854775807'::float4);
--Testcase 111:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 112:
DELETE FROM FLOAT4_TMP;
--Testcase 113:
INSERT INTO FLOAT4_TMP VALUES ('-9223372036854775808.5'::float4);
--Testcase 114:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 115:
DELETE FROM FLOAT4_TMP;
--Testcase 116:
INSERT INTO FLOAT4_TMP VALUES ('-9223380000000000000'::float4);
--Testcase 117:
SELECT f1::int8 FROM FLOAT4_TMP;
-- Test for correct input rounding in edge cases.
-- These lists are from Paxson 1991, excluding subnormals and
-- inputs of over 9 sig. digits.
--Testcase 118:
DELETE FROM FLOAT4_TMP;
--Testcase 119:
INSERT INTO FLOAT4_TMP VALUES ('5e-20'::float4);
--Testcase 120:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 121:
DELETE FROM FLOAT4_TMP;
--Testcase 122:
INSERT INTO FLOAT4_TMP VALUES ('67e14'::float4);
--Testcase 123:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 124:
DELETE FROM FLOAT4_TMP;
--Testcase 125:
INSERT INTO FLOAT4_TMP VALUES ('985e15'::float4);
--Testcase 126:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 127:
DELETE FROM FLOAT4_TMP;
--Testcase 128:
INSERT INTO FLOAT4_TMP VALUES ('55895e-16'::float4);
--Testcase 129:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 130:
DELETE FROM FLOAT4_TMP;
--Testcase 131:
INSERT INTO FLOAT4_TMP VALUES ('7038531e-32'::float4);
--Testcase 132:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 133:
DELETE FROM FLOAT4_TMP;
--Testcase 134:
INSERT INTO FLOAT4_TMP VALUES ('702990899e-20'::float4);
--Testcase 135:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 136:
DELETE FROM FLOAT4_TMP;
--Testcase 137:
INSERT INTO FLOAT4_TMP VALUES ('3e-23'::float4);
--Testcase 138:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 139:
DELETE FROM FLOAT4_TMP;
--Testcase 140:
INSERT INTO FLOAT4_TMP VALUES ('57e18'::float4);
--Testcase 141:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 142:
DELETE FROM FLOAT4_TMP;
--Testcase 143:
INSERT INTO FLOAT4_TMP VALUES ('789e-35'::float4);
--Testcase 144:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 145:
DELETE FROM FLOAT4_TMP;
--Testcase 146:
INSERT INTO FLOAT4_TMP VALUES ('2539e-18'::float4);
--Testcase 147:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 148:
DELETE FROM FLOAT4_TMP;
--Testcase 149:
INSERT INTO FLOAT4_TMP VALUES ('76173e28'::float4);
--Testcase 150:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 151:
DELETE FROM FLOAT4_TMP;
--Testcase 152:
INSERT INTO FLOAT4_TMP VALUES ('887745e-11'::float4);
--Testcase 153:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 154:
DELETE FROM FLOAT4_TMP;
--Testcase 155:
INSERT INTO FLOAT4_TMP VALUES ('5382571e-37'::float4);
--Testcase 156:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 157:
DELETE FROM FLOAT4_TMP;
--Testcase 158:
INSERT INTO FLOAT4_TMP VALUES ('82381273e-35'::float4);
--Testcase 159:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 160:
DELETE FROM FLOAT4_TMP;
--Testcase 161:
INSERT INTO FLOAT4_TMP VALUES ('750486563e-38'::float4);
--Testcase 162:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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...
--Testcase 163:
DELETE FROM FLOAT4_TMP;
--Testcase 164:
INSERT INTO FLOAT4_TMP VALUES ('1.17549435e-38'::float4);
--Testcase 165:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 166:
DELETE FROM FLOAT4_TMP;
--Testcase 167:
INSERT INTO FLOAT4_TMP VALUES('1.1754944e-38'::float4);
--Testcase 168:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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).
--Testcase 169:
create type xfloat4;
--Testcase 170:
create function xfloat4in(cstring) returns xfloat4 immutable strict
language internal as 'int4in';
--Testcase 171:
create function xfloat4out(xfloat4) returns cstring immutable strict
language internal as 'int4out';
--Testcase 172:
create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4);
--Testcase 173:
create cast (xfloat4 as float4) without function;
--Testcase 174:
create cast (float4 as xfloat4) without function;
--Testcase 175:
create cast (xfloat4 as integer) without function;
--Testcase 176:
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.
--Testcase 177:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 178:
insert into testdata(bits) 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');
--Testcase 179:
select float4send(flt) as ibits,
flt
from (select bits::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
begin;
--Testcase 180:
insert into testdata(bits) 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');
--Testcase 181:
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::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 182:
drop type xfloat4 cascade;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/float8.sql
================================================
--
-- FLOAT8
--
--Testcase 113:
CREATE EXTENSION sqlite_fdw;
--Testcase 114:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 115:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 116:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 2:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 4:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 5:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- test for underflow and overflow handling
--Testcase 6:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e400'::float8);
--Testcase 7:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e400'::float8);
--Testcase 8:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e-400'::float8);
--Testcase 9:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e-400'::float8);
-- test smallest normalized input
--Testcase 117:
INSERT INTO FLOAT8_TMP(f1) VALUES ('2.2250738585072014E-308'::float8);
--Testcase 118:
SELECT float8send(f1) FROM FLOAT8_TMP;
-- bad input
--Testcase 10:
INSERT INTO FLOAT8_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
--Testcase 17:
INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
-- special inputs
--Testcase 19:
DELETE FROM FLOAT8_TMP;
--Testcase 119:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8);
--Testcase 120:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 20:
DELETE FROM FLOAT8_TMP;
--Testcase 121:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8);
--Testcase 122:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 21:
DELETE FROM FLOAT8_TMP;
--Testcase 123:
INSERT INTO FLOAT8_TMP VALUES (' NAN '::float8);
--Testcase 124:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 22:
DELETE FROM FLOAT8_TMP;
--Testcase 125:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8);
--Testcase 126:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 23:
DELETE FROM FLOAT8_TMP;
--Testcase 127:
INSERT INTO FLOAT8_TMP VALUES (' -INFINiTY '::float8);
--Testcase 128:
SELECT f1 FROM FLOAT8_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT8_TMP;
--Testcase 129:
INSERT INTO FLOAT8_TMP VALUES ('N A N'::float8);
--Testcase 130:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 26:
DELETE FROM FLOAT8_TMP;
--Testcase 131:
INSERT INTO FLOAT8_TMP VALUES ('NaN x'::float8);
--Testcase 132:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 27:
DELETE FROM FLOAT8_TMP;
--Testcase 133:
INSERT INTO FLOAT8_TMP VALUES (' INFINITY x'::float8);
--Testcase 134:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 28:
DELETE FROM FLOAT8_TMP;
--Testcase 135:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 + 100.0);
--Testcase 136:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 30:
DELETE FROM FLOAT8_TMP;
--Testcase 137:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 / 'Infinity'::float8);
--Testcase 138:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 272:
DELETE FROM FLOAT8_TMP;
--Testcase 273:
INSERT INTO FLOAT8_TMP VALUES ('42'::float8 / 'Infinity'::float8);
--Testcase 274:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 31:
DELETE FROM FLOAT8_TMP;
--Testcase 139:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / 'nan'::float8);
--Testcase 140:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 275:
DELETE FROM FLOAT8_TMP;
--Testcase 276:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / '0'::float8);
--Testcase 277:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 32:
DELETE FROM FLOAT8_TMP;
--Testcase 141:
INSERT INTO FLOAT8_TMP VALUES ('nan'::numeric::float8);
--Testcase 142:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 34:
SELECT * FROM FLOAT8_TBL;
--Testcase 35:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
--Testcase 36:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
--Testcase 37:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
--Testcase 38:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
--Testcase 39:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
--Testcase 40:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
--Testcase 41:
SELECT f.f1, f.f1 * '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 42:
SELECT f.f1, f.f1 + '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 43:
SELECT f.f1, f.f1 / '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 44:
SELECT f.f1, f.f1 - '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 45:
SELECT f.f1 ^ '2.0' AS square_f1
FROM FLOAT8_TBL f where f.f1 = '1004.3';
-- absolute value
--Testcase 46:
SELECT f.f1, @f.f1 AS abs_f1
FROM FLOAT8_TBL f;
-- truncate
--Testcase 47:
SELECT f.f1, trunc(f.f1) AS trunc_f1
FROM FLOAT8_TBL f;
-- round
--Testcase 48:
SELECT f.f1, round(f.f1) AS round_f1
FROM FLOAT8_TBL f;
-- ceil / ceiling
--Testcase 49:
select ceil(f1) as ceil_f1 from float8_tbl f;
--Testcase 50:
select ceiling(f1) as ceiling_f1 from float8_tbl f;
-- floor
--Testcase 51:
select floor(f1) as floor_f1 from float8_tbl f;
-- sign
--Testcase 52:
select sign(f1) as sign_f1 from float8_tbl f;
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 278:
SET extra_float_digits = 0;
-- square root
BEGIN;
--Testcase 53:
DELETE FROM FLOAT8_TBL;
--Testcase 54:
INSERT INTO FLOAT8_TBL VALUES ('64'::float8);
--Testcase 55:
SELECT sqrt(f1) as eight FROM FLOAT8_TBL;
--Testcase 56:
SELECT |/f1 as eight FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 57:
SELECT f.f1, |/f.f1 AS sqrt_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
-- power
--Testcase 58:
DELETE FROM FLOAT8_TMP;
--Testcase 143:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, '0.5'::float8);
--Testcase 144:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 60:
DELETE FROM FLOAT8_TMP;
--Testcase 145:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, '0.5'::float8);
--Testcase 146:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 61:
DELETE FROM FLOAT8_TMP;
--Testcase 147:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, 'NaN'::float8);
--Testcase 148:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 62:
DELETE FROM FLOAT8_TMP;
--Testcase 149:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, 'NaN'::float8);
--Testcase 150:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 63:
DELETE FROM FLOAT8_TMP;
--Testcase 151:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'NaN'::float8);
--Testcase 152:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 64:
DELETE FROM FLOAT8_TMP;
--Testcase 153:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'NaN'::float8);
--Testcase 154:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 65:
DELETE FROM FLOAT8_TMP;
--Testcase 155:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8 , '0'::float8);
--Testcase 156:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 279:
DELETE FROM FLOAT8_TMP;
--Testcase 280:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '0'::float8);
--Testcase 281:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 282:
DELETE FROM FLOAT8_TMP;
--Testcase 283:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '0'::float8);
--Testcase 284:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 285:
DELETE FROM FLOAT8_TMP;
--Testcase 286:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, 'infinity'::float8);
--Testcase 287:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 288:
DELETE FROM FLOAT8_TMP;
--Testcase 289:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, '-infinity'::float8);
--Testcase 290:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 291:
DELETE FROM FLOAT8_TMP;
--Testcase 292:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'infinity'::float8);
--Testcase 293:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 294:
DELETE FROM FLOAT8_TMP;
--Testcase 295:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, '-infinity'::float8);
--Testcase 296:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 297:
DELETE FROM FLOAT8_TMP;
--Testcase 298:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'infinity'::float8);
--Testcase 299:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 300:
DELETE FROM FLOAT8_TMP;
--Testcase 301:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, '-infinity'::float8);
--Testcase 302:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 303:
DELETE FROM FLOAT8_TMP;
--Testcase 304:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, 'infinity'::float8);
--Testcase 305:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 306:
DELETE FROM FLOAT8_TMP;
--Testcase 307:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, 'infinity'::float8);
--Testcase 308:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 309:
DELETE FROM FLOAT8_TMP;
--Testcase 310:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, 'infinity'::float8);
--Testcase 311:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 312:
DELETE FROM FLOAT8_TMP;
--Testcase 313:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, 'infinity'::float8);
--Testcase 314:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 315:
DELETE FROM FLOAT8_TMP;
--Testcase 316:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, '-infinity'::float8);
--Testcase 317:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 318:
DELETE FROM FLOAT8_TMP;
--Testcase 319:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, '-infinity'::float8);
--Testcase 320:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 321:
DELETE FROM FLOAT8_TMP;
--Testcase 322:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, '-infinity'::float8);
--Testcase 323:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 324:
DELETE FROM FLOAT8_TMP;
--Testcase 325:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, '-infinity'::float8);
--Testcase 326:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 327:
DELETE FROM FLOAT8_TMP;
--Testcase 328:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-2'::float8);
--Testcase 329:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 330:
DELETE FROM FLOAT8_TMP;
--Testcase 331:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '2'::float8);
--Testcase 332:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 333:
DELETE FROM FLOAT8_TMP;
--Testcase 334:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, 'infinity'::float8);
--Testcase 335:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 336:
DELETE FROM FLOAT8_TMP;
--Testcase 337:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-infinity'::float8);
--Testcase 338:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- 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".
--Testcase 339:
DELETE FROM FLOAT8_TMP;
--Testcase 340:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-2'::float8);
--Testcase 341:
SELECT power(f1, f2) = '0' FROM FLOAT8_TMP;
--Testcase 342:
DELETE FROM FLOAT8_TMP;
--Testcase 343:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3'::float8);
--Testcase 344:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 345:
DELETE FROM FLOAT8_TMP;
--Testcase 346:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '2'::float8);
--Testcase 347:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 348:
DELETE FROM FLOAT8_TMP;
--Testcase 349:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '3'::float8);
--Testcase 350:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 351:
DELETE FROM FLOAT8_TMP;
--Testcase 352:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3.5'::float8);
--Testcase 353:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 354:
DELETE FROM FLOAT8_TMP;
--Testcase 355:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, 'infinity'::float8);
--Testcase 356:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 357:
DELETE FROM FLOAT8_TMP;
--Testcase 358:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-infinity'::float8);
--Testcase 359:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- take exp of ln(f.f1)
--Testcase 67:
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
--Testcase 360:
DELETE FROM FLOAT8_TMP;
--Testcase 361:
INSERT INTO FLOAT8_TMP VALUES ('inf'::float8), ('-inf'::float8), ('nan'::float8);
--Testcase 362:
SELECT exp(f1) FROM FLOAT8_TMP;
-- cube root
BEGIN;
--Testcase 68:
DELETE FROM FLOAT8_TBL;
--Testcase 69:
INSERT INTO FLOAT8_TBL VALUES ('27'::float8);
--Testcase 70:
SELECT ||/f1 as three FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 71:
SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
--Testcase 72:
SELECT * FROM FLOAT8_TBL;
--Testcase 73:
UPDATE FLOAT8_TBL
SET f1 = FLOAT8_TBL.f1 * '-1'
WHERE FLOAT8_TBL.f1 > '0.0';
--Testcase 74:
SELECT f.f1 * '1e200' from FLOAT8_TBL f;
--Testcase 75:
SELECT f.f1 ^ '1e200' from FLOAT8_TBL f;
BEGIN;
--Testcase 76:
DELETE FROM FLOAT8_TBL;
--Testcase 77:
INSERT INTO FLOAT8_TBL VALUES (0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5);
--Testcase 78:
SELECT * FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 79:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
--Testcase 80:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
--Testcase 81:
SELECT exp(f.f1) from FLOAT8_TBL f;
--Testcase 82:
SELECT f.f1 / '0.0' from FLOAT8_TBL f;
--Testcase 83:
SELECT * 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.
--Testcase 157:
DELETE FROM FLOAT8_TMP;
--Testcase 158:
INSERT INTO FLOAT8_TMP(f1) VALUES (1);
--Testcase 159:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 160:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 161:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 162:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 163:
DELETE FROM FLOAT8_TMP;
--Testcase 164:
INSERT INTO FLOAT8_TMP(f1) VALUES (2);
--Testcase 165:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 166:
DELETE FROM FLOAT8_TMP;
--Testcase 167:
INSERT INTO FLOAT8_TMP(f1) VALUES (0.5);
--Testcase 168:
SELECT atanh(f1) FROM FLOAT8_TMP;
-- test Inf/NaN cases for hyperbolic functions
--Testcase 169:
DELETE FROM FLOAT8_TMP;
--Testcase 170:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 171:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 172:
DELETE FROM FLOAT8_TMP;
--Testcase 173:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 174:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 175:
DELETE FROM FLOAT8_TMP;
--Testcase 176:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 177:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 178:
DELETE FROM FLOAT8_TMP;
--Testcase 179:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 180:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 181:
DELETE FROM FLOAT8_TMP;
--Testcase 182:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 183:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 184:
DELETE FROM FLOAT8_TMP;
--Testcase 185:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 186:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 187:
DELETE FROM FLOAT8_TMP;
--Testcase 188:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 189:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 190:
DELETE FROM FLOAT8_TMP;
--Testcase 191:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 192:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 193:
DELETE FROM FLOAT8_TMP;
--Testcase 194:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 195:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 196:
DELETE FROM FLOAT8_TMP;
--Testcase 197:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 198:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 199:
DELETE FROM FLOAT8_TMP;
--Testcase 200:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 201:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 202:
DELETE FROM FLOAT8_TMP;
--Testcase 203:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 204:
SELECT asinh(f1) FROM FLOAT8_TMP;
-- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test
-- SELECT acosh(float8 'infinity');
--Testcase 205:
DELETE FROM FLOAT8_TMP;
--Testcase 206:
INSERT INTO FLOAT8_TMP VALUES (float8 '-infinity');
--Testcase 207:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 208:
DELETE FROM FLOAT8_TMP;
--Testcase 209:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 210:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 211:
DELETE FROM FLOAT8_TMP;
--Testcase 212:
INSERT INTO FLOAT8_TMP VALUES ((float8 'infinity'));
--Testcase 213:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 214:
DELETE FROM FLOAT8_TMP;
--Testcase 215:
INSERT INTO FLOAT8_TMP VALUES ((float8 '-infinity'));
--Testcase 216:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 217:
DELETE FROM FLOAT8_TMP;
--Testcase 218:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 219:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 369:
RESET extra_float_digits;
-- test for over- and underflow
--Testcase 84:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
--Testcase 85:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
--Testcase 86:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
--Testcase 87:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
-- maintain external table consistency across platforms
-- delete all values and reinsert well-behaved ones
--Testcase 88:
DELETE FROM FLOAT8_TBL;
--Testcase 89:
INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
--Testcase 90:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
--Testcase 91:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
--Testcase 92:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
--Testcase 93:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
--Testcase 94:
SELECT * FROM FLOAT8_TBL;
-- test edge-case coercions to integer
--Testcase 220:
DELETE FROM FLOAT8_TMP;
--Testcase 221:
INSERT INTO FLOAT8_TMP VALUES ('32767.4'::float8);
--Testcase 222:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 223:
DELETE FROM FLOAT8_TMP;
--Testcase 224:
INSERT INTO FLOAT8_TMP VALUES ('32767.6'::float8);
--Testcase 225:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 226:
DELETE FROM FLOAT8_TMP;
--Testcase 227:
INSERT INTO FLOAT8_TMP VALUES ('-32768.4'::float8);
--Testcase 228:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 229:
DELETE FROM FLOAT8_TMP;
--Testcase 230:
INSERT INTO FLOAT8_TMP VALUES ('-32768.6'::float8);
--Testcase 231:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 232:
DELETE FROM FLOAT8_TMP;
--Testcase 233:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.4'::float8);
--Testcase 234:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 235:
DELETE FROM FLOAT8_TMP;
--Testcase 236:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.6'::float8);
--Testcase 237:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 238:
DELETE FROM FLOAT8_TMP;
--Testcase 239:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.4'::float8);
--Testcase 240:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 241:
DELETE FROM FLOAT8_TMP;
--Testcase 242:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.6'::float8);
--Testcase 243:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 244:
DELETE FROM FLOAT8_TMP;
--Testcase 245:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854773760'::float8);
--Testcase 246:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 247:
DELETE FROM FLOAT8_TMP;
--Testcase 248:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854775807'::float8);
--Testcase 249:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 250:
DELETE FROM FLOAT8_TMP;
--Testcase 251:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854775808.5'::float8);
--Testcase 252:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 253:
DELETE FROM FLOAT8_TMP;
--Testcase 254:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854780000'::float8);
--Testcase 255:
SELECT f1::int8 FROM FLOAT8_TMP;
-- test exact cases for trigonometric functions in degrees
BEGIN;
--Testcase 95:
DELETE FROM FLOAT8_TBL;
--Testcase 96:
INSERT INTO FLOAT8_TBL VALUES (0), (30), (90), (150), (180),
(210), (270), (330), (360);
--Testcase 97:
SELECT f1,
sind(f1),
sind(f1) IN (-1,-0.5,0,0.5,1) AS sind_exact
FROM FLOAT8_TBL;
--Testcase 98:
DELETE FROM FLOAT8_TBL;
--Testcase 99:
INSERT INTO FLOAT8_TBL VALUES (0), (60), (90), (120), (180),
(240), (270), (300), (360);
--Testcase 100:
SELECT f1,
cosd(f1),
cosd(f1) IN (-1,-0.5,0,0.5,1) AS cosd_exact
FROM FLOAT8_TBL;
--Testcase 101:
DELETE FROM FLOAT8_TBL;
--Testcase 102:
INSERT INTO FLOAT8_TBL VALUES (0), (45), (90), (135), (180),
(225), (270), (315), (360);
--Testcase 103:
SELECT f1,
tand(f1),
tand(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS tand_exact,
cotd(f1),
cotd(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS cotd_exact
FROM FLOAT8_TBL;
--Testcase 104:
DELETE FROM FLOAT8_TBL;
--Testcase 105:
INSERT INTO FLOAT8_TBL VALUES (-1), (-0.5), (0), (0.5), (1);
--Testcase 106:
SELECT f1,
asind(f1),
asind(f1) IN (-90,-30,0,30,90) AS asind_exact,
acosd(f1),
acosd(f1) IN (0,60,90,120,180) AS acosd_exact
FROM FLOAT8_TBL;
--Testcase 107:
DELETE FROM FLOAT8_TBL;
--Testcase 108:
INSERT INTO FLOAT8_TBL VALUES ('-Infinity'::float8), (-1), (0), (1),
('Infinity'::float8);
--Testcase 109:
SELECT f1,
atand(f1),
atand(f1) IN (-90,-45,0,45,90) AS atand_exact
FROM FLOAT8_TBL;
--Testcase 110:
DELETE FROM FLOAT8_TBL;
--Testcase 111:
INSERT INTO FLOAT8_TBL SELECT * FROM generate_series(0, 360, 90);
--Testcase 112:
SELECT x, y,
atan2d(y, x),
atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact
FROM (SELECT 10*cosd(f1), 10*sind(f1)
FROM FLOAT8_TBL) AS t(x,y);
ROLLBACK;
--
-- 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).
--Testcase 256:
create type xfloat8;
--Testcase 257:
create function xfloat8in(cstring) returns xfloat8 immutable strict
language internal as 'int8in';
--Testcase 258:
create function xfloat8out(xfloat8) returns cstring immutable strict
language internal as 'int8out';
--Testcase 259:
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
--Testcase 260:
create cast (xfloat8 as float8) without function;
--Testcase 261:
create cast (float8 as xfloat8) without function;
--Testcase 262:
create cast (xfloat8 as bigint) without function;
--Testcase 263:
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.
--Testcase 264:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 265:
insert into testdata(bits) 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');
--Testcase 266:
select float8send(flt) as ibits,
flt
from (select bits::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- round-trip tests
begin;
--Testcase 267:
insert into testdata(bits) 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');
--Testcase 268:
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::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 269:
drop type xfloat8 cascade;
--Testcase 363:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/int4.sql
================================================
--
-- INT4 Based on PostgreSQL tests, please don't add additional tests here, use other test files
--
--Testcase 61:
CREATE EXTENSION sqlite_fdw;
--Testcase 62:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 63:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 64:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 2:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 3:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 4:
INSERT INTO INT4_TBL(f1) VALUES ('34.5');
-- largest and smallest values
--Testcase 5:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 6:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
-- bad input values -- should give errors
--Testcase 7:
INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
--Testcase 8:
INSERT INTO INT4_TBL(f1) VALUES ('asdf');
--Testcase 9:
INSERT INTO INT4_TBL(f1) VALUES (' ');
--Testcase 10:
INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
--Testcase 11:
INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
--Testcase 12:
INSERT INTO INT4_TBL(f1) VALUES ('123 5');
--Testcase 13:
INSERT INTO INT4_TBL(f1) VALUES ('');
--Testcase 14:
SELECT * FROM INT4_TBL;
--Testcase 15:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0';
--Testcase 16:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0';
--Testcase 17:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int2 '0';
--Testcase 18:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int4 '0';
--Testcase 19:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int2 '0';
--Testcase 20:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int4 '0';
--Testcase 21:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0';
--Testcase 22:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0';
--Testcase 23:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int2 '0';
--Testcase 24:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int4 '0';
--Testcase 25:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0';
--Testcase 26:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0';
-- positive odds
--Testcase 27:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
-- any evens
--Testcase 28:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
--Testcase 29:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i;
--Testcase 30:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 31:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i;
--Testcase 32:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 33:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i;
--Testcase 34:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 35:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i;
--Testcase 36:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 37:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i;
--Testcase 38:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 39:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i;
--Testcase 40:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 41:
SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i;
--Testcase 42:
SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i;
--
-- more complex expressions
--
-- variations on unary minus parsing
--Testcase 65:
DELETE FROM INT4_TMP;
--Testcase 66:
INSERT INTO INT4_TMP VALUES (-2, 3);
--Testcase 67:
SELECT f1 + f2 as one FROM INT4_TMP;
--Testcase 68:
DELETE FROM INT4_TMP;
--Testcase 69:
INSERT INTO INT4_TMP VALUES (4, 2);
--Testcase 70:
SELECT f1 - f2 as two FROM INT4_TMP;
--Testcase 46:
DELETE FROM INT4_TMP;
--Testcase 71:
INSERT INTO INT4_TMP VALUES (2, 1);
--Testcase 72:
SELECT f1- -f2 as three FROM INT4_TMP;
--Testcase 47:
DELETE FROM INT4_TMP;
--Testcase 73:
INSERT INTO INT4_TMP VALUES (2, 2);
--Testcase 74:
SELECT f1 - -f2 as four FROM INT4_TMP;
--Testcase 75:
DELETE FROM INT4_TMP;
--Testcase 76:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int2, '16'::int2 / '4'::int2);
--Testcase 77:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 78:
DELETE FROM INT4_TMP;
--Testcase 79:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int4, '16'::int2 / '4'::int4);
--Testcase 80:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 81:
DELETE FROM INT4_TMP;
--Testcase 82:
INSERT INTO INT4_TMP VALUES ('2'::int4 * '2'::int2, '16'::int4 / '4'::int2);
--Testcase 83:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 84:
DELETE FROM INT4_TMP;
--Testcase 85:
INSERT INTO INT4_TMP VALUES ('1000'::int4, '999'::int4);
--Testcase 86:
SELECT f1 < f2 AS false FROM INT4_TMP;
--Testcase 50:
DELETE FROM INT4_TMP;
--Testcase 91:
INSERT INTO INT4_TMP VALUES (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1);
--Testcase 92:
SELECT f1 as ten FROM INT4_TMP;
--Testcase 51:
DELETE FROM INT4_TMP;
--Testcase 93:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 94:
SELECT f1 + f1/f2 as three FROM INT4_TMP;
--Testcase 52:
DELETE FROM INT4_TMP;
--Testcase 95:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 96:
SELECT (f1 + f2)/f2 as two FROM INT4_TMP;
-- corner case
--Testcase 54:
DELETE FROM INT4_TMP;
--Testcase 97:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 98:
SELECT (f1<<31)::text FROM INT4_TMP;
--Testcase 56:
DELETE FROM INT4_TMP;
--Testcase 99:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 100:
SELECT ((f1<<31)+1)::text FROM INT4_TMP;
-- check sane handling of INT_MIN overflow cases
--Testcase 58:
DELETE FROM INT4_TMP;
--Testcase 101:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int4);
--Testcase 102:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 103:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 104:
SELECT f1 % f2 FROM INT4_TMP;
--Testcase 60:
DELETE FROM INT4_TMP;
--Testcase 105:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int2);
--Testcase 106:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 107:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 108:
SELECT f1 % f2 FROM INT4_TMP;
-- check rounding when casting from float
--Testcase 109:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 110:
DELETE FROM FLOAT8_TMP;
--Testcase 111:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 112:
SELECT f1 as x, f1::int4 as int4_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 113:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 114:
DELETE FROM NUMERIC_TMP;
--Testcase 115:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 116:
SELECT f1 as x, f1::int4 as int4_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 117:
DELETE FROM INT4_TMP;
--Testcase 118:
INSERT INTO INT4_TMP 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);
--Testcase 119:
SELECT f1, f2, gcd(f1, f2), gcd(f1, -f2), gcd(f2, f1), gcd(-f2, f1) FROM INT4_TMP;
--Testcase 120:
DELETE FROM INT4_TMP;
--Testcase 121:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 0::int4);
--Testcase 122:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 123:
DELETE FROM INT4_TMP;
--Testcase 124:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-2147483648)::int4);
--Testcase 125:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
-- test lcm()
--Testcase 126:
DELETE FROM INT4_TMP;
--Testcase 127:
INSERT INTO INT4_TMP 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);
--Testcase 128:
SELECT f1, f2, lcm(f1, f2), lcm(f1, -f2), lcm(f2, f1), lcm(-f2, f1) FROM INT4_TMP;
--Testcase 129:
DELETE FROM INT4_TMP;
--Testcase 130:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 1::int4);
--Testcase 131:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 132:
DELETE FROM INT4_TMP;
--Testcase 133:
INSERT INTO INT4_TMP VALUES (2147483647::int4, 2147483646::int4);
--Testcase 134:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 137:
DELETE FROM INT4_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 135:
DROP SERVER sqlite_svr;
--Testcase 136:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/int8.sql
================================================
--
-- INT8
-- Test int8 64-bit integers.
--
--Testcase 140:
CREATE EXTENSION sqlite_fdw;
--Testcase 141:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 142:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 143:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 2:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 3:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 4:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 5:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
-- bad inputs
--Testcase 6:
INSERT INTO INT8_TBL(q1) VALUES (' ');
--Testcase 7:
INSERT INTO INT8_TBL(q1) VALUES ('xxx');
--Testcase 8:
INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485');
--Testcase 9:
INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934');
--Testcase 10:
INSERT INTO INT8_TBL(q1) VALUES ('- 123');
--Testcase 11:
INSERT INTO INT8_TBL(q1) VALUES (' 345 5');
--Testcase 12:
INSERT INTO INT8_TBL(q1) VALUES ('');
--Testcase 13:
SELECT * FROM INT8_TBL;
-- int8/int8 cmp
--Testcase 14:
SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
--Testcase 15:
SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
--Testcase 16:
SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
--Testcase 17:
SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
--Testcase 18:
SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
--Testcase 19:
SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
-- int8/int4 cmp
--Testcase 20:
SELECT * FROM INT8_TBL WHERE q2 = 456;
--Testcase 21:
SELECT * FROM INT8_TBL WHERE q2 <> 456;
--Testcase 22:
SELECT * FROM INT8_TBL WHERE q2 < 456;
--Testcase 23:
SELECT * FROM INT8_TBL WHERE q2 > 456;
--Testcase 24:
SELECT * FROM INT8_TBL WHERE q2 <= 456;
--Testcase 25:
SELECT * FROM INT8_TBL WHERE q2 >= 456;
-- int4/int8 cmp
--Testcase 26:
SELECT * FROM INT8_TBL WHERE 123 = q1;
--Testcase 27:
SELECT * FROM INT8_TBL WHERE 123 <> q1;
--Testcase 28:
SELECT * FROM INT8_TBL WHERE 123 < q1;
--Testcase 29:
SELECT * FROM INT8_TBL WHERE 123 > q1;
--Testcase 30:
SELECT * FROM INT8_TBL WHERE 123 <= q1;
--Testcase 31:
SELECT * FROM INT8_TBL WHERE 123 >= q1;
-- int8/int2 cmp
--Testcase 32:
SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
--Testcase 33:
SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
--Testcase 34:
SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
--Testcase 35:
SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
--Testcase 36:
SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
--Testcase 37:
SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
-- int2/int8 cmp
--Testcase 38:
SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
--Testcase 39:
SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
--Testcase 40:
SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
--Testcase 41:
SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
--Testcase 42:
SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
--Testcase 43:
SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
--Testcase 44:
SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL;
--Testcase 45:
SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL;
--Testcase 46:
SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL;
--Testcase 47:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
--Testcase 48:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL
WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
--Testcase 49:
SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
--Testcase 50:
SELECT q1, float8(q1) FROM INT8_TBL;
--Testcase 51:
SELECT q2, float8(q2) FROM INT8_TBL;
--Testcase 52:
SELECT 37 + q1 AS plus4 FROM INT8_TBL;
--Testcase 53:
SELECT 37 - q1 AS minus4 FROM INT8_TBL;
--Testcase 54:
SELECT 2 * q1 AS "twice int4" FROM INT8_TBL;
--Testcase 55:
SELECT q1 * 2 AS "twice int4" FROM INT8_TBL;
-- int8 op int4
--Testcase 56:
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
--Testcase 57:
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
--Testcase 58:
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
--Testcase 59:
SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
--Testcase 60:
SELECT q2, abs(q2) FROM INT8_TBL;
--Testcase 61:
SELECT min(q1), min(q2) FROM INT8_TBL;
--Testcase 62:
SELECT max(q1), max(q2) FROM INT8_TBL;
-- TO_CHAR()
--
--Testcase 63:
SELECT to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999')
FROM INT8_TBL;
--Testcase 64:
SELECT to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999')
FROM INT8_TBL;
--Testcase 65:
SELECT to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR')
FROM INT8_TBL;
--Testcase 66:
SELECT to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999')
FROM INT8_TBL;
--Testcase 67:
SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL;
--Testcase 68:
SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL;
--Testcase 69:
SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL;
--Testcase 70:
SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL;
--Testcase 71:
SELECT to_char(q2, '0999999999999999') FROM INT8_TBL;
--Testcase 72:
SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL;
--Testcase 73:
SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL;
--Testcase 74:
SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL;
--Testcase 75:
SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL;
--Testcase 76:
SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL;
--Testcase 77:
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;
--Testcase 78:
SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
--Testcase 79:
SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL;
-- check min/max values and overflow behavior
--Testcase 80:
DELETE FROM INT8_TMP;
--Testcase 144:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 145:
SELECT q1 FROM INT8_TMP;
--Testcase 81:
DELETE FROM INT8_TMP;
--Testcase 146:
INSERT INTO INT8_TMP VALUES ('-9223372036854775809'::int8);
--Testcase 147:
SELECT q1 FROM INT8_TMP;
--Testcase 82:
DELETE FROM INT8_TMP;
--Testcase 148:
INSERT INTO INT8_TMP VALUES ('9223372036854775807'::int8);
--Testcase 149:
SELECT q1 FROM INT8_TMP;
--Testcase 83:
DELETE FROM INT8_TMP;
--Testcase 150:
INSERT INTO INT8_TMP VALUES ('9223372036854775808'::int8);
--Testcase 151:
SELECT q1 FROM INT8_TMP;
--Testcase 84:
DELETE FROM INT8_TMP;
--Testcase 152:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775807'::int8));
--Testcase 153:
SELECT q1 FROM INT8_TMP;
--Testcase 86:
DELETE FROM INT8_TMP;
--Testcase 154:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775808'::int8));
--Testcase 155:
SELECT q1 FROM INT8_TMP;
--Testcase 87:
DELETE FROM INT8_TMP;
--Testcase 156:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 157:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 88:
DELETE FROM INT8_TMP;
--Testcase 158:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 159:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 89:
DELETE FROM INT8_TMP;
--Testcase 160:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 161:
SELECT q1-q2 FROM INT8_TMP;
--Testcase 90:
DELETE FROM INT8_TMP;
--Testcase 162:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 163:
SELECT q1 - q2 FROM INT8_TMP;
--Testcase 91:
DELETE FROM INT8_TMP;
--Testcase 164:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 165:
SELECT q1 * q2 FROM INT8_TMP;
--Testcase 92:
DELETE FROM INT8_TMP;
--Testcase 166:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 167:
SELECT q1 / q2 FROM INT8_TMP;
--Testcase 93:
DELETE FROM INT8_TMP;
--Testcase 168:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 169:
SELECT q1 % q2 FROM INT8_TMP;
--Testcase 94:
DELETE FROM INT8_TMP;
--Testcase 170:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 171:
SELECT abs(q1) FROM INT8_TMP;
--Testcase 95:
DELETE FROM INT8_TMP;
--Testcase 172:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 173:
SELECT q1 + q3 FROM INT8_TMP;
--Testcase 96:
DELETE FROM INT8_TMP;
--Testcase 174:
INSERT INTO INT8_TMP(q1, q3) VALUES ('-9223372036854775800'::int8 , '100'::int4);
--Testcase 175:
SELECT q1 - q3 FROM INT8_TMP;
--Testcase 97:
DELETE FROM INT8_TMP;
--Testcase 176:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 177:
SELECT q1 * q3 FROM INT8_TMP;
--Testcase 98:
DELETE FROM INT8_TMP;
--Testcase 178:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 179:
SELECT q3 + q1 FROM INT8_TMP;
--Testcase 99:
DELETE FROM INT8_TMP;
--Testcase 180:
INSERT INTO INT8_TMP(q3, q1) VALUES ('-100'::int4 , '9223372036854775800'::int8);
--Testcase 181:
SELECT q3 - q1 FROM INT8_TMP;
--Testcase 100:
DELETE FROM INT8_TMP;
--Testcase 182:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 183:
SELECT q3 * q1 FROM INT8_TMP;
--Testcase 101:
DELETE FROM INT8_TMP;
--Testcase 184:
INSERT INTO INT8_TMP(q1, q4) VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 185:
SELECT q1 + q4 FROM INT8_TMP;
--Testcase 102:
DELETE FROM INT8_TMP;
--Testcase 186:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775800'::int8 , '100'::int2);
--Testcase 187:
SELECT q1 - q4 FROM INT8_TMP;
--Testcase 103:
DELETE FROM INT8_TMP;
--Testcase 188:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 189:
SELECT q1 * q4 FROM INT8_TMP;
--Testcase 104:
DELETE FROM INT8_TMP;
--Testcase 190:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775808'::int8 , '0'::int2);
--Testcase 191:
SELECT q1 / q4 FROM INT8_TMP;
--Testcase 105:
DELETE FROM INT8_TMP;
--Testcase 192:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 193:
SELECT q4 + q1 FROM INT8_TMP;
--Testcase 106:
DELETE FROM INT8_TMP;
--Testcase 194:
INSERT INTO INT8_TMP(q4, q1) VALUES ('-100'::int2 , '9223372036854775800'::int8);
--Testcase 195:
SELECT q4 - q1 FROM INT8_TMP;
--Testcase 107:
DELETE FROM INT8_TMP;
--Testcase 196:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 197:
SELECT q4 * q1 FROM INT8_TMP;
--Testcase 108:
DELETE FROM INT8_TMP;
--Testcase 198:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '0'::int8);
--Testcase 199:
SELECT q4 / q1 FROM INT8_TMP;
--Testcase 110:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
--Testcase 111:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
--Testcase 112:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
--Testcase 113:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
--Testcase 200:
DELETE FROM INT8_TMP;
--Testcase 201:
INSERT INTO INT8_TMP(q5) VALUES ('42'), ('-37');
--Testcase 202:
SELECT CAST(q5::int2 as int8) FROM INT8_TMP;
--Testcase 114:
SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
--Testcase 203:
DELETE FROM INT8_TMP;
--Testcase 204:
INSERT INTO INT8_TMP(q5) VALUES ('36854775807.0');
--Testcase 205:
SELECT CAST(q5::float4 AS int8) FROM INT8_TMP;
--Testcase 206:
DELETE FROM INT8_TMP;
--Testcase 207:
INSERT INTO INT8_TMP(q5) VALUES ('922337203685477580700.0');
--Testcase 208:
SELECT CAST(q5::float8 AS int8) FROM INT8_TMP;
--Testcase 115:
SELECT CAST(q1 AS oid) FROM INT8_TBL;
--Testcase 209:
SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
-- bit operations
--Testcase 116:
SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
--Testcase 117:
SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
-- generate_series
--Testcase 118:
DELETE FROM INT8_TMP;
--Testcase 210:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8) q1;
--Testcase 211:
SELECT q1 FROM INT8_TMP;
--Testcase 120:
DELETE FROM INT8_TMP;
--Testcase 212:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0) q1; -- should error
--Testcase 213:
SELECT q1 FROM INT8_TMP;
--Testcase 122:
DELETE FROM INT8_TMP;
--Testcase 214:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2) q1;
--Testcase 215:
SELECT q1 FROM INT8_TMP;
-- corner case
--Testcase 216:
DELETE FROM INT8_TMP;
--Testcase 217:
INSERT INTO INT8_TMP VALUES (-1::int8<<63);
--Testcase 218:
SELECT q1::text FROM INT8_TMP;
--Testcase 219:
DELETE FROM INT8_TMP;
--Testcase 220:
INSERT INTO INT8_TMP VALUES ((-1::int8<<63)+1);
--Testcase 221:
SELECT q1::text FROM INT8_TMP;
-- check sane handling of INT64_MIN overflow cases
--Testcase 125:
DELETE FROM INT8_TMP;
--Testcase 222:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int8, 888);
--Testcase 126:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int8, 888);
--Testcase 127:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int8, 888);
--Testcase 128:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 129:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 130:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int4, 888);
--Testcase 131:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int4, 888);
--Testcase 132:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int4, 888);
--Testcase 133:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 134:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 135:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int2, 888);
--Testcase 136:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int2, 888);
--Testcase 137:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int2, 888);
--Testcase 138:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 139:
DELETE FROM INT8_TMP WHERE q2 = 888;
-- check rounding when casting from float
--Testcase 223:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 224:
DELETE FROM FLOAT8_TMP;
--Testcase 225:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 226:
SELECT f1 as x, f1::int8 as int8_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 227:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 228:
DELETE FROM NUMERIC_TMP;
--Testcase 229:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 230:
SELECT f1 as x, f1::int8 as int8_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 231:
DELETE FROM INT8_TMP;
--Testcase 232:
INSERT INTO INT8_TMP 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);
--Testcase 233:
SELECT q1, q2, gcd(q1, q2), gcd(q1, -q2), gcd(q2, q1), gcd(-q2, q1) FROM INT8_TMP;
--Testcase 234:
DELETE FROM INT8_TMP;
--Testcase 235:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 0::int8);
--Testcase 236:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 237:
DELETE FROM INT8_TMP;
--Testcase 238:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, (-9223372036854775808)::int8);
--Testcase 239:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
-- test lcm()
--Testcase 240:
DELETE FROM INT8_TMP;
--Testcase 241:
INSERT INTO INT8_TMP 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);
--Testcase 242:
SELECT q1, q2, lcm(q1, q2), lcm(q1, -q2), lcm(q2, q1), lcm(-q2, q1) FROM INT8_TMP;
--Testcase 243:
DELETE FROM INT8_TMP;
--Testcase 244:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 1::int8);
--Testcase 245:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 246:
DELETE FROM INT8_TMP;
--Testcase 247:
INSERT INTO INT8_TMP VALUES ((9223372036854775807)::int8, (9223372036854775806)::int8);
--Testcase 248:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 251:
DELETE FROM INT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 249:
DROP SERVER sqlite_svr;
--Testcase 250:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/json.sql
================================================
-- SET log_min_messages TO DEBUG3;
-- SET client_min_messages TO DEBUG3;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 010:
CREATE FOREIGN TABLE "type_JSON" (
"i" int OPTIONS (key 'true'),
"j" json,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" json
) SERVER sqlite_svr OPTIONS (table 'type_JSON');
--Testcase 011:
CREATE FOREIGN TABLE "type_JSONB" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB');
--Testcase 012:
CREATE FOREIGN TABLE "type_JSONB+" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
l int, t varchar(16), tx text,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB+');
--Testcase 013:
INSERT INTO "type_JSON" ("i", "j", ot, ot1, oi, oi1) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}],"a+u":47,"5":true,"cc3":["a", "b", "c"], "c3":[true, false]}',
'c', 'c3', 2, 1),
(2, '[11,22,33,44,55,66,77,88,99,10,11,12,13,14]',
'1', '29', 3, 1),
(3, '{"a":"xyz", "π":3.1415926535, "aπ":false }',
'a', 'π', 1, NULL),
(4, '{"a":null, "a22":22.0, "a2":2 }',
'a', '22', 4, NULL),
(5, '[9,null,7,6,5,4,3,2,1,0]',
'1', '5', -4, 5),
(6, '[0.0,1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,null,true]',
'1', '21', -2, 5);
--Testcase 014:
INSERT INTO "type_JSONB" SELECT * FROM "type_JSON";
--Testcase 015: check some SQLite JSONb initial bytes
SELECT i, tx FROM "type_JSONB+";
--Testcase 020:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 021: SQLite queries to type_JSON will be without normalization for j column
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN j OPTIONS (ADD column_type 'text');
--Testcase 022:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 023:
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 024:
SELECT "i", "j", j."j"->'a' res FROM "type_JSON" j;
--Testcase 025:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 026:
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 027:
SELECT "i", "j", j."j"->'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 028:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 029:
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 030:
SELECT "i", "j", j."j"->>'a' res FROM "type_JSON" j;
--Testcase 031:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 032:
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 033:
SELECT "i", "j", j."j"->>'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 034:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 035:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 036:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 037:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 038:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 039:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 040:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 041:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 042:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 044:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 045:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 046:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 047:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 048:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSON" j;
--Testcase 049:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 050:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 051:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSONB" j;
--Testcase 052:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 053:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 054:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSON" j;
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 056:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 057:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSONB" j;
--Testcase 058:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 059:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 060:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 061:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 062:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 063:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 064:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 065:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 066:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 067:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 068:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 069:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 071:
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 072:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 073:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 074:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 075:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 077:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 078:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 079:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 081:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 082:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 083:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 085:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 086:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 087:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 088:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 089:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 090:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 091:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 093:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 095:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 096:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 097:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 099:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
-- extraction with arithmetical an other expressions
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 101:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 103:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 105:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 107:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 109:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 111:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 113:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 115:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 117:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 119:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 120:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 121:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 123:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 125:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 127:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 129:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 131:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 133:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 135:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 137:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 139:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 141:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 143:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 144:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 145:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 146:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 147:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 148:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 149:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 151:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 153:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 155:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 157:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 159:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 161:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 163:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 165:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 167:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 169:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 171:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 172:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 173:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 174:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 175:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 176:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 177:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 178:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 179:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--TCs for SQLite JSON -> format, no sense in PostgreSQL itself
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 201:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 203:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 204:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 205:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 206:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 207:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 208:
DELETE FROM "type_JSON";
--Testcase 209:
DELETE FROM "type_JSONB";
--Testcase 210:
INSERT INTO "type_JSON" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 211:
INSERT INTO "type_JSONB" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 212:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 213:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 214:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 215:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 216:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 217:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 218:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 219:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 220:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 221:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 222:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 223:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 224:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 225:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 226:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
--Testcase 227:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
-- end of SQLite right -> ->> operand test
-- Operators -> ->> in SELECT context
--Testcase 230:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 231:
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 232:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 233:
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 234:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 235:
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 236:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 237:
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 238:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 239:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 240:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 241:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 250:
DELETE FROM "type_JSON";
--Testcase 251:
DELETE FROM "type_JSONB";
--Testcase 252:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text;
--Testcase 253:
INSERT INTO "type_JSON" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 254:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text[];
--Testcase 255:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text;
--Testcase 256:
INSERT INTO "type_JSONB" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 257:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text[];
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 261:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 262:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 263:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 265
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 267:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 269:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 270:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 271:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 272:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 273
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 274:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 275:
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 276:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 277: no such - even wrong JSON gives false
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 278:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 279:
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 280:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 281: no such - even wrong JSON gives false
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 282:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 283:
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 284:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 285: no such
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 286:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 287:
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 288:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 289: no such
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 290:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 291:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 292:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 293:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 294:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 295:
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 296:
SELECT * FROM "type_JSONB+";
--Testcase 297:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 298:
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 299:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Testcase 300: no such
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Multievel extraction chains
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 302:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 304:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 306:
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
--Testcase 308:
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
-- UPDATE tests
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 310:
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 311:
SELECT * FROM "type_JSON" WHERE "i" = 1;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 313:
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 314:
SELECT * FROM "type_JSONB+" WHERE "i" = 1;
-- Real GIS data test, data from https://www.wikidata.org/wiki/Q118122043
-- https://commons.wikimedia.org/wiki/Category:Private_Garden_(Pavlovsk)
-- License of testing data in json_osm_test table: ODbL, © OpenStreetMap contributors
--Testcase 400:
CREATE FOREIGN TABLE json_osm_test (
wkt text NOT NULL,
osm_type varchar(8) OPTIONS (key 'true') NOT NULL,
osm_id int8 OPTIONS (key 'true') NOT NULL,
t json OPTIONS (column_name 'tags') NULL,
way_nodes text NULL
) SERVER sqlite_svr;
--Testcase 401:
INSERT INTO json_osm_test VALUES ('SRID=4326;POINT(30.4536193 59.6847624)', 'node', 1198356775, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4522474 59.6851858)', 'node', 1198357028, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4532025 59.6850113)', 'node', 1738381537, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "description": "Ваза в дендрарии Собственного садика", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529584 59.6849417)', 'node', 3968068680, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526407 59.68497)', 'node', 4487385447, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "late C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4524943 59.6854502)', 'node', 4912270255, '{"fee": "yes", "access": "customers", "barrier": "gate", "vehicle": "no", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "barrier:personnel": "additional"}', NULL),
('SRID=4326;POINT(30.452977 59.6847621)', 'node', 7484858507, '{"name": "Неизвестный мужчина", "ref:okn": "781610399040516", "tourism": "artwork", "alt_name": "Спутник Одиссея", "heritage": "2", "historic": "yes", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6522/"}', NULL),
('SRID=4326;POINT(30.452909 59.6847573)', 'node', 7484858508, '{"name": "Антиной", "ref:okn": "781610399040526", "tourism": "artwork", "alt_name": "Дионис", "heritage": "2", "historic": "yes", "material": "stone", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6521/"}', NULL),
('SRID=4326;POINT(30.4529561 59.6848095)', 'node', 8114975053, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528946 59.6848042)', 'node', 8114975054, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528732 59.6848762)', 'node', 8114975055, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529364 59.6848802)', 'node', 8114975056, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528444 59.6851765)', 'node', 8289295956, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527798 59.6851726)', 'node', 8289295957, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528665 59.6850957)', 'node', 8289295958, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528046 59.685091)', 'node', 8289295959, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528947 59.6850172)', 'node', 8289295960, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528301 59.6850118)', 'node', 8289295961, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529101 59.6849636)', 'node', 8289295962, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528496 59.684959)', 'node', 8289295963, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528359 59.6852187)', 'node', 8331430659, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527605 59.685213)', 'node', 8331430660, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4523414 59.6851726)', 'node', 8331430663, '{"name": "Сатир", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4523561 59.685141)', 'node', 8331430664, '{"name": "Сатиресса", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4527994 59.6847007)', 'node', 8566916332, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4528945 59.6847497)', 'node', 8566916333, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529784 59.6853519)', 'node', 8895996426, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4529255 59.6853861)', 'node', 8895996427, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4525278 59.685471)', 'node', 8895996643, '{"genus": "Tilia", "height": "6", "natural": "tree", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4534153 59.6851412)', 'node', 8899249758, '{"genus": "Elaeagnus", "taxon": "Elaeagnus commutata", "natural": "shrub", "genus:ru": "Лох", "taxon:ru": "Лох серебристый", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4535524 59.6848638)', 'node', 8899249764, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4535202 59.6849613)', 'node', 8899249765, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534934 59.6850486)', 'node', 8899249766, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534679 59.685136)', 'node', 8899249767, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4528899 59.6851725)', 'node', 8899249768, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530448 59.6850046)', 'node', 8899249769, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4533465 59.6850216)', 'node', 8899249770, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4532205 59.6849417)', 'node', 8899249771, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531776 59.6850839)', 'node', 8899249772, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4534136 59.6851265)', 'node', 8899249773, '{"genus": "Malus", "taxon": "Malus niedzwetzkyana", "height": "5", "natural": "tree", "genus:ru": "Яблоня", "taxon:ru": "Яблоня Недзвецкого", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533043 59.6851928)', 'node', 8899249779, '{"height": "4", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.452916 59.6849894)', 'node', 8899249796, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4528248 59.684983)', 'node', 8899249797, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531527 59.685139)', 'node', 8899299127, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529549 59.6850382)', 'node', 8902082041, '{"genus": "Syrínga", "taxon": "Syringa vulgaris", "natural": "shrub", "genus:ru": "Сирень", "taxon:ru": "Сирень обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530139 59.6850101)', 'node', 8902082042, '{"genus": "Amelanchier", "taxon": "Amelanchier canadensis", "natural": "shrub", "genus:ru": "Ирга", "taxon:ru": "Ирга канадская", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530089 59.6850564)', 'node', 8902082048, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529982 59.685072)', 'node', 8902082055, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530213 59.6850872)', 'node', 8902082060, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529918 59.6851617)', 'node', 8902082061, '{"genus": "Berberis", "taxon": "Berberis vulgaris", "natural": "shrub", "genus:ru": "Барбарис", "taxon:ru": "Барбарис обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530615 59.685137)', 'node', 8902082071, '{"genus": "Paeonia", "taxon": "Paeonia suffruticosa", "natural": "shrub", "genus:ru": "Пион", "taxon:ru": "Пион древовидный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531031 59.6851282)', 'node', 8902082072, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530991 59.6851451)', 'node', 8902082073, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531977 59.6851532)', 'node', 8902082074, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453207 59.6851336)', 'node', 8902082075, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532426 59.6850926)', 'node', 8902082171, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532694 59.6851157)', 'node', 8902082172, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533707 59.6851035)', 'node', 8902082173, '{"genus": "Hydrangea", "taxon": "Hydrangea paniculata", "natural": "shrub", "genus:ru": "Гортензия", "taxon:ru": "Гортензия метельчатая"}', NULL),
('SRID=4326;POINT(30.4528986 59.6851502)', 'node', 8902082174, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4530486 59.6848994)', 'node', 8904992674, '{"genus": "Viburnum", "taxon": "Viburnum opulus", "natural": "shrub", "genus:ru": "Калина", "taxon:ru": "Калина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532396 59.6848373)', 'node', 8905335421, '{"genus": "Corylus", "taxon": "Corylus avellana", "natural": "shrub", "genus:ru": "Лещина", "taxon:ru": "Лещина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532946 59.684841)', 'node', 8905335422, '{"genus": "Spiraea", "taxon": "Spiraea chamaedryfolia", "natural": "shrub", "genus:ru": "Спирея", "taxon:ru": "Спирея дубравколистная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533857 59.6849271)', 'node', 8905335423, '{"genus": "Euonymus", "taxon": "Euonymus europaeus", "natural": "shrub", "genus:ru": "Бересклет", "taxon:ru": "Бересклет европейский", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534136 59.6849004)', 'node', 8905335424, '{"genus": "Prunus", "taxon": "Prunus sachalinensis", "height": "5", "natural": "tree", "genus:ru": "Вишня", "taxon:ru": "Вишня сахалинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533998 59.6848611)', 'node', 8905335425, '{"genus": "Buxus", "taxon": "Buxus sempervirens", "height": "1", "natural": "shrub", "genus:ru": "Самшит", "taxon:ru": "Самшит вечнозелёный", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4534776 59.6848679)', 'node', 8905335426, '{"genus": "Rhamnus", "taxon": "Rhamnus cathartica", "height": "4", "natural": "tree", "genus:ru": "Жостер", "taxon:ru": "Жостер слабительный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534324 59.6849515)', 'node', 8905335427, '{"genus": "Lonicera", "taxon": "Lonicera caerulea", "natural": "shrub", "genus:ru": "Жимолость", "taxon:ru": "Жимолость синяя", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453365 59.684981)', 'node', 8905335428, '{"genus": "Philadelphus", "taxon": "Philadelphus coronarius", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник венечный"}', NULL),
('SRID=4326;POINT(30.4533874 59.6849671)', 'node', 8905335429, '{"genus": "Juniperus", "taxon": "Juniperus sabina", "height": "0.5", "natural": "shrub", "genus:ru": "Можжевельник", "taxon:ru": "Можжевельник казацкий", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4531319 59.6849356)', 'node', 8905335430, '{"genus": "Picea", "taxon": "Picea abies", "height": "0.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель европейская", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532466 59.6848527)', 'node', 8905335431, '{"genus": "Ginkgo", "taxon": "Ginkgo biloba", "height": "2.5", "natural": "tree", "genus:ru": "Гингко", "taxon:ru": "Гинкго двулопастный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "label"}', NULL),
('SRID=4326;POINT(30.4532184 59.6848635)', 'node', 8905335468, '{"genus": "Daphne", "taxon": "Daphne mezereum", "natural": "shrub", "genus:ru": "Волчеягодник", "taxon:ru": "Волчеягодник обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532392 59.6848902)', 'node', 8905335469, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526679 59.6846912)', 'node', 8905558225, '{"height": "3", "highway": "street_lamp", "man_made": "surveillance", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530347 59.6849253)', 'node', 8906857477, '{"genus": "Philadelphus lemoinei", "taxon": "Philadelphus lemoinei", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник Лемуана", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530224 59.6849455)', 'node', 8906857478, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530015 59.6847554)', 'node', 8906857479, '{"natural": "tree_stump"}', NULL),
('SRID=4326;LINESTRING(30.4522584 59.6851734,30.4522474 59.6851858)', 'way', 103807093, '{"highway": "footway", "surface": "compacted"}', '{3968068679,1198357028}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525041 59.6846527,30.4522364 59.6845601,30.4516531 59.6843525,30.4513385 59.6842533,30.4513511 59.6841667)', 'way', 103807103, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{8566824024,12023699867,8114975022,1195141497,4014269128,3186425168}'),
('SRID=4326;LINESTRING(30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456)', 'way', 103807114, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{1198357004,303515662,8566916345,1198356771,8566916346,1198356889,1198357009,8906857470}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529382 59.6847803,30.4528051 59.6851927,30.4527793 59.6852746,30.4527609 59.6853349,30.4527422 59.6853961,30.4527263 59.6854482,30.4527224 59.6854618)', 'way', 153761053, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068681,8114975050,8114975107,8895975844,8895975845,8895975847,4912270253,1664064412}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4532459 59.6852254,30.45322 59.6852491)', 'way', 153761054, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975105,3968068669}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4528762 59.6851274,30.4530118 59.6851874)', 'way', 153947121, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381541,1665582246}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4529574 59.6848702,30.4531238 59.6848204)', 'way', 153947122, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1738381532,1665582234}'),
('SRID=4326;LINESTRING(30.4533888 59.6848413,30.4535109 59.6849058,30.4534919 59.684967)', 'way', 153947123, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582235,1738381534,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533267 59.6852228,30.4533391 59.6851996,30.4533483 59.6851876,30.4533556 59.6851828,30.4533653 59.6851769,30.4533784 59.6851717,30.4533901 59.6851678,30.4534147 59.6851629,30.4534315 59.6851615,30.4534524 59.6850941)', 'way', 153947124, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975034,8899249793,8114975035,8902027910,8899249794,8902027909,8899249795,1738381544,8114975036,1665582244}'),
('SRID=4326;LINESTRING(30.4531795 59.685129,30.4533062 59.6850846,30.4534722 59.6850303,30.4534919 59.684967)', 'way', 153947125, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975075,1665582243,1738381539,1665582240}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4530483 59.6850678,30.4529356 59.6849912)', 'way', 153947126, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,1665582242,8902082170}'),
('SRID=4326;LINESTRING(30.4529356 59.6849912,30.4530873 59.6849398,30.453213 59.6848988)', 'way', 153947127, '{"highway": "footway", "surface": "fine_gravel"}', '{8902082170,1665582238,8904992643}'),
('SRID=4326;LINESTRING(30.4532598 59.6849025,30.4533508 59.6849575,30.4534722 59.6850303,30.4534524 59.6850941)', 'way', 153947128, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992648,1665582239,1738381539,1665582244}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4531238 59.6848204,30.4533888 59.6848413,30.4535282 59.6848524)', 'way', 153947130, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1665582234,1665582235,1665582236}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4530873 59.6849398,30.4532201 59.6849487,30.4533508 59.6849575,30.4534919 59.684967)', 'way', 153947131, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1665582238,8902082149,1665582239,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533062 59.6850846,30.4533306 59.6850189,30.4533508 59.6849575,30.4533888 59.6848413)', 'way', 153947132, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,1665582243,8902082150,1665582239,1665582235}'),
('SRID=4326;LINESTRING(30.4534524 59.6850941,30.4533062 59.6850846,30.4531801 59.6850762,30.4530483 59.6850678,30.452898 59.6850578)', 'way', 153947133, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582244,1665582243,8902082168,1665582242,1665582241}'),
('SRID=4326;LINESTRING(30.4532234 59.6850226,30.4533062 59.6850846,30.4534147 59.6851629)', 'way', 153947134, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975088,1665582243,1738381544}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4530483 59.6850678,30.4530675 59.6850048,30.4530873 59.6849398,30.4531238 59.6848204)', 'way', 153947135, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,1665582242,8902082151,1665582238,1665582234}'),
('SRID=4326;LINESTRING(30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858)', 'way', 312745383, '{"barrier": "fence"}', '{1439053672,4912270255,4438910482,8895996664,4438910480,3234125031,4438910477,8893386635,4438910475,8895996665,4438910473,8114975112,8114975111,1198357028}'),
('SRID=4326;LINESTRING(30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554)', 'way', 315626926, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053649,8895996432,8895996430,1439053648,1439053645,8895996431,1439053641,1439053639}'),
('SRID=4326;LINESTRING(30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577)', 'way', 317173782, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{1653641713,8114975028,8114975027,8566824024}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.4526304 59.6847065,30.4529536 59.6847313,30.453482 59.6847765,30.4535921 59.6847856,30.4535778 59.6848316,30.4534654 59.685163)', 'way', 393601662, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774427,8905543616,3968068681,7927774426,3968068674,8114975049,3968068687}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4530118 59.6851874,30.4532501 59.6852048,30.4532657 59.6852057)', 'way', 393601664, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1665582246,8899299159,1665582248}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4528762 59.6851274,30.4530483 59.6850678,30.4531752 59.6850205)', 'way', 393601667, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1738381541,1665582242,8114975100}'),
('SRID=4326;LINESTRING(30.452545 59.6854429,30.4525305 59.6854105,30.4525224 59.6853929,30.4525133 59.6853758,30.4525036 59.6853597,30.4524909 59.6853438,30.4524775 59.6853279,30.4524583 59.6853083,30.4524437 59.6852938,30.4524165 59.6852717,30.4523957 59.6852568,30.452375 59.6852427,30.4523461 59.6852243,30.4523179 59.6852068)', 'way', 393620818, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975116,8895996660,8895996640,4438927787,8895996641,8895996659,8895996642,4438927782,8114975115,8895996661,8895996639,4438927777,8895996638,8114975114}'),
('SRID=4326;LINESTRING(30.45322 59.6852491,30.4530263 59.6852336,30.4529402 59.6852275,30.4528645 59.6852217)', 'way', 393620820, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068669,8895975857,8895975877,8895975841}'),
('SRID=4326;LINESTRING(30.4527686 59.6854977,30.4528746 59.6855048)', 'way', 446650486, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053671,1439053674}'),
('SRID=4326;LINESTRING(30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905)', 'way', 446650506, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053619,8914843795,8895996424,8914843796,1439053616,8914843797,8895996423,8914843798,1439053613,8914843799,8895996422,8895996441,8914843802,8895996421,8914843801,1439053611,8914843800,8895996420,1439053614}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522278 59.6851794)', 'way', 446651403, '{"barrier": "fence"}', '{1198357028,1653641713}'),
('SRID=4326;LINESTRING(30.4524943 59.6854502,30.452545 59.6854429,30.4525879 59.6854383,30.4527263 59.6854482,30.4528729 59.6854587)', 'way', 500077282, '{"highway": "footway", "surface": "fine_gravel"}', '{4912270255,8114975116,4438928092,4912270253,4438928093}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522167 59.6853009)', 'way', 758868053, '{"highway": "footway"}', '{1198357028,1406921754}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529562 59.6847243)', 'way', 849729200, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068681,8905543615}'),
('SRID=4326;LINESTRING(30.453482 59.6847765,30.4534851 59.684767)', 'way', 849729201, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774426,8905543614}'),
('SRID=4326;LINESTRING(30.452599 59.6846895,30.4525675 59.6846756,30.45256 59.6846723,30.452568 59.6846486,30.4535014 59.6847265,30.4534976 59.6847368)', 'way', 849729202, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068677,12023732269,8566916344,8566916343,8566916342,7927774425}'),
('SRID=4326;LINESTRING(30.4528543 59.6851747,30.4529071 59.6850026,30.4529249 59.685004,30.4529333 59.6849769,30.452917 59.6849756,30.4529721 59.6847963)', 'way', 871154683, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8114975041,8899249805,8899249804,8899249803,8899249802,8114975042}'),
('SRID=4326;LINESTRING(30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274,30.4526587 59.6847165)', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8114975046,8114975047,8906857474,8906857473,8114975046}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4531264 59.6851489)', 'way', 871154687, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,8114975076}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257)', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,8114975073,8114975074,8114975057,8114975058,8114975059,8114975075,8114975060,8114975061,8114975067,8114975068,8114975069,8114975077,8114975070,8114975062,8114975063,8114975064,8114975076,8114975065,8114975066,8114975071,8114975072,8114975078}'),
('SRID=4326;LINESTRING(30.4532501 59.6852048,30.4531713 59.6851525)', 'way', 871154689, '{"highway": "footway", "surface": "fine_gravel"}', '{8899299159,8114975077}'),
('SRID=4326;LINESTRING(30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998)', 'way', 871154691, '{"highway": "footway"}', '{8114975097,8114975079,8114975080,8114975081,8114975082,8114975083,8114975099,8114975084,8114975085,8114975086,8114975087,8114975088,8114975089,8114975090,8114975091,8114975092,8114975100,8114975093,8114975094,8114975095,8114975096,8114975097}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4529574 59.6848702,30.4530873 59.6849398,30.4531787 59.684998)', 'way', 871154694, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1738381532,1665582238,8114975097}'),
('SRID=4326;LINESTRING(30.4532281 59.6850005,30.4533508 59.6849575,30.4535109 59.6849058,30.4535282 59.6848524)', 'way', 871154695, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975099,1665582239,1738381534,1665582236}'),
('SRID=4326;LINESTRING(30.4532459 59.6852254,30.4528051 59.6851927,30.4522785 59.6851511)', 'way', 871154698, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8114975105,8114975107,8114975109}'),
('SRID=4326;LINESTRING(30.4526095 59.6853751,30.4526201 59.6853832,30.4527025 59.6853899,30.4527175 59.6853841,30.4527302 59.6853414,30.4527195 59.685334,30.4526348 59.6853281,30.4526225 59.6853328,30.4526095 59.6853751)', 'way', 871154699, '{"landuse": "flowerbed"}', '{8114975123,8114975124,8114975125,8895996607,8895996606,8114975126,8114975127,8114975181,8114975123}'),
('SRID=4326;LINESTRING(30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686)', 'way', 871154701, '{"landuse": "flowerbed"}', '{8114975136,8114975137,8114975138,8114975139,8114975140,8114975141,8114975142,8114975143,8114975136}'),
('SRID=4326;LINESTRING(30.4525419 59.6853075,30.4525505 59.6853142,30.4526031 59.6853185,30.4526157 59.6853129,30.4526268 59.6852724,30.4526177 59.6852659,30.4525671 59.6852621,30.452555 59.6852672,30.4525419 59.6853075)', 'way', 871154702, '{"landuse": "flowerbed"}', '{8114975144,8114975145,8114975146,8114975147,8114975148,8114975149,8114975150,8114975151,8114975144}'),
('SRID=4326;LINESTRING(30.4526478 59.6852554,30.4526557 59.6852612,30.452739 59.6852678,30.4527533 59.685262,30.452765 59.685222,30.4527443 59.68522,30.4527459 59.685216,30.452673 59.6852102,30.4526587 59.6852148,30.4526478 59.6852554)', 'way', 871154706, '{"landuse": "flowerbed"}', '{8114975172,8114975173,8114975174,8114975175,8114975176,8114975177,8114975178,8114975179,8114975180,8114975172}'),
('SRID=4326;LINESTRING(30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)', 'way', 872998899, '{"landuse": "flowerbed"}', '{8129422266,8129422267,8129422268,8129422269,8129422270,8129422271,8129422272,8895996472,8129422273,8895996471,8129422266}'),
('SRID=4326;LINESTRING(30.4536402 59.684764,30.4536193 59.6847624,30.4536067 59.6847614)', 'way', 891865282, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{1635198216,1198356775,8289295975}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232)', 'way', 922841960, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824024,1653641402,8566824025,8566824026}'),
('SRID=4326;LINESTRING(30.453531 59.6847593,30.4531199 59.6847256)', 'way', 922854851, '{"height": "8", "natural": "tree_row", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{5002059748,5002059751}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.452599 59.6846895)', 'way', 922854852, '{"highway": "steps"}', '{7927774427,3968068677}'),
('SRID=4326;LINESTRING(30.4536067 59.6847614,30.4535894 59.6847601)', 'way', 922854853, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{8289295975,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4526552 59.6847274,30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274)))', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398)))', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102)))', 'way', 871154691, '{"highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526095 59.6853751,30.4526225 59.6853328,30.4526348 59.6853281,30.4527195 59.685334,30.4527302 59.6853414,30.4527175 59.6853841,30.4527025 59.6853899,30.4526201 59.6853832,30.4526095 59.6853751)))', 'way', 871154699, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139)))', 'way', 871154701, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525419 59.6853075,30.452555 59.6852672,30.4525671 59.6852621,30.4526177 59.6852659,30.4526268 59.6852724,30.4526157 59.6853129,30.4526031 59.6853185,30.4525505 59.6853142,30.4525419 59.6853075)))', 'way', 871154702, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526478 59.6852554,30.4526587 59.6852148,30.452673 59.6852102,30.4527459 59.685216,30.4527443 59.68522,30.452765 59.685222,30.4527533 59.685262,30.452739 59.6852678,30.4526557 59.6852612,30.4526478 59.6852554)))', 'way', 871154706, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)))', 'way', 872998899, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;LINESTRING(30.4521596 59.6854203,30.4524943 59.6854502)', 'way', 961421780, '{"highway": "footway", "surface": "fine_gravel"}', '{8893386627,4912270255}'),
('SRID=4326;LINESTRING(30.4533818 59.6852214,30.4533763 59.68521)', 'way', 961717566, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053598,1439053596}'),
('SRID=4326;LINESTRING(30.4534979 59.6851951,30.4535038 59.6852069)', 'way', 961717567, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053589,1439053591}'),
('SRID=4326;LINESTRING(30.4533763 59.68521,30.4534979 59.6851951)', 'way', 961717568, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053596,1439053589}'),
('SRID=4326;LINESTRING(30.4527378 59.6852117,30.4526559 59.6852052,30.4525684 59.6851982,30.4524641 59.6851898,30.4522584 59.6851734)', 'way', 961717569, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975842,8895975876,8895975873,8895975858,3968068679}'),
('SRID=4326;LINESTRING(30.4530032 59.685292,30.453022 59.6852839,30.4530407 59.6852758,30.4530635 59.68527,30.4530877 59.685267,30.4531091 59.6852663,30.4531333 59.6852683,30.4531547 59.6852744,30.45322 59.6852491)', 'way', 961717570, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975875,8895975856,8895975855,8895975850,8895975854,8895975853,8895975852,8895975851,3968068669}'),
('SRID=4326;LINESTRING(30.4524419 59.6852441,30.452456 59.6851977,30.4524483 59.6851915,30.4523702 59.6851856,30.4523568 59.6851898,30.4523826 59.6852055,30.4524088 59.6852218,30.4524248 59.6852328,30.4524419 59.6852441)', 'way', 961717571, '{"landuse": "flowerbed"}', '{8895975865,8895975864,8895975863,8895975862,8895975859,8895975861,8895975860,8895975838,8895975865}'),
('SRID=4326;LINESTRING(30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946)', 'way', 961717572, '{"landuse": "flowerbed"}', '{8895975872,8895975871,8895975870,8895975869,8895975868,8895975867,8895975866,8895975872}'),
('SRID=4326;LINESTRING(30.4530263 59.6852336,30.4530032 59.685292,30.4529231 59.6852858,30.4527793 59.6852746,30.452638 59.6852636,30.4525513 59.6852568,30.4524466 59.6852487,30.4524641 59.6851898)', 'way', 961717573, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975857,8895975875,8895975843,8895975844,8895975848,8895975846,8895975874,8895975858}'),
('SRID=4326;LINESTRING(30.4529402 59.6852275,30.4529231 59.6852858,30.4529053 59.6853463,30.4528865 59.6854078)', 'way', 961717574, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975877,8895975843,8895975880,8895975878}'),
('SRID=4326;LINESTRING(30.4526559 59.6852052,30.452638 59.6852636,30.4526195 59.6853238,30.4526009 59.6853847,30.4527422 59.6853961,30.4528865 59.6854078)', 'way', 961717575, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975876,8895975848,8895975849,8895975879,8895975847,8895975878}'),
('SRID=4326;LINESTRING(30.4525684 59.6851982,30.4525513 59.6852568,30.4525338 59.685317,30.4526195 59.6853238,30.4527609 59.6853349,30.4529053 59.6853463)', 'way', 961717576, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975873,8895975846,8895975881,8895975849,8895975845,8895975880}'),
('SRID=4326;LINESTRING(30.4527487 59.6852082,30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082)', 'way', 961717577, '{"landuse": "flowerbed"}', '{8895975885,8895975884,8895975883,8895975882,8895975885}'),
('SRID=4326;LINESTRING(30.4532064 59.6852443,30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443)', 'way', 961717578, '{"landuse": "flowerbed"}', '{8895975889,8895975888,8895975887,8895975886,8895975889}'),
('SRID=4326;LINESTRING(30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696)', 'way', 961717579, '{"landuse": "flowerbed"}', '{8895975901,8895975902,8895975900,8895975903,8895975891,8895975890,8895975901}'),
('SRID=4326;LINESTRING(30.4530554 59.6852658,30.4530414 59.6852392,30.453028 59.6852429,30.4530143 59.6852802,30.4530288 59.6852733,30.453041 59.6852693,30.4530554 59.6852658)', 'way', 961717580, '{"landuse": "flowerbed"}', '{8895975898,8895975895,8895975896,8895975907,8895975897,8895975906,8895975898}'),
('SRID=4326;LINESTRING(30.4530632 59.6852641,30.4530782 59.6852621,30.4530921 59.6852616,30.4531031 59.6852618,30.4531172 59.6852446,30.4530501 59.6852392,30.4530632 59.6852641)', 'way', 961717581, '{"landuse": "flowerbed"}', '{8895975905,8895975899,8895975904,8895975892,8895975893,8895975894,8895975905}'),
('SRID=4326;LINESTRING(30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204)', 'way', 961717582, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053627,8914843793,8895996425,8914843794,1439053619}'),
('SRID=4326;LINESTRING(30.4525812 59.6854845,30.4526564 59.6854895)', 'way', 961717593, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{8895996555,1439053669}'),
('SRID=4326;LINESTRING(30.4527747 59.6854387,30.4528506 59.685445,30.4528681 59.6854402,30.4528755 59.6854172,30.4528654 59.6854091,30.4527852 59.6854026,30.4527687 59.6854078,30.4527618 59.6854305,30.4527747 59.6854387)', 'way', 961717594, '{"landuse": "flowerbed"}', '{8895996465,8895996464,8895996463,8895996462,8895996461,8895996460,8895996459,8895996458,8895996465}'),
('SRID=4326;LINESTRING(30.4525201 59.6853123,30.4525328 59.6853069,30.4525442 59.6852666,30.4525351 59.6852597,30.4524557 59.6852538,30.4524775 59.6852724,30.4524969 59.6852906,30.4525201 59.6853123)', 'way', 961717595, '{"landuse": "flowerbed"}', '{8895996470,8895996469,8895996468,8895996467,8895996466,8895996428,8895996429,8895996470}'),
('SRID=4326;LINESTRING(30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969,30.4523418 59.6851889)', 'way', 961717596, '{"landuse": "grass"}', '{8895996495,8895975839,8895996483,8895996484,8895996485,8895996486,8895996487,8895996488,8895996489,8895996490,8895996491,8895996492,8895996493,8895996494,8895996496,8895996473,8895996479,8895996480,8895996474,8895996509,8895996508,8895996507,8895996506,8895996505,8895996504,8895996503,8895996502,8895996501,8895996500,8895996499,8895996498,8895996497,8895996478,8895996495}'),
('SRID=4326;LINESTRING(30.4523081 59.6852118,30.4522803 59.6851945,30.4522795 59.6852157,30.4523143 59.6852356,30.4523427 59.6852536,30.4523628 59.6852673,30.4523827 59.6852816,30.4524087 59.6853027,30.4524225 59.6853163,30.4524411 59.6853354,30.452454 59.6853507,30.452466 59.6853657,30.4524751 59.6853808,30.4524839 59.6853973,30.4524918 59.6854125,30.4524982 59.6854272,30.452501 59.6854325,30.4525097 59.6854362,30.4525224 59.6854348,30.4525257 59.6854303,30.4525231 59.6854242,30.4525171 59.6854097,30.4525091 59.6853943,30.4525002 59.6853776,30.4524909 59.685362,30.4524785 59.6853465,30.4524653 59.6853309,30.4524465 59.6853116,30.4524322 59.6852976,30.4524056 59.685276,30.4523853 59.6852614,30.4523649 59.6852475,30.4523362 59.6852293,30.4523081 59.6852118)', 'way', 961717597, '{"landuse": "grass"}', '{8895996522,8895996477,8895996536,8895996524,8895996525,8895996526,8895996527,8895996528,8895996529,8895996530,8895996531,8895996532,8895996533,8895996534,8895996535,8895996537,8895996482,8895996476,8895996481,8895996523,8895996475,8895996521,8895996520,8895996519,8895996518,8895996517,8895996516,8895996515,8895996514,8895996513,8895996512,8895996511,8895996510,8895996522}'),
('SRID=4326;LINESTRING(30.4526076 59.685425,30.4526842 59.6854313,30.4527032 59.6854269,30.4527112 59.6854034,30.4527003 59.6853955,30.4526196 59.6853891,30.4526042 59.6853942,30.4525975 59.6854176,30.4526076 59.685425)', 'way', 961717598, '{"landuse": "flowerbed"}', '{8895996545,8895996544,8895996543,8895996542,8895996541,8895996540,8895996539,8895996538,8895996545}'),
('SRID=4326;LINESTRING(30.4528639 59.685494,30.4528702 59.6854731,30.4527911 59.6854671,30.4527849 59.685488,30.4528639 59.685494)', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996549,8895996548,8895996547,8895996546,8895996549}'),
('SRID=4326;LINESTRING(30.4526433 59.6854773,30.4526495 59.6854564,30.4525705 59.6854504,30.4525642 59.6854713,30.4526433 59.6854773)', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996553,8895996552,8895996551,8895996550,8895996553}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528709 59.6855164)', 'way', 961717601, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,8895996554}'),
('SRID=4326;LINESTRING(30.4529138 59.6853368,30.4529235 59.6853445,30.4529678 59.6853472,30.4529853 59.6853413,30.4529963 59.6853005,30.4529866 59.6852936,30.4529427 59.6852903,30.4529263 59.6852951,30.4529138 59.6853368)', 'way', 961717602, '{"landuse": "flowerbed"}', '{8895996564,8895996563,8895996562,8895996561,8895996560,8895996559,8895996558,8895996557,8895996564}'),
('SRID=4326;LINESTRING(30.452933 59.6852753,30.4529441 59.6852838,30.4529886 59.6852873,30.453002 59.6852821,30.4530171 59.6852433,30.4530088 59.6852371,30.4529582 59.685233,30.4529444 59.6852374,30.452933 59.6852753)', 'way', 961717603, '{"landuse": "flowerbed"}', '{8895996572,8895996571,8895996570,8895996569,8895996568,8895996567,8895996566,8895996565,8895996572}'),
('SRID=4326;LINESTRING(30.4525595 59.6852465,30.4525692 59.6852544,30.4526207 59.6852585,30.4526333 59.6852538,30.452645 59.6852146,30.4526353 59.6852076,30.4525847 59.6852036,30.4525709 59.685208,30.4525595 59.6852465)', 'way', 961717604, '{"landuse": "flowerbed"}', '{8895996580,8895996579,8895996578,8895996577,8895996576,8895996575,8895996574,8895996573,8895996580}'),
('SRID=4326;LINESTRING(30.452817 59.6852667,30.4528288 59.6852748,30.4529066 59.6852809,30.45292 59.6852751,30.4529319 59.6852358,30.4529216 59.6852291,30.452851 59.685224,30.4528493 59.6852281,30.452831 59.6852267,30.452817 59.6852667)', 'way', 961717605, '{"landuse": "flowerbed"}', '{8895996589,8895996588,8895996587,8895996586,8895996585,8895996584,8895996581,8895996583,8895996582,8895996589}'),
('SRID=4326;LINESTRING(30.4527946 59.6853272,30.4528053 59.6853349,30.4528878 59.6853416,30.4529031 59.6853359,30.4529154 59.6852941,30.4529042 59.6852874,30.4528247 59.6852816,30.4528087 59.6852864,30.4527946 59.6853272)', 'way', 961717606, '{"landuse": "flowerbed"}', '{8895996597,8895996596,8895996595,8895996594,8895996593,8895996592,8895996591,8895996590,8895996597}'),
('SRID=4326;LINESTRING(30.4527745 59.6853889,30.4527865 59.6853969,30.4528677 59.6854032,30.4528839 59.6853982,30.4528953 59.6853552,30.4528845 59.6853477,30.4528052 59.6853419,30.4527899 59.6853454,30.4527745 59.6853889)', 'way', 961717607, '{"landuse": "flowerbed"}', '{8895996605,8895996604,8895996603,8895996602,8895996601,8895996600,8895996599,8895996598,8895996605}'),
('SRID=4326;LINESTRING(30.452565 59.6854206,30.4525598 59.6854071,30.4525516 59.6853892,30.4525422 59.6853716,30.4525319 59.6853544,30.4525184 59.6853376,30.4525045 59.6853211,30.4524848 59.6853009,30.4524693 59.6852857,30.4524408 59.6852624,30.4524192 59.685247,30.4523979 59.6852324,30.4523685 59.6852137,30.4523402 59.6851962)', 'way', 961717608, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996623,8895996621,8895996620,8895996619,8895996618,8895996617,8895996616,8895996615,8895996614,8895996613,8895996612,8895996611,8895996610,8895996622}'),
('SRID=4326;LINESTRING(30.4525109 59.6854262,30.4525044 59.6854114,30.4524965 59.6853961,30.4524877 59.6853796,30.4524784 59.6853642,30.4524662 59.6853489,30.4524532 59.6853335,30.4524345 59.6853143,30.4524204 59.6853005,30.4523942 59.6852791,30.452374 59.6852647,30.4523538 59.6852509,30.4523252 59.6852327,30.4522972 59.6852153)', 'way', 961717609, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996637,8895996635,8895996634,8895996633,8895996632,8895996631,8895996630,8895996629,8895996628,8895996627,8895996626,8895996625,8895996624,8895996636}'),
('SRID=4326;LINESTRING(30.4523179 59.6852068,30.4522881 59.6851891,30.4522584 59.6851734,30.4522785 59.6851511,30.4525958 59.6847532,30.4529382 59.6847803,30.4535778 59.6848316)', 'way', 961717610, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975114,8895996608,3968068679,8114975109,8114975051,8114975050,8114975049}'),
('SRID=4326;LINESTRING(30.4527224 59.6854618,30.4527166 59.6854798)', 'way', 961717612, '{"highway": "steps", "incline": "up", "surface": "paving_stones"}', '{1664064412,8895996662}'),
('SRID=4326;LINESTRING(30.4534116 59.6851536,30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536)', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249763,8899249762,8899249761,8899249760,8899249759,8899249763}'),
('SRID=4326;LINESTRING(30.4535137 59.6851734,30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437)', 'way', 962062988, '{"source:taxon": "board"}', '{8899249777,8899249776,8899249775,8899249774}'),
('SRID=4326;LINESTRING(30.4534505 59.6851512,30.4535484 59.6848425)', 'way', 962062989, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.5", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8899249781,8899249780}'),
('SRID=4326;LINESTRING(30.4532761 59.6852013,30.4533137 59.6852128,30.453319 59.6851999,30.4533257 59.6851898,30.4533338 59.6851796,30.4533458 59.6851715,30.4533606 59.6851647,30.453378 59.6851586,30.4533941 59.6851559,30.4533211 59.6851024,30.4533083 59.6851038,30.4532761 59.6852013)', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249792,8899249791,8899249790,8899249789,8899249788,8899249787,8899249786,8899249785,8899249784,8899249783,8899249782,8899249792}'),
('SRID=4326;LINESTRING(30.4534315 59.6851615,30.4534654 59.685163)', 'way', 962062991, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975036,3968068687}'),
('SRID=4326;LINESTRING(30.45277 59.6851675,30.4528221 59.6849965,30.4528061 59.6849952,30.4528148 59.6849678,30.4528309 59.6849691,30.4528877 59.684789)', 'way', 962062992, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8899249807,8899249801,8899249800,8899249799,8899249798,8899249806}'),
('SRID=4326;LINESTRING(30.4530825 59.6850727,30.4530768 59.6850789,30.4531357 59.6851196,30.4531475 59.6851179,30.4531599 59.6851179,30.4531731 59.6851201,30.4531813 59.685123,30.4532721 59.6850914,30.45327 59.6850856,30.4530825 59.6850727)', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249816,8899249815,8899249814,8899249813,8899249812,8899249811,8899249810,8899249809,8899249808,8899249816}'),
('SRID=4326;LINESTRING(30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148)', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299126,8899299125,8899299124,8899299123,8899299122,8899299121,8899299120,8899299119,8899299118,8899299117,8899299126}'),
('SRID=4326;LINESTRING(30.4531566 59.6851458,30.4531627 59.6851441,30.4531665 59.6851411,30.4531672 59.6851376,30.4531645 59.6851343,30.4531591 59.685132,30.4531523 59.6851313,30.4531455 59.6851322,30.4531404 59.6851346,30.4531381 59.685138,30.4531391 59.6851415,30.4531433 59.6851444,30.4531496 59.6851459,30.4531566 59.6851458)', 'way', 962062995, '{"landuse": "grass"}', '{8899299139,8899299138,8899299137,8899299136,8899299135,8899299134,8899299133,8899299132,8899299131,8899299130,8899299129,8899299128,8899299140,8899299139}'),
('SRID=4326;LINESTRING(30.4531836 59.6851532,30.45325 59.6851972,30.4532587 59.6851977,30.4532923 59.6851023,30.4532804 59.6850981,30.4531914 59.68513,30.4531946 59.6851353,30.453195 59.6851401,30.4531936 59.6851444,30.45319 59.6851488,30.4531836 59.6851532)', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299150,8899299149,8899299141,8899299148,8899299142,8899299147,8899299146,8899299145,8899299144,8899299143,8899299150}'),
('SRID=4326;LINESTRING(30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299158,8899299157,8899299156,8899299155,8899299154,8899299153,8899299152,8899299151,8899249778,8899299158}'),
('SRID=4326;LINESTRING(30.4532162 59.6852145,30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145)', 'way', 962062998, '{"landuse": "grass"}', '{8899299165,8899299164,8899299163,8899299161,8899299160,8899299162,8899299165}'),
('SRID=4326;LINESTRING(30.4532627 59.6852077,30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077)', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', '{8902082028,8902082027,8902082026,8902082025,8902082024,8902082023,8902082022,8902082021,8902082020,8902027911,8902082019,8902082018,8902082017,8902027912,8902027916,8902027913,8902027915,8902027914,8902082028}'),
('SRID=4326;LINESTRING(30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082032,8902082031,8902082030,8902082029,8902082032}'),
('SRID=4326;LINESTRING(30.4529465 59.6849826,30.4530583 59.6849454,30.4530566 59.6849397,30.4529452 59.6849315,30.4529338 59.6849691,30.4529492 59.6849698,30.4529465 59.6849826)', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082038,8902082037,8902082036,8902082035,8902082034,8902082033,8902082038}'),
('SRID=4326;LINESTRING(30.4530344 59.685052,30.4530456 59.6850508,30.4530757 59.684955,30.4530662 59.6849507,30.4529465 59.6849918,30.4530344 59.685052)', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082047,8902082046,8902082045,8902082044,8902082043,8902082047}'),
('SRID=4326;LINESTRING(30.4529083 59.6850544,30.4530153 59.6850613,30.4530221 59.685056,30.4529398 59.6850009,30.4529378 59.6850121,30.4529184 59.6850114,30.4529083 59.6850544)', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082054,8902082053,8902082052,8902082051,8902082050,8902082049,8902082054}'),
('SRID=4326;LINESTRING(30.4528875 59.6851184,30.4530138 59.6850731,30.4530125 59.6850679,30.4529043 59.6850625,30.4528875 59.6851184)', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082059,8902082058,8902082057,8902082056,8902082059}'),
('SRID=4326;LINESTRING(30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789)', 'way', 962382766, '{"landuse": "grass"}', '{8902082065,8902082064,8902082063,8902082062,8902082065}'),
('SRID=4326;LINESTRING(30.4529896 59.6851748,30.4530072 59.6851719,30.4530311 59.6850841,30.4530206 59.6850798,30.4528885 59.6851275,30.4529896 59.6851748)', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082070,8902082069,8902082068,8902082067,8902082066,8902082070}'),
('SRID=4326;LINESTRING(30.4533332 59.6850719,30.4534612 59.68503,30.4533655 59.6849715,30.4533546 59.6849733,30.4533227 59.6850682,30.4533332 59.6850719)', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082080,8902082079,8902082078,8902082077,8902082076,8902082080}'),
('SRID=4326;LINESTRING(30.4533437 59.685083,30.4534444 59.6850899,30.4534619 59.6850382,30.4533411 59.685078,30.4533437 59.685083)', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082084,8902082083,8902082082,8902082081,8902082084}'),
('SRID=4326;LINESTRING(30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173)', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082090,8902082089,8902082088,8902082087,8902082086,8902082085,8902082090}'),
('SRID=4326;LINESTRING(30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113)', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082096,8902082095,8902082094,8902082093,8902082092,8902082091,8902082096}'),
('SRID=4326;LINESTRING(30.4532258 59.6849527,30.4532116 59.6849902,30.4532207 59.684992,30.4532298 59.6849953,30.4533219 59.6849634,30.4533191 59.6849588,30.4532258 59.6849527)', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082102,8902082101,8902082100,8902082099,8902082098,8902082097,8902082102}'),
('SRID=4326;LINESTRING(30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082108,8902082107,8902082106,8902082105,8902082104,8902082103,8902082108}'),
('SRID=4326;LINESTRING(30.4530763 59.6850024,30.4531619 59.6850065,30.4531647 59.6850018,30.4531695 59.6849976,30.4531032 59.6849548,30.453091 59.6849565,30.4530763 59.6850024)', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082109,8902082114,8902082113,8902082112,8902082111,8902082110,8902082109}'),
('SRID=4326;LINESTRING(30.4530716 59.6850547,30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547)', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082120,8902082119,8902082118,8902082117,8902082116,8902082115,8902082120}'),
('SRID=4326;LINESTRING(30.4531735 59.6850722,30.4531863 59.6850287,30.4531799 59.6850271,30.4531749 59.6850252,30.4530791 59.6850599,30.453083 59.685065,30.4531735 59.6850722)', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082126,8902082125,8902082124,8902082123,8902082122,8902082121,8902082126}'),
('SRID=4326;LINESTRING(30.4531903 59.6850727,30.4532727 59.6850781,30.4532816 59.6850715,30.4532223 59.6850274,30.453211 59.6850297,30.453201 59.6850303,30.4531903 59.6850727)', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082132,8902082131,8902082130,8902082129,8902082128,8902082127,8902082132}'),
('SRID=4326;LINESTRING(30.453206 59.6849937,30.4532201 59.6849487)', 'way', 962382778, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975081,8902082149}'),
('SRID=4326;LINESTRING(30.4532335 59.6850137,30.4533306 59.6850189)', 'way', 962382779, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975086,8902082150}'),
('SRID=4326;LINESTRING(30.4531682 59.6850102,30.4530675 59.6850048)', 'way', 962382780, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975094,8902082151}'),
('SRID=4326;LINESTRING(30.4531253 59.6850083,30.4531256 59.6850158,30.4531288 59.6850232,30.4531349 59.6850302,30.4531434 59.6850364,30.4531543 59.6850416,30.4531669 59.6850457,30.4531809 59.6850485,30.4531957 59.6850498,30.4532107 59.6850496,30.4532253 59.685048,30.4532391 59.685045,30.4532514 59.6850406,30.4532618 59.6850352,30.4532699 59.6850288,30.4532753 59.6850217,30.4532779 59.6850143,30.4532776 59.6850067,30.4532744 59.6849993,30.4532684 59.6849924,30.4532598 59.6849862,30.453249 59.6849809,30.4532363 59.6849768,30.4532224 59.6849741,30.4532076 59.6849728,30.4531926 59.6849729,30.4531779 59.6849745,30.4531642 59.6849776,30.4531519 59.6849819,30.4531415 59.6849874,30.4531334 59.6849938,30.4531279 59.6850008,30.4531253 59.6850083)', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082167,8902082134,8902082166,8902082133,8902082165,8902082148,8902082164,8902082147,8902082163,8902082146,8902082162,8902082145,8902082161,8902082144,8902082160,8902082143,8902082159,8902082142,8902082158,8902082141,8902082157,8902082140,8902082156,8902082139,8902082155,8902082138,8902082154,8902082137,8902082153,8902082136,8902082152,8902082135,8902082167}'),
('SRID=4326;LINESTRING(30.4531956 59.6850267,30.4531801 59.6850762)', 'way', 962382782, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975091,8902082168}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4529124 59.6850066,30.4529307 59.6850078,30.4529356 59.6849912,30.4529412 59.6849735,30.4529245 59.6849722,30.4529389 59.6849276)', 'way', 962382783, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381535,8902082040,8902082170,8902082039,8902082169,1665582237}'),
('SRID=4326;LINESTRING(30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877)', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992660,8904992659,8904992658,8904992657,8904992656,8904992655,8904992654,8904992653,8904992652,8904992651,8904992650,8904992649,8904992648,8904992647,8904992646,8904992645,8904992644,8904992643,8904992642,8904992641,8904992640,8904992639,8904992660}'),
('SRID=4326;LINESTRING(30.4532432 59.6848971,30.4532493 59.6848954,30.4532531 59.6848924,30.4532538 59.6848889,30.4532511 59.6848856,30.4532457 59.6848833,30.4532389 59.6848826,30.4532321 59.6848835,30.453227 59.684886,30.4532247 59.6848893,30.4532257 59.6848928,30.4532299 59.6848957,30.4532362 59.6848972,30.4532432 59.6848971)', 'way', 962678726, '{"landuse": "grass"}', '{8904992673,8904992672,8904992671,8904992670,8904992669,8904992668,8904992667,8904992666,8904992665,8904992664,8904992663,8904992662,8904992661,8904992673}'),
('SRID=4326;LINESTRING(30.4530998 59.6849248,30.4531105 59.684928,30.4532056 59.6848974,30.4532029 59.6848932,30.4532023 59.6848877,30.4532043 59.6848829,30.4532098 59.6848776,30.4531384 59.6848341,30.4531253 59.6848349,30.4530998 59.6849248)', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992682,8904992681,8904992680,8904992679,8904992637,8904992678,8904992677,8904992676,8904992675,8904992682}'),
('SRID=4326;LINESTRING(30.4530724 59.6849262,30.4530868 59.6849239,30.4531127 59.6848333,30.4531034 59.6848301,30.4529683 59.6848711,30.4530724 59.6849262)', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992687,8904992686,8904992685,8904992684,8904992683,8904992687}'),
('SRID=4326;LINESTRING(30.4530589 59.6849341,30.4530633 59.6849302,30.452961 59.6848772,30.4529482 59.6849246,30.4530589 59.6849341)', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992691,8904992690,8904992689,8904992688,8904992691}'),
('SRID=4326;LINESTRING(30.4531212 59.684939,30.4533222 59.6849516,30.4533269 59.6849477,30.4532581 59.6849071,30.4532455 59.6849087,30.4532339 59.6849085,30.4532243 59.684907,30.4532133 59.6849034,30.4531185 59.6849335,30.4531212 59.684939)', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992699,8904992698,8904992697,8904992696,8904992692,8904992638,8904992695,8904992694,8904992693,8904992699}'),
('SRID=4326;LINESTRING(30.453536 59.6848401,30.4529797 59.6847958,30.452977 59.6848046,30.4535329 59.6848493,30.453536 59.6848401)', 'way', 962714214, '{"landuse": "flowerbed"}', '{8905335420,8905335419,8905335418,8905335417,8905335420}'),
('SRID=4326;LINESTRING(30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335435,8905335434,8905335433,8905335432,8905335435}'),
('SRID=4326;LINESTRING(30.4533819 59.6849565,30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565)', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335439,8905335438,8905335437,8905335436,8905335439}'),
('SRID=4326;LINESTRING(30.4533623 59.6849431,30.4533739 59.6849464,30.4534994 59.6849065,30.4534038 59.6848537,30.4533921 59.6848545,30.4533623 59.6849431)', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335444,8905335443,8905335442,8905335441,8905335440,8905335444}'),
('SRID=4326;LINESTRING(30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335454,8905335453,8905335452,8905335451,8905335450,8905335449,8905335448,8905335447,8905335446,8905335454}'),
('SRID=4326;LINESTRING(30.4529663 59.6848632,30.4530962 59.6848253,30.4530928 59.6848201,30.4529831 59.6848107,30.4529663 59.6848632)', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335458,8905335457,8905335456,8905335455,8905335458}'),
('SRID=4326;LINESTRING(30.4532195 59.6848732,30.4532263 59.6848712,30.4532379 59.6848698,30.4532504 59.6848704,30.4532619 59.6848729,30.4532706 59.684876,30.4533642 59.6848467,30.4533614 59.6848416,30.453158 59.6848262,30.4531503 59.6848308,30.4532195 59.6848732)', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335467,8905335466,8905335465,8905335464,8905335463,8905335462,8905335461,8905335445,8905335460,8905335459,8905335467}'),
('SRID=4326;LINESTRING(30.4532684 59.6848807,30.4533888 59.6848413)', 'way', 962714221, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992654,1665582235}'),
('SRID=4326;LINESTRING(30.4531238 59.6848204,30.4532177 59.684877)', 'way', 962714222, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582234,8904992660}'),
('SRID=4326;LINESTRING(30.4527677 59.6846399,30.4528579 59.6846477)', 'way', 962735606, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8905543613,1198356896}'),
('SRID=4326;LINESTRING(30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399)', 'way', 962735608, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824026,1198356935,8566824027,8905543613}'),
('SRID=4326;LINESTRING(30.4534851 59.684767,30.4534913 59.6847521,30.4534976 59.6847368)', 'way', 962735609, '{"highway": "steps"}', '{8905543614,12023732271,7927774425}'),
('SRID=4326;LINESTRING(30.4529562 59.6847243,30.4529615 59.6847082,30.4529628 59.6847041)', 'way', 962735610, '{"highway": "steps"}', '{8905543615,12023732270,3968068678}'),
('SRID=4326;LINESTRING(30.4526304 59.6847065,30.4525958 59.6847532)', 'way', 962735611, '{"highway": "footway", "surface": "fine_gravel"}', '{8905543616,8114975051}'),
('SRID=4326;LINESTRING(30.4528676 59.6847547,30.4526341 59.6847357,30.452631 59.6847454,30.4528645 59.6847644,30.4528676 59.6847547)', 'way', 962735612, '{"landuse": "grass"}', '{8905558220,8905558219,8905558218,8905558217,8905558220}'),
('SRID=4326;LINESTRING(30.4535589 59.6848104,30.4530176 59.6847681,30.4530149 59.6847769,30.4535559 59.6848195,30.4535589 59.6848104)', 'way', 962735613, '{"landuse": "grass"}', '{8905558224,8905558223,8905558222,8905558221,8905558224}'),
('SRID=4326;LINESTRING(30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573,30.4530182 59.6847465)', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8905558227,8905558226,8906857476,8906857475,8905558227}'),
('SRID=4326;LINESTRING(30.4523152 59.6851448,30.4526116 59.6847664)', 'way', 962869359, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.7", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857452,8906857451}'),
('SRID=4326;LINESTRING(30.4526277 59.6846803,30.4526365 59.6846782,30.4526406 59.6846738,30.4526381 59.684669,30.4526302 59.6846662,30.4526205 59.6846666,30.4526137 59.6846701,30.4526128 59.684675,30.4526184 59.684679,30.4526277 59.6846803)', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857461,8906857453,8906857460,8906857459,8906857458,8906857457,8906857456,8906857455,8906857454,8906857461}'),
('SRID=4326;LINESTRING(30.4535863 59.6847456,30.4535811 59.6847595)', 'way', 962869365, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8906857470,8289295976}'),
('SRID=4326;MULTIPOLYGON(((30.4513 59.6845239,30.4513105 59.6845148,30.4513253 59.6844972,30.4513336 59.6844848,30.4513473 59.6844699,30.4513568 59.6844555,30.4513653 59.6844381,30.4513738 59.6844262,30.4513936 59.6844093,30.4514013 59.6843976,30.4514225 59.6843888,30.4514444 59.6843812,30.4514614 59.6843629,30.4514704 59.6843445,30.4514736 59.6843262,30.4514828 59.6842988,30.4514912 59.6842865,30.4514975 59.6842799,30.4515117 59.6842705,30.4515428 59.6842625,30.4516031 59.6842549,30.4518408 59.6843394,30.4519523 59.6843794,30.4520216 59.6844035,30.4520874 59.6844268,30.4521402 59.684444,30.4521943 59.6844606,30.452244 59.6844736,30.4522939 59.6844865,30.4523452 59.6844991,30.4524113 59.6845149,30.4524654 59.6845284,30.4525244 59.6845406,30.4525539 59.6845467,30.452566 59.6845558,30.452571 59.6845656,30.4525675 59.6845745,30.4525615 59.68459,30.4525618 59.6845988,30.4525613 59.6846073,30.4525568 59.6846156,30.4525466 59.6846232,30.4525331 59.6846279,30.4525251 59.684634,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4521768 59.6852884,30.4521573 59.685297,30.4521207 59.6853099,30.4520859 59.6853167,30.4520483 59.6853214,30.4520121 59.6853235,30.4519679 59.6853228,30.4519209 59.685316,30.4518731 59.6853033,30.4518364 59.6852869,30.4518016 59.6852646,30.4517747 59.6852436,30.4517546 59.685224,30.4517399 59.685205,30.4517278 59.6851773,30.4517104 59.6851603,30.4516916 59.6851468,30.4516857 59.6851285,30.4516903 59.6851123,30.4517117 59.6851023,30.4517426 59.685094,30.4517784 59.6850892,30.4518103 59.6850908,30.4518403 59.6851005,30.4518731 59.6850949,30.4518771 59.6850809,30.4518692 59.685051,30.4518777 59.6850294,30.4519043 59.6850131,30.4519376 59.6850028,30.4519737 59.684999,30.4520079 59.6849997,30.4520477 59.685012,30.4520887 59.6850223,30.4521435 59.6850216,30.4521948 59.6850093,30.4522112 59.6849969,30.4522301 59.6849727,30.45222 59.6849586,30.4521979 59.6849496,30.4521524 59.6849328,30.452119 59.6849135,30.452105 59.6848849,30.4521099 59.684868,30.4520932 59.684849,30.4520658 59.6848372,30.4520255 59.6848223,30.4520099 59.6848104,30.4519866 59.6847939,30.4519651 59.6847718,30.4519517 59.6847501,30.4519518 59.6847258,30.4519545 59.6847041,30.4519786 59.6846635,30.4520121 59.6846479,30.452051 59.6846256,30.4520604 59.6846161,30.4520537 59.6846046,30.4520175 59.6845829,30.4519692 59.6845613,30.451933 59.684566,30.4519102 59.6845748,30.4518928 59.6845917,30.4518772 59.6846127,30.4518697 59.684638,30.4518561 59.6846587,30.4518347 59.6846794,30.4518136 59.6846859,30.451785 59.6846963,30.4517612 59.6847117,30.4517363 59.6847257,30.4517004 59.6847328,30.4516678 59.6847376,30.4516243 59.6847395,30.4515783 59.6847426,30.4515624 59.6847383,30.451536 59.6847319,30.4515265 59.6847207,30.4515128 59.6847092,30.4515012 59.6846991,30.4514963 59.6846932,30.4515039 59.6846846,30.4515091 59.6846707,30.4515006 59.6846638,30.4514837 59.6846584,30.4514488 59.6846536,30.4514298 59.6846424,30.4514235 59.6846339,30.451434 59.6846216,30.451452 59.6846104,30.4514721 59.684604,30.4514816 59.6845934,30.4514827 59.6845827,30.4514763 59.6845715,30.4514427 59.6845604,30.4514004 59.6845719,30.4513792 59.6845708,30.451356 59.684566,30.4513317 59.6845601,30.4513137 59.6845489,30.4513042 59.6845393,30.4513 59.6845239)))', 'relation', 12444790, '{"natural": "wood", "leaf_type": "mixed", "leaf_cycle": "mixed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523568 59.6851898,30.4523702 59.6851856,30.4524483 59.6851915,30.452456 59.6851977,30.4524419 59.6852441,30.4524248 59.6852328,30.4524088 59.6852218,30.4523826 59.6852055,30.4523568 59.6851898)))', 'way', 961717571, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459)))', 'way', 961717572, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082,30.4523303 59.6851757)))', 'way', 961717577, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443,30.4528543 59.6852169)))', 'way', 961717578, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622)))', 'way', 961717579, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6852802,30.453028 59.6852429,30.4530414 59.6852392,30.4530554 59.6852658,30.453041 59.6852693,30.4530288 59.6852733,30.4530143 59.6852802)))', 'way', 961717580, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530501 59.6852392,30.4531172 59.6852446,30.4531031 59.6852618,30.4530921 59.6852616,30.4530782 59.6852621,30.4530632 59.6852641,30.4530501 59.6852392)))', 'way', 961717581, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.4531138 59.6852988,30.4530897 59.6853096,30.4530682 59.6853211,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168)))', 'relation', 12935642, '{"height": "6", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530106 59.6853114,30.4530161 59.6853019,30.4530244 59.6852922,30.4530375 59.685285,30.4530534 59.685278,30.4530732 59.685274,30.4530931 59.6852723,30.4531124 59.685272,30.4531329 59.6852751,30.4531443 59.685278,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530111 59.6853217,30.4530106 59.6853114)))', 'relation', 12922491, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530012 59.685359,30.4529724 59.685378,30.4529542 59.6853912,30.4529312 59.685409,30.4529136 59.685403)))', 'relation', 12935641, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527618 59.6854305,30.4527687 59.6854078,30.4527852 59.6854026,30.4528654 59.6854091,30.4528755 59.6854172,30.4528681 59.6854402,30.4528506 59.685445,30.4527747 59.6854387,30.4527618 59.6854305)))', 'way', 961717594, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524557 59.6852538,30.4525351 59.6852597,30.4525442 59.6852666,30.4525328 59.6853069,30.4525201 59.6853123,30.4524969 59.6852906,30.4524775 59.6852724,30.4524557 59.6852538)))', 'way', 961717595, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523226 59.6851969,30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969)))', 'way', 961717596, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522795 59.6852157,30.4522803 59.6851945,30.4523081 59.6852118,30.4523362 59.6852293,30.4523649 59.6852475,30.4523853 59.6852614,30.4524056 59.685276,30.4524322 59.6852976,30.4524465 59.6853116,30.4524653 59.6853309,30.4524785 59.6853465,30.4524909 59.685362,30.4525002 59.6853776,30.4525091 59.6853943,30.4525171 59.6854097,30.4525231 59.6854242,30.4525257 59.6854303,30.4525224 59.6854348,30.4525097 59.6854362,30.452501 59.6854325,30.4524982 59.6854272,30.4524918 59.6854125,30.4524839 59.6853973,30.4524751 59.6853808,30.452466 59.6853657,30.452454 59.6853507,30.4524411 59.6853354,30.4524225 59.6853163,30.4524087 59.6853027,30.4523827 59.6852816,30.4523628 59.6852673,30.4523427 59.6852536,30.4523143 59.6852356,30.4522795 59.6852157)))', 'way', 961717597, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525975 59.6854176,30.4526042 59.6853942,30.4526196 59.6853891,30.4527003 59.6853955,30.4527112 59.6854034,30.4527032 59.6854269,30.4526842 59.6854313,30.4526076 59.685425,30.4525975 59.6854176)))', 'way', 961717598, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527849 59.685488,30.4527911 59.6854671,30.4528702 59.6854731,30.4528639 59.685494,30.4527849 59.685488)))', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525642 59.6854713,30.4525705 59.6854504,30.4526495 59.6854564,30.4526433 59.6854773,30.4525642 59.6854713)))', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529138 59.6853368,30.4529263 59.6852951,30.4529427 59.6852903,30.4529866 59.6852936,30.4529963 59.6853005,30.4529853 59.6853413,30.4529678 59.6853472,30.4529235 59.6853445,30.4529138 59.6853368)))', 'way', 961717602, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452933 59.6852753,30.4529444 59.6852374,30.4529582 59.685233,30.4530088 59.6852371,30.4530171 59.6852433,30.453002 59.6852821,30.4529886 59.6852873,30.4529441 59.6852838,30.452933 59.6852753)))', 'way', 961717603, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525595 59.6852465,30.4525709 59.685208,30.4525847 59.6852036,30.4526353 59.6852076,30.452645 59.6852146,30.4526333 59.6852538,30.4526207 59.6852585,30.4525692 59.6852544,30.4525595 59.6852465)))', 'way', 961717604, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452817 59.6852667,30.452831 59.6852267,30.4528493 59.6852281,30.452851 59.685224,30.4529216 59.6852291,30.4529319 59.6852358,30.45292 59.6852751,30.4529066 59.6852809,30.4528288 59.6852748,30.452817 59.6852667)))', 'way', 961717605, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527946 59.6853272,30.4528087 59.6852864,30.4528247 59.6852816,30.4529042 59.6852874,30.4529154 59.6852941,30.4529031 59.6853359,30.4528878 59.6853416,30.4528053 59.6853349,30.4527946 59.6853272)))', 'way', 961717606, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527745 59.6853889,30.4527899 59.6853454,30.4528052 59.6853419,30.4528845 59.6853477,30.4528953 59.6853552,30.4528839 59.6853982,30.4528677 59.6854032,30.4527865 59.6853969,30.4527745 59.6853889)))', 'way', 961717607, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536,30.4533349 59.6850974)))', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437,30.4535137 59.6851734,30.4534909 59.6851715)))', 'relation', 12925809, '{"crop": "grape", "genus": "Vitis", "taxon": "Vitis amurensis", "landuse": "vineyard", "genus:ru": "Виноград", "taxon:ru": "Виноград амурский"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532761 59.6852013,30.4533083 59.6851038,30.4533211 59.6851024,30.4533941 59.6851559,30.453378 59.6851586,30.4533606 59.6851647,30.4533458 59.6851715,30.4533338 59.6851796,30.4533257 59.6851898,30.453319 59.6851999,30.4533137 59.6852128,30.4532761 59.6852013)))', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530768 59.6850789,30.4530825 59.6850727,30.45327 59.6850856,30.4532721 59.6850914,30.4531813 59.685123,30.4531731 59.6851201,30.4531599 59.6851179,30.4531475 59.6851179,30.4531357 59.6851196,30.4530768 59.6850789)))', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728)))', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531381 59.685138,30.4531404 59.6851346,30.4531455 59.6851322,30.4531523 59.6851313,30.4531591 59.685132,30.4531645 59.6851343,30.4531672 59.6851376,30.4531665 59.6851411,30.4531627 59.6851441,30.4531566 59.6851458,30.4531496 59.6851459,30.4531433 59.6851444,30.4531391 59.6851415,30.4531381 59.685138)))', 'way', 962062995, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531836 59.6851532,30.45319 59.6851488,30.4531936 59.6851444,30.453195 59.6851401,30.4531946 59.6851353,30.4531914 59.68513,30.4532804 59.6850981,30.4532923 59.6851023,30.4532587 59.6851977,30.45325 59.6851972,30.4531836 59.6851532)))', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)))', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145,30.4528382 59.6851861)))', 'way', 962062998, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077,30.4528577 59.6851769)))', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)))', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529338 59.6849691,30.4529452 59.6849315,30.4530566 59.6849397,30.4530583 59.6849454,30.4529465 59.6849826,30.4529492 59.6849698,30.4529338 59.6849691)))', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529465 59.6849918,30.4530662 59.6849507,30.4530757 59.684955,30.4530456 59.6850508,30.4530344 59.685052,30.4529465 59.6849918)))', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529083 59.6850544,30.4529184 59.6850114,30.4529378 59.6850121,30.4529398 59.6850009,30.4530221 59.685056,30.4530153 59.6850613,30.4529083 59.6850544)))', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528875 59.6851184,30.4529043 59.6850625,30.4530125 59.6850679,30.4530138 59.6850731,30.4528875 59.6851184)))', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739)))', 'way', 962382766, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528885 59.6851275,30.4530206 59.6850798,30.4530311 59.6850841,30.4530072 59.6851719,30.4529896 59.6851748,30.4528885 59.6851275)))', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533227 59.6850682,30.4533546 59.6849733,30.4533655 59.6849715,30.4534612 59.68503,30.4533332 59.6850719,30.4533227 59.6850682)))', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533411 59.685078,30.4534619 59.6850382,30.4534444 59.6850899,30.4533437 59.685083,30.4533411 59.685078)))', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233)))', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005)))', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532116 59.6849902,30.4532258 59.6849527,30.4533191 59.6849588,30.4533219 59.6849634,30.4532298 59.6849953,30.4532207 59.684992,30.4532116 59.6849902)))', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)))', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530763 59.6850024,30.453091 59.6849565,30.4531032 59.6849548,30.4531695 59.6849976,30.4531647 59.6850018,30.4531619 59.6850065,30.4530763 59.6850024)))', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547,30.4530603 59.6850515)))', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530791 59.6850599,30.4531749 59.6850252,30.4531799 59.6850271,30.4531863 59.6850287,30.4531735 59.6850722,30.453083 59.685065,30.4530791 59.6850599)))', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531903 59.6850727,30.453201 59.6850303,30.453211 59.6850297,30.4532223 59.6850274,30.4532816 59.6850715,30.4532727 59.6850781,30.4531903 59.6850727)))', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531253 59.6850083,30.4531279 59.6850008,30.4531334 59.6849938,30.4531415 59.6849874,30.4531519 59.6849819,30.4531642 59.6849776,30.4531779 59.6849745,30.4531926 59.6849729,30.4532076 59.6849728,30.4532224 59.6849741,30.4532363 59.6849768,30.453249 59.6849809,30.4532598 59.6849862,30.4532684 59.6849924,30.4532744 59.6849993,30.4532776 59.6850067,30.4532779 59.6850143,30.4532753 59.6850217,30.4532699 59.6850288,30.4532618 59.6850352,30.4532514 59.6850406,30.4532391 59.685045,30.4532253 59.685048,30.4532107 59.6850496,30.4531957 59.6850498,30.4531809 59.6850485,30.4531669 59.6850457,30.4531543 59.6850416,30.4531434 59.6850364,30.4531349 59.6850302,30.4531288 59.6850232,30.4531256 59.6850158,30.4531253 59.6850083)))', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903)))', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532247 59.6848893,30.453227 59.684886,30.4532321 59.6848835,30.4532389 59.6848826,30.4532457 59.6848833,30.4532511 59.6848856,30.4532538 59.6848889,30.4532531 59.6848924,30.4532493 59.6848954,30.4532432 59.6848971,30.4532362 59.6848972,30.4532299 59.6848957,30.4532257 59.6848928,30.4532247 59.6848893)))', 'way', 962678726, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530998 59.6849248,30.4531253 59.6848349,30.4531384 59.6848341,30.4532098 59.6848776,30.4532043 59.6848829,30.4532023 59.6848877,30.4532029 59.6848932,30.4532056 59.6848974,30.4531105 59.684928,30.4530998 59.6849248)))', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529683 59.6848711,30.4531034 59.6848301,30.4531127 59.6848333,30.4530868 59.6849239,30.4530724 59.6849262,30.4529683 59.6848711)))', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529482 59.6849246,30.452961 59.6848772,30.4530633 59.6849302,30.4530589 59.6849341,30.4529482 59.6849246)))', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531185 59.6849335,30.4532133 59.6849034,30.4532243 59.684907,30.4532339 59.6849085,30.4532455 59.6849087,30.4532581 59.6849071,30.4533269 59.6849477,30.4533222 59.6849516,30.4531212 59.684939,30.4531185 59.6849335)))', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452977 59.6848046,30.4529797 59.6847958,30.453536 59.6848401,30.4535329 59.6848493,30.452977 59.6848046)))', 'way', 962714214, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)))', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565,30.4533809 59.6849511)))', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533623 59.6849431,30.4533921 59.6848545,30.4534038 59.6848537,30.4534994 59.6849065,30.4533739 59.6849464,30.4533623 59.6849431)))', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)))', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529663 59.6848632,30.4529831 59.6848107,30.4530928 59.6848201,30.4530962 59.6848253,30.4529663 59.6848632)))', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531503 59.6848308,30.453158 59.6848262,30.4533614 59.6848416,30.4533642 59.6848467,30.4532706 59.684876,30.4532619 59.6848729,30.4532504 59.6848704,30.4532379 59.6848698,30.4532263 59.6848712,30.4532195 59.6848732,30.4531503 59.6848308)))', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452631 59.6847454,30.4526341 59.6847357,30.4528676 59.6847547,30.4528645 59.6847644,30.452631 59.6847454)))', 'way', 962735612, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530149 59.6847769,30.4530176 59.6847681,30.4535589 59.6848104,30.4535559 59.6848195,30.4530149 59.6847769)))', 'way', 962735613, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6847573,30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573)))', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523152 59.6851448,30.4526116 59.6847664,30.4528877 59.684789,30.4528309 59.6849691,30.4528148 59.6849678,30.4528061 59.6849952,30.4528221 59.6849965,30.45277 59.6851675,30.4527658 59.68518,30.4523152 59.6851448)))', 'relation', 12933782, '{"ref": "5", "name": "Кенконс", "genus": "Tilia", "name:en": "The Quincunx", "natural": "wood", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526128 59.684675,30.4526137 59.6846701,30.4526205 59.6846666,30.4526302 59.6846662,30.4526381 59.684669,30.4526406 59.6846738,30.4526365 59.6846782,30.4526277 59.6846803,30.4526184 59.684679,30.4526128 59.684675)))', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526042 59.6846709,30.4526082 59.6846655,30.452617 59.6846635,30.4528469 59.6846817,30.452843 59.684694,30.4528376 59.6847122,30.4526498 59.6846973,30.4526123 59.6846817,30.4526042 59.6846709)))', 'relation', 12933783, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530629 59.6847308,30.4530706 59.6847131,30.4530752 59.684699,30.4535863 59.6847456,30.4535811 59.6847595,30.4535752 59.6847748,30.4530629 59.6847308)))', 'relation', 12933784, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4534977 59.6852035,30.4534967 59.6852111,30.453492 59.6852191,30.4534813 59.6852261,30.4534692 59.6852309,30.4534524 59.6852342,30.453435 59.6852355,30.4534193 59.6852337,30.4534045 59.6852307,30.4533914 59.6852248,30.4533831 59.6852182,30.4533763 59.68521,30.4533752 59.6852006)))', 'relation', 12935640, '{"height": "5.5", "roof:shape": "pyramidal", "roof:colour": "#DADDE2", "roof:height": "0.5", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526773 59.6854805,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.4527511 59.6854859,30.4526773 59.6854805)))', 'relation', 12987950, '{"height": "1", "roof:shape": "skillion", "roof:colour": "grey", "roof:height": "1", "building:part": "yes", "roof:direction": "170", "building:colour": "#E4C78F", "roof:orientation": "along"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4526773 59.6854805,30.4527511 59.6854859,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528709 59.6855164,30.4527091 59.6855042,30.4525787 59.6854944)))', 'relation', 12935639, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4522474 59.6851858,30.4522167 59.6853009,30.4522119 59.6853269,30.4521905 59.6853763,30.4521596 59.6854203,30.4521293 59.6854701,30.4520946 59.6855262,30.4520624 59.6855804,30.4520524 59.6856064,30.452047 59.6856386,30.452047 59.6856666,30.4520551 59.685713,30.4520778 59.685798,30.4520997 59.6858613,30.4521127 59.6859046,30.4521047 59.6859432,30.4520825 59.6859825,30.4520478 59.686026,30.4520492 59.6860479,30.4520658 59.6860755,30.4520819 59.6860924,30.4521387 59.6861383,30.4521581 59.6861556,30.4521822 59.6861782,30.45222 59.6862149,30.4522535 59.6862461,30.4522676 59.6862668,30.4522828 59.6862897,30.4522911 59.6863104,30.4522992 59.6863312,30.4523018 59.6863618,30.4522989 59.6863961,30.4522911 59.6864255,30.452286 59.6864496,30.4522787 59.6864747,30.4522743 59.6864925,30.452274 59.6865148,30.4522776 59.6865312,30.4522888 59.6865538,30.4523045 59.686573,30.4523226 59.6865862,30.4523413 59.6865954,30.4523836 59.686613,30.4524214 59.6866244,30.4524614 59.686634,30.4524912 59.6866392,30.4525264 59.6866438,30.4525641 59.6866457,30.4526585 59.6866455,30.4527524 59.6866414,30.4528825 59.6866353,30.4530173 59.6866255,30.4531259 59.6866181,30.4531936 59.6866133,30.453271 59.6866114,30.4533083 59.686614,30.4534028 59.6866228,30.4535229 59.6866363,30.4536201 59.6866455,30.453691 59.6866508,30.4536976 59.6866508,30.4539823 59.6866673,30.4539778 59.6866919,30.4544217 59.6867427,30.4544227 59.6867377,30.4544646 59.686742,30.4544638 59.6867472,30.4545508 59.6867576,30.4545534 59.6867525,30.4545963 59.6867573,30.4546214 59.6867604,30.4546788 59.6867553,30.4548168 59.686752,30.4551163 59.6867835,30.4552388 59.6868093,30.4553945 59.6868602,30.455491 59.6869022,30.4555769 59.68694,30.4556466 59.6869672,30.4557807 59.6870023,30.4558987 59.6870186,30.4559816 59.68702,30.4560875 59.6870601,30.4561508 59.6871091,30.4561831 59.6871675,30.456183 59.687235,30.4561616 59.6872894,30.4561159 59.6873352,30.4560824 59.6873697,30.4560436 59.6874139,30.4560113 59.687453,30.4559765 59.6875127,30.4559804 59.6875356,30.4559953 59.6875601,30.4560395 59.6875816,30.4560838 59.6875938,30.4561467 59.6876019,30.4561991 59.6876021,30.4563573 59.6875979,30.4565289 59.6875961,30.4566782 59.6875933,30.4567611 59.687592,30.4568899 59.687586,30.4570005 59.6875828,30.4570995 59.6875755,30.4572099 59.6875697,30.4573214 59.6875781,30.4574243 59.6875895,30.4575564 59.6876086,30.4576489 59.6876236,30.4577906 59.6876357,30.4578929 59.687656,30.4579737 59.6876911,30.4580413 59.6877282,30.4581225 59.6877678,30.4581817 59.6878027,30.4582341 59.6878291,30.4583152 59.6878863,30.4583478 59.6879193,30.4583877 59.6879673,30.458411 59.6880122,30.4584387 59.6880452,30.4584657 59.6880811,30.4585427 59.6881373,30.4585748 59.6881735,30.4586375 59.6882236,30.4586938 59.6882576,30.4587833 59.6883125,30.45884 59.6883434,30.4588959 59.6883741,30.4589723 59.6884163,30.4590175 59.6884495,30.4590717 59.6884887,30.4591366 59.6885238,30.4591908 59.6885653,30.4592104 59.6886013,30.4592312 59.6886474,30.4592494 59.6886943,30.4592859 59.6887303,30.4593172 59.688773,30.4593556 59.6888131,30.459429 59.6888677,30.459467 59.6889042,30.4594979 59.688929,30.4595172 59.6889694,30.4595266 59.6890044,30.4595285 59.689042,30.4595248 59.6890919,30.4595255 59.6891719,30.4595317 59.6892178,30.4595442 59.6893129,30.4595387 59.689363,30.4595118 59.6894235,30.4594761 59.689469,30.4594014 59.6895068,30.4593069 59.6895588,30.4592476 59.6895966,30.4591945 59.6896312,30.4591511 59.6896562,30.4591092 59.6896944,30.4590843 59.6897378,30.4590826 59.689771,30.4590853 59.6898069,30.4591078 59.6898435,30.4592007 59.6898882,30.4592339 59.6899293,30.4592628 59.6899874,30.4592762 59.6900429,30.45928 59.6901025,30.4592809 59.6901575,30.4592798 59.6902243,30.4593042 59.6902777,30.4593662 59.6903178,30.4594544 59.6903409,30.4595249 59.6903674,30.4595807 59.6903944,30.4596268 59.6904316,30.4596583 59.6904756,30.4596087 59.690551,30.4596006 59.6905905,30.4595977 59.6906403,30.4595904 59.6906903,30.4595826 59.6907418,30.4595821 59.6908019,30.459583 59.6908375,30.459529 59.6908703,30.4594074 59.6909353,30.4592831 59.6909939,30.459213 59.6910431,30.4591817 59.691066,30.4591361 59.6911201,30.4591012 59.6911675,30.4591012 59.691223,30.4591406 59.6912486,30.4592295 59.6912875,30.4592895 59.6913173,30.4593728 59.6913444,30.4594455 59.6913593,30.459517 59.6913682,30.4596037 59.6913935,30.4596491 59.6914211,30.4596908 59.6914522,30.4597319 59.6914924,30.4597559 59.6915361,30.4597745 59.6915821,30.459787 59.6916313,30.4597852 59.6916643,30.4597718 59.6917238,30.4597396 59.6917861,30.4596859 59.6918429,30.4596685 59.6918693,30.4596383 59.6919054,30.4596009 59.6919405,30.4595315 59.6919991,30.4594652 59.6920502,30.4594082 59.6920946,30.4593773 59.6921151,30.4593545 59.6921348,30.4593366 59.6921529,30.4593399 59.6921734,30.4593659 59.6921939,30.4596045 59.6923272,30.4596496 59.6923362,30.4596901 59.6923377,30.4597398 59.6923315,30.4597933 59.6923156,30.4598526 59.6922792,30.4599141 59.692234,30.4600168 59.6921771,30.4600862 59.6921317,30.4601606 59.6921103,30.4602526 59.6920827,30.460323 59.6920633,30.4603814 59.6920333,30.4604812 59.6919715,30.4605362 59.6919506,30.4606073 59.6919499,30.4606743 59.6919675,30.4607467 59.6920081,30.4608017 59.6920284,30.4608728 59.6920473,30.4609935 59.6920595,30.4610726 59.692067,30.4611517 59.6920866,30.4612403 59.6921299,30.4612939 59.6921759,30.4613569 59.6922104,30.4614227 59.6922341,30.4614964 59.6922659,30.4615568 59.6923059,30.4616211 59.6923729,30.4616748 59.6924466,30.4617579 59.6925197,30.4618368 59.6925614,30.461948 59.6926074,30.4620442 59.6926525,30.4621643 59.6927115,30.4622732 59.6927583,30.4623906 59.6927971,30.4625398 59.6928238,30.4626554 59.6928355,30.4627278 59.6928346,30.4627807 59.6928331,30.4629009 59.6928193,30.4629797 59.6928093,30.4630314 59.6928086,30.4630815 59.6928162,30.4631241 59.6928309,30.4631433 59.692849,30.4631354 59.6928782,30.4630918 59.6929178,30.4629933 59.692982,30.4628509 59.6930395,30.4627989 59.693076,30.4627775 59.6931068,30.4627715 59.6931374,30.4627782 59.6931678,30.4628 59.6931938,30.462816 59.6932161,30.4628201 59.6932352,30.4628276 59.6932642,30.4628055 59.6932947,30.462749 59.6933555,30.4627356 59.6934076,30.4627544 59.6934638,30.4627866 59.6935491,30.4628348 59.6936025,30.4628814 59.6936516,30.4629464 59.6936976,30.4630181 59.6937555,30.4631033 59.6938351,30.463194 59.693908,30.4632997 59.6939707,30.4633997 59.6940315,30.4634563 59.6940722,30.4634978 59.6941112,30.4635448 59.6941433,30.4635995 59.6941633,30.4636618 59.6941785,30.4637065 59.6941778,30.4637604 59.694169,30.4638165 59.6941725,30.4638941 59.6941882,30.463945 59.6941973,30.4639826 59.6942136,30.4640155 59.6942304,30.4640341 59.6942422,30.4640539 59.694259,30.4640781 59.6942943,30.4641097 59.6943536,30.4641054 59.6943849,30.4640955 59.6944214,30.4640677 59.6944543,30.4640278 59.694509,30.4639684 59.6945921,30.4639761 59.694632,30.4640196 59.6946691,30.4640928 59.6947215,30.4641504 59.6947644,30.4642414 59.694848,30.4643013 59.6949614,30.4643265 59.6950347,30.4643629 59.6950927,30.464383 59.6951471,30.4644155 59.6951914,30.4644503 59.6952616,30.464467 59.6953187,30.4644779 59.6953885,30.4644493 59.6954307,30.4644137 59.6954645,30.4643477 59.6955048,30.4642827 59.6955528,30.4641331 59.6956106,30.4640324 59.6956546,30.4639589 59.6956973,30.4639054 59.6957548,30.4638826 59.6958068,30.4638917 59.6958626,30.4638959 59.695908,30.4638913 59.6959452,30.4638761 59.6959807,30.4638581 59.6960266,30.4638387 59.6960774,30.4638353 59.6961315,30.4638514 59.6962235,30.4639031 59.6963079,30.4639806 59.6963837,30.4640641 59.696435,30.4641563 59.6964993,30.4642492 59.6965314,30.464353 59.6965624,30.4645112 59.6966079,30.4646909 59.6966431,30.4648519 59.6966796,30.4649082 59.6966992,30.4649645 59.6967256,30.4650316 59.6967635,30.465104 59.6968014,30.4651737 59.6968352,30.4652724 59.696889,30.4653398 59.6969338,30.4653714 59.6969637,30.4653977 59.6970024,30.4654124 59.6970396,30.4654285 59.6970924,30.4654299 59.6971357,30.4654285 59.6971912,30.4654178 59.6972534,30.4654178 59.6973103,30.4654268 59.6973472,30.465443 59.6973849,30.4654739 59.6974306,30.465535 59.6974889,30.4655776 59.6975263,30.4655998 59.6975497,30.4656249 59.6975948,30.4656281 59.6976305,30.4656291 59.6976586,30.465636 59.697698,30.4656478 59.6977439,30.4656559 59.6977839,30.4656639 59.6978247,30.4656741 59.697865,30.4656808 59.6978977,30.4656931 59.6979479,30.4657242 59.6979888,30.4657651 59.6980369,30.4658049 59.6980618,30.4658569 59.6980859,30.4659085 59.6981101,30.4659691 59.6981356,30.4659934 59.6981619,30.4660187 59.6982125,30.4660434 59.6982506,30.4660765 59.6982913,30.46612 59.6983229,30.46618 59.6983645,30.4662324 59.6983954,30.466279 59.6984245,30.4663222 59.6984585,30.4663422 59.6984839,30.4663508 59.6985161,30.466347 59.6985389,30.4663297 59.6985658,30.4662984 59.6986043,30.4662667 59.6986353,30.4662287 59.6986639,30.4662098 59.6986996,30.4662023 59.698738,30.4662177 59.6987814,30.4662476 59.6988217,30.4662941 59.6988595,30.4663218 59.6988897,30.4663703 59.6989336,30.4664066 59.698983,30.4664342 59.6990318,30.46626 59.699006,30.4662245 59.6990009,30.4661986 59.6989985,30.465736 59.6989731,30.465674 59.6989864,30.4656438 59.6989955,30.4656194 59.6990058,30.4655995 59.6990178,30.4655881 59.6990296,30.4655669 59.6990522,30.4655425 59.6990838,30.4655077 59.6991223,30.4654429 59.6991855,30.4653481 59.6992218,30.4652461 59.6992516,30.4651852 59.6992621,30.4651339 59.6992648,30.4650235 59.6992651,30.4649339 59.6992741,30.4648662 59.6992863,30.4647744 59.6993078,30.4647108 59.6993347,30.4646409 59.6993755,30.4645943 59.6994397,30.4645313 59.6994729,30.464447 59.6994976,30.4643342 59.6995189,30.4641272 59.6995513,30.4601 59.6956121,30.4590933 59.6945995,30.4585195 59.6940453,30.4565283 59.6920253,30.4559963 59.6915691,30.455779 59.6913562,30.4555191 59.6911016,30.4536132 59.6892318,30.4533114 59.6893232,30.4532486 59.6892981,30.453085 59.689221,30.4529871 59.689177,30.4528879 59.6891357,30.4528128 59.6891072,30.4524488 59.6889751,30.4524008 59.688958,30.4523038 59.6889045,30.4522723 59.6888961,30.4522552 59.6888858,30.4522361 59.6888724,30.452216 59.68885,30.4521838 59.6888324,30.4521207 59.6887986,30.4520511 59.6887644,30.4518909 59.6886967,30.4517882 59.6886551,30.4516822 59.6886098,30.4515358 59.6885556,30.4514019 59.6885123,30.4513037 59.6884778,30.4512571 59.6884636,30.4512056 59.6884428,30.4511404 59.6884196,30.4510778 59.6883871,30.4510264 59.6883553,30.4509783 59.6883239,30.4508749 59.6882578,30.4508266 59.688226,30.4507678 59.6881981,30.4505943 59.6881208,30.4501869 59.6879433,30.4499736 59.6878632,30.4499334 59.6878503,30.4498881 59.687841,30.4497871 59.6878092,30.4494924 59.6876814,30.4490926 59.6875099,30.4490362 59.6874936,30.4489854 59.6874759,30.4489383 59.6874638,30.448876 59.687449,30.4487626 59.6874338,30.4486346 59.6874221,30.4485214 59.6874142,30.4483648 59.6874032,30.4474691 59.687337,30.4468361 59.6872873,30.4467403 59.6872722,30.446684 59.6872669,30.4463496 59.6872017,30.4463085 59.6871943,30.4462561 59.6871833,30.4462179 59.6871721,30.446187 59.6871613,30.4461557 59.68715,30.4461253 59.6871366,30.4461066 59.6871274,30.4460918 59.6871135,30.4460273 59.6870454,30.4459552 59.6870078,30.4459436 59.6870073,30.4459073 59.6869902,30.4458766 59.6869748,30.445846 59.6869616,30.4458216 59.6869518,30.4457961 59.6869433,30.4457578 59.6869309,30.4457123 59.6869183,30.4456647 59.6869057,30.4455949 59.6868892,30.4455514 59.68688,30.4455232 59.6868726,30.4455129 59.6868665,30.4453868 59.6868434,30.44531 59.6868381,30.4452457 59.6868322,30.44506 59.686812,30.4450028 59.6868076,30.4449557 59.6868041,30.4449237 59.6868029,30.4448943 59.6868019,30.4448734 59.6868039,30.4448512 59.6868054,30.4448212 59.6868026,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017)))', 'relation', 4187886, '{"ref": "II", "name": "Долина реки Славянки", "place": "quarter", "name:az": "Slavyanka çayının vadisi", "name:fr": "Vallée de la rivière Slavianka", "name:hy": "Սլավյանկա գետի հովիտ", "name:uk": "Долина річки Слов''янки", "name:zh": "谷斯拉维亚卡河", "boundary": "protected_area", "int_name": "Vallée de la rivière Slavianka", "wikidata": "Q121809341", "wikipedia": "ru:Павловский парк#Долина реки Славянки", "description": "Район Павловского парка"}', NULL),
('SRID=4326;LINESTRING(30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392)', 'way', 1297781094, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{8289295976,12023732271,12023732270,12023732269,8114975027,12023699867,12023732331,12023732330,12023732337,12023732336}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528788 59.6854915)', 'way', 1093902027, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,1439053668}'),
('SRID=4326;LINESTRING(30.4535894 59.6847601,30.4535811 59.6847595)', 'way', 1297781085, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{12023732332,8289295976}'),
('SRID=4326;LINESTRING(30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601)', 'way', 1297781086, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{12023732335,12023732334,12023732333,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4519927 59.6856654,30.451993 59.6856352,30.4519974 59.6856085,30.4520057 59.6855861,30.452033 59.685533,30.4520717 59.6854725,30.4521073 59.6854196,30.4521538 59.6853554,30.4521646 59.6853419,30.4521729 59.6853289,30.4521751 59.685321,30.4521778 59.6853033,30.4521768 59.6852884,30.4522278 59.6851794,30.4522474 59.6851858,30.4522695 59.6851929,30.4522692 59.6852184,30.452307 59.6852409,30.4523333 59.6852571,30.4523534 59.6852701,30.4523836 59.685295,30.4524088 59.6853175,30.4524395 59.6853504,30.4524616 59.6853789,30.4524735 59.685401,30.4524845 59.6854195,30.4524943 59.6854502,30.452497 59.6854882,30.452346 59.6854768,30.4523217 59.6855588,30.4522802 59.6855556,30.4522258 59.6855515,30.4522191 59.6855742,30.4522002 59.685638,30.4521808 59.6857036,30.4521745 59.6857248,30.4522289 59.6857289,30.4522705 59.6857319,30.4522477 59.6858088,30.4522804 59.6858113,30.4525803 59.6858339,30.4526091 59.6858361,30.4526832 59.6858416,30.4528205 59.685852,30.4528174 59.6858982,30.4527279 59.6859036,30.4527314 59.6859191,30.4527383 59.6859422,30.4527472 59.6859643,30.4527643 59.6859927,30.4527791 59.6860133,30.4527956 59.6860336,30.4528174 59.6860572,30.4528406 59.6860793,30.4528659 59.6861008,30.4528879 59.6861175,30.4529175 59.6861373,30.4529497 59.6861561,30.4529804 59.6861727,30.4530167 59.6861897,30.4530418 59.6861992,30.4530963 59.6861616,30.4531534 59.686184,30.4531278 59.6862023,30.453137 59.6862056,30.4531608 59.6862141,30.4531704 59.6862175,30.453196 59.6861992,30.4531795 59.686249,30.4531642 59.6862975,30.453138 59.686381,30.4531363 59.6863866,30.4532826 59.6863983,30.4532725 59.6864305,30.4532916 59.686432,30.4532869 59.6864462,30.4532998 59.6864473,30.4533248 59.6864494,30.4533485 59.6864515,30.4533611 59.6864525,30.4533659 59.6864383,30.4534768 59.6864467,30.453575 59.6864544,30.4535812 59.6864636,30.4536188 59.68646,30.4536556 59.6864553,30.4536952 59.6864492,30.4537376 59.6864434,30.4537814 59.6864354,30.4538212 59.6864281,30.453863 59.6864194,30.4538817 59.6864353,30.4539287 59.6864214,30.4539454 59.6864356,30.4539576 59.686432,30.4540057 59.6864176,30.4540172 59.6864141,30.4540005 59.6863999,30.4540399 59.6863883,30.4540219 59.6863729,30.4540549 59.6863624,30.4540887 59.6863495,30.4541297 59.6863344,30.4541407 59.6863296,30.4541607 59.6863411,30.4541696 59.6863371,30.4542 59.6863235,30.4542091 59.6863195,30.4541887 59.6863078,30.4541965 59.6863041,30.4542363 59.6862844,30.4542705 59.6862654,30.4542999 59.6862773,30.4544137 59.6862059,30.4543849 59.6861942,30.4544059 59.686181,30.4544395 59.686154,30.4544728 59.6861239,30.4544964 59.6860973,30.4545494 59.6861117,30.4546053 59.6861282,30.4545922 59.6861427,30.4545784 59.6861572,30.4545449 59.6861862,30.4545138 59.6862131,30.4544576 59.6862495,30.4543906 59.6862854,30.4543294 59.6863147,30.4542746 59.6863415,30.454221 59.6863683,30.454115 59.6864133,30.454039 59.6864407,30.4539464 59.6864693,30.4539252 59.6864763,30.4538233 59.6865047,30.4536724 59.6865094,30.4536724 59.6865223,30.4536503 59.6865223,30.4535973 59.686521,30.4535465 59.6865208,30.4535021 59.6865209,30.4534712 59.6865222,30.4534473 59.6865255,30.453429 59.6865331,30.4534215 59.6865438,30.4534132 59.686574,30.4534136 59.6865866,30.453423 59.6865971,30.4534445 59.6866075,30.4534686 59.686613,30.4534579 59.6866461,30.4534073 59.6866421,30.4533332 59.6866345,30.4532837 59.6866305,30.453254 59.6866292,30.4532071 59.6866305,30.4531615 59.686632,30.4531191 59.6866347,30.4531041 59.6865988,30.4531448 59.6865925,30.4531695 59.6865869,30.4531966 59.6865772,30.4532138 59.6865676,30.4532231 59.6865589,30.453199 59.6865568,30.4531811 59.6865532,30.4531596 59.6865468,30.4531373 59.6865396,30.4531219 59.6865326,30.4530964 59.6865196,30.4530733 59.6865042,30.4530555 59.6864887,30.4530367 59.6864681,30.4530227 59.6864499,30.4530105 59.6864274,30.4530012 59.6864103,30.4529945 59.6863933,30.4529919 59.6863759,30.4529905 59.686347,30.4529907 59.6863231,30.4529911 59.6862911,30.4529891 59.686281,30.4529827 59.6862715,30.4529634 59.6862545,30.4529402 59.6862373,30.4529067 59.6862141,30.4528563 59.6861801,30.4528201 59.6861533,30.4527906 59.6861317,30.4527578 59.6861047,30.452731 59.6860823,30.4527092 59.6860609,30.4526947 59.6860457,30.4526816 59.6860278,30.4526652 59.6860011,30.4526541 59.6859782,30.4526337 59.6859283,30.4526256 59.6859159,30.4526103 59.685908,30.4525905 59.6859034,30.4525603 59.6859009,30.452391 59.6858965,30.4523675 59.6858999,30.4523504 59.685904,30.4523333 59.6859114,30.452312 59.685923,30.4522313 59.6859637,30.4521811 59.6859882,30.452085 59.686032,30.4520765 59.6860386,30.4520753 59.6860476,30.4520797 59.6860577,30.4520264 59.6860652,30.4520201 59.6860504,30.4520162 59.6860346,30.4520143 59.6860207,30.4520168 59.6860051,30.4520203 59.685989,30.4520274 59.6859769,30.4520341 59.6859612,30.4520405 59.6859506,30.452047 59.6859415,30.4520537 59.6859259,30.4520544 59.6859134,30.4520523 59.6858956,30.4520465 59.6858708,30.4520254 59.6858069,30.4519995 59.68571,30.4519927 59.6856654),(30.4521704 59.6857398,30.4521704 59.6857513,30.4521744 59.6857635,30.4521811 59.6857763,30.4521945 59.6857899,30.4522187 59.6858021,30.4522414 59.6858088,30.4522629 59.685735,30.4521731 59.6857289,30.4521704 59.6857398),(30.452226 59.6855475,30.4523159 59.6855543,30.4523387 59.6854798,30.4523212 59.6854826,30.4523011 59.6854866,30.452277 59.6854941,30.4522596 59.6855015,30.4522448 59.6855117,30.4522354 59.6855225,30.4522301 59.6855347,30.452226 59.6855475),(30.4522508 59.6858359,30.4525647 59.6858582,30.4525714 59.6858373,30.4522575 59.6858142,30.4522508 59.6858359),(30.4523249 59.685462,30.4523727 59.6854667,30.4523804 59.6854465,30.4523327 59.6854418,30.4523249 59.685462)))', 'relation', 6636677, '{"surface": "fine_gravel", "area:highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533763 59.68521,30.4534979 59.6851951,30.4535038 59.6852069,30.4534995 59.6852209,30.4533878 59.6852355,30.4533818 59.6852214,30.4533763 59.68521)))', 'relation', 12947389, '{"height": "6", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523253 59.6851768,30.4523286 59.6851637,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4525881 59.6854311,30.452574 59.6853959,30.4525486 59.6853522,30.4525291 59.6853286,30.4525137 59.6853106,30.452501 59.6852981,30.4524755 59.6852751,30.452455 59.6852592,30.4524366 59.6852453,30.4524178 59.6852321,30.4523994 59.6852201,30.4523706 59.6852014,30.452339 59.6851839,30.4523253 59.6851768)))', 'relation', 5906400, '{"ref": "2", "name": "Цветочный партер", "leisure": "garden", "name:en": "The Flower Parterre", "ref:okn": "781620399040956", "alt_name": "Цветники Марии Фёдоровны", "wikidata": "Q118122045", "garden:type": "flowerbed", "garden:style": "french"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.4533268 59.6853074,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532343 59.6853363,30.453156 59.6852825)))', 'relation', 17755883, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4531158 59.6853933,30.4531719 59.6854212,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530216 59.6854636,30.4529242 59.6854401,30.4529045 59.6854337)))', 'relation', 17755885, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4532343 59.6853363,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.453238 59.6853862,30.453207 59.6854026,30.4531719 59.6854212,30.4531158 59.6853933,30.4530217 59.6853466)))', 'relation', 17755884, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527677 59.6846399,30.4527719 59.6846286,30.4527799 59.6846212,30.4527933 59.6846157,30.4528134 59.6846137,30.4528403 59.6846144,30.4528537 59.6846178,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399)))', 'relation', 12932608, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 1721132, '{"ref": "3", "name": "Павильон Трёх граций", "note": "Геометрические теги крыши павильона размещены отдельно", "name:es": "Pabellón de las tres gracias", "name:fr": "Pavillon des Trois Grâces", "name:pt": "Pavilhão das Três Graças", "name:zh": "三美人亭", "ref:okn": "781610399040356", "tourism": "attraction", "building": "yes", "heritage": "2", "historic": "yes", "wikidata": "Q112716431", "addr:city": "Павловск", "architect": "Чарльз Камерон", "start_date": "1800", "addr:street": "Садовая улица", "architect:en": "Charles Cameron", "addr:housenumber": "20 литЧ", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6514/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12202573, '{"height": "7", "min_height": "5.5", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "1", "building:part": "yes", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12497925, '{"height": "1.5", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525466 59.6846232,30.4525568 59.6846156,30.4525613 59.6846073,30.4525618 59.6845988,30.4525615 59.68459,30.4525675 59.6845745,30.452571 59.6845656,30.452566 59.6845558,30.4525539 59.6845467,30.4526659 59.6845694,30.4527826 59.6845897,30.4528946 59.6846069,30.4530012 59.6846212,30.4535732 59.6846878,30.4535916 59.6846905,30.453606 59.6846946,30.4536164 59.684701,30.4536208 59.6847085,30.4536214 59.684718,30.4536181 59.6847274,30.4536067 59.6847614,30.4535894 59.6847601,30.4535811 59.6847595,30.4535863 59.6847456,30.4535923 59.6847296,30.4535925 59.6847224,30.4535886 59.6847164,30.4535807 59.6847121,30.4535698 59.6847103,30.4535555 59.6847085,30.4530859 59.6846667,30.4530887 59.6846582,30.4530942 59.6846416,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399,30.4525841 59.6846239,30.4525626 59.6846222,30.4525466 59.6846232)))', 'relation', 12131779, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452047 59.6856386,30.4520524 59.6856064,30.4520624 59.6855804,30.4520946 59.6855262,30.4521293 59.6854701,30.4521596 59.6854203,30.4521905 59.6853763,30.4522119 59.6853269,30.4522167 59.6853009,30.4522474 59.6851858,30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4601554 59.6854805,30.4601767 59.6856005,30.4601793 59.6857568,30.4601468 59.6858374,30.4600081 59.6860973,30.459853 59.68614,30.459704 59.6863415,30.4596832 59.6864086,30.4596712 59.686482,30.4596638 59.6865545,30.459666 59.6866369,30.4596929 59.6867933,30.4597047 59.6868418,30.4597409 59.6869365,30.4598403 59.6871335,30.4599111 59.6872432,30.4599552 59.6873116,30.4600453 59.6874469,30.460134 59.687572,30.4600858 59.6875668,30.4600427 59.6875593,30.4599863 59.6875559,30.4598958 59.6875545,30.4597744 59.6875619,30.4597289 59.6875627,30.4596698 59.687583,30.4596323 59.6876026,30.4595974 59.6876371,30.4595625 59.6876658,30.4595236 59.6876852,30.459478 59.6876967,30.459407 59.6877062,30.4593453 59.6877028,30.4592849 59.6876838,30.4592367 59.6876553,30.4591509 59.6875883,30.4590905 59.6875599,30.4590355 59.6875424,30.4589524 59.6875261,30.4588343 59.6875105,30.4586868 59.6875038,30.4585474 59.6875038,30.4584333 59.6875086,30.4583274 59.6875126,30.4582348 59.6875193,30.4581437 59.6875301,30.4580095 59.6875505,30.4579371 59.6875654,30.4579009 59.6875782,30.4578312 59.6876019,30.4577386 59.6876249,30.4576489 59.6876236,30.4575564 59.6876086,30.4574243 59.6875895,30.4573214 59.6875781,30.4572099 59.6875697,30.4570995 59.6875755,30.4570005 59.6875828,30.4568899 59.687586,30.4567611 59.687592,30.4566782 59.6875933,30.4565289 59.6875961,30.4563573 59.6875979,30.4561991 59.6876021,30.4561467 59.6876019,30.4560838 59.6875938,30.4560395 59.6875816,30.4559953 59.6875601,30.4559804 59.6875356,30.4559765 59.6875127,30.4560113 59.687453,30.4560436 59.6874139,30.4560824 59.6873697,30.4561159 59.6873352,30.4561616 59.6872894,30.456183 59.687235,30.4561831 59.6871675,30.4561508 59.6871091,30.4560875 59.6870601,30.4559816 59.68702,30.4558987 59.6870186,30.4557807 59.6870023,30.4556466 59.6869672,30.4555769 59.68694,30.455491 59.6869022,30.4553945 59.6868602,30.4552388 59.6868093,30.4551163 59.6867835,30.4548168 59.686752,30.4546788 59.6867553,30.4546214 59.6867604,30.4545963 59.6867573,30.4545534 59.6867525,30.4545508 59.6867576,30.4544638 59.6867472,30.4544646 59.686742,30.4544227 59.6867377,30.4544217 59.6867427,30.4539778 59.6866919,30.4539823 59.6866673,30.4536976 59.6866508,30.453691 59.6866508,30.4536201 59.6866455,30.4535229 59.6866363,30.4534028 59.6866228,30.4533083 59.686614,30.453271 59.6866114,30.4531936 59.6866133,30.4531259 59.6866181,30.4530173 59.6866255,30.4528825 59.6866353,30.4527524 59.6866414,30.4526585 59.6866455,30.4525641 59.6866457,30.4525264 59.6866438,30.4524912 59.6866392,30.4524614 59.686634,30.4524214 59.6866244,30.4523836 59.686613,30.4523413 59.6865954,30.4523226 59.6865862,30.4523045 59.686573,30.4522888 59.6865538,30.4522776 59.6865312,30.452274 59.6865148,30.4522743 59.6864925,30.4522787 59.6864747,30.452286 59.6864496,30.4522911 59.6864255,30.4522989 59.6863961,30.4523018 59.6863618,30.4522992 59.6863312,30.4522911 59.6863104,30.4522828 59.6862897,30.4522676 59.6862668,30.4522535 59.6862461,30.45222 59.6862149,30.4521822 59.6861782,30.4521581 59.6861556,30.4521387 59.6861383,30.4520819 59.6860924,30.4520658 59.6860755,30.4520492 59.6860479,30.4520478 59.686026,30.4520825 59.6859825,30.4521047 59.6859432,30.4521127 59.6859046,30.4520997 59.6858613,30.4520778 59.685798,30.4520551 59.685713,30.452047 59.6856666,30.452047 59.6856386)))', 'relation', 4194432, '{"ref": "III", "name": "Придворцовый район", "place": "quarter", "name:fr": "Secteur central", "website": "https://pavlovskmuseum.ru/about/park/layout/36/", "boundary": "protected_area", "wikidata": "Q121809724", "wikipedia": "ru:Павловский парк#Центральный (Придворцовый) район", "description": "Район исторического Павловского парка"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4366882 59.6889898,30.4370373 59.6889668,30.4370736 59.6889644,30.4371138 59.6889367,30.4374634 59.6889115,30.4375002 59.6889088,30.4375427 59.6889059,30.4380171 59.6888738,30.438182 59.6888616,30.4383254 59.6888487,30.4384589 59.6888338,30.4385849 59.6888182,30.4388652 59.6887778,30.4389016 59.6887728,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346802 59.6935317,30.4346817 59.6935045,30.4346729 59.6934955,30.4346017 59.6934439,30.4344133 59.6933106,30.4344523 59.6932882,30.4344971 59.6932601,30.4345233 59.6932407,30.4345424 59.6932254,30.4345634 59.6932027,30.4345863 59.693171,30.4345979 59.6931498,30.4346066 59.6931248,30.4346128 59.6930889,30.434612 59.693054,30.4346077 59.6930245,30.4346019 59.6930124,30.4345969 59.693,30.4345757 59.6929702,30.4345621 59.6929518,30.434542 59.6929299,30.4345091 59.6928998,30.4344756 59.6928775,30.4344413 59.6928581,30.4343883 59.6928337,30.4343603 59.6928224,30.4343198 59.692809,30.4342705 59.6927958,30.4342429 59.6927909,30.4341796 59.6927811,30.4341217 59.6927737,30.4340777 59.6927708,30.4340075 59.6927673,30.4339293 59.6927692,30.4338474 59.6927768,30.433767 59.6927902,30.4337225 59.6928016,30.4335043 59.6926756,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)))', 'relation', 1721131, '{"name": "Павловский парк", "note": "https://wiki.openstreetmap.org/wiki/RU:Павловск/Павловский_парк", "leisure": "park", "name:be": "Паўлаўскі парк", "name:bg": "Павловски парк", "name:ca": "Parc Pàvlovsk", "name:en": "Pavlovsk Park", "name:es": "Parque Pávlovsk", "name:fr": "Parc de Pavlovsk", "name:he": "פארק פבלובסק", "name:hy": "Պավլովսկ պարկը", "name:nl": "Pavlovskpark", "name:ru": "Павловский парк", "name:zh": "巴甫洛夫斯克公园", "ref:okn": "781720399040986", "website": "https://pavlovskmuseum.ru/about/park/", "boundary": "protected_area", "heritage": "2", "historic": "yes", "int_name": "Parc de Pavlovsk", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q2506336", "wikipedia": "ru:Павловский парк", "fee:amount": "100", "start_date": "1777", "opening_hours": "07:00-19:00", "protect_class": "22", "operator:phone": "+7 (812) 452-15-36", "fee:conditional": "yes @ 9:00-17:00", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6407/", "operator:tourism": "museum", "operator:website": "http://www.pavlovskmuseum.ru", "protection_title": "Государственный музей-заповедник"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4368674 59.6896812,30.4373083 59.6896203,30.4383622 59.6894747,30.4383925 59.6894699,30.4387768 59.6894091,30.4389533 59.6893793,30.4395631 59.6892765,30.4395975 59.6896826,30.43963 59.6897841,30.4411104 59.6895883,30.4411759 59.6892872,30.4412059 59.6891298,30.4412229 59.6890714,30.4402547 59.6891154,30.4398722 59.6891396,30.4395358 59.6891608,30.4394903 59.6891472,30.4392717 59.6889536,30.4391469 59.6889286,30.4391174 59.6889211,30.4390705 59.6889062,30.4390316 59.6888852,30.4390007 59.6888636,30.4389819 59.6888446,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346174 59.6935301,30.4346147 59.6935224,30.4346086 59.6935129,30.4345932 59.6935014,30.4344744 59.6934215,30.4344752 59.6934118,30.4344684 59.6934032,30.4343048 59.693294,30.4335858 59.6928433,30.4335672 59.6928378,30.4335491 59.692831,30.4335344 59.6928246,30.4335169 59.6928158,30.4334908 59.6928019,30.4334747 59.6927935,30.4334378 59.6927735,30.4334063 59.6927569,30.4333486 59.6927221,30.4332896 59.6926848,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)),((30.4459925 59.6840515,30.4465029 59.6838166,30.4469327 59.6836721,30.4472874 59.6834226,30.4479163 59.6832392,30.4483415 59.6832476,30.4484247 59.6832514,30.4484595 59.6832547,30.4484884 59.6832585,30.4485108 59.6832641,30.4489705 59.6834352,30.4489993 59.6834563,30.4490069 59.6834636,30.4492468 59.6836887,30.4491255 59.6840718,30.4490543 59.6840686,30.4483928 59.684035,30.4478277 59.6840459,30.4469355 59.6841321,30.4462744 59.6842068,30.4459925 59.6840515)))', 'relation', 17990902, '{"name": "Государственный музей-заповедник «Павловск»", "note": "граница имущественного комплекса организации, не граница парка", "boundary": "protected_area", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q405637"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601,30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698)))', 'relation', 17786995, '{"landuse": "construction", "start_date": "06.204", "description": "реставрация Павильона Трех граций"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522477 59.6858088,30.4522705 59.6857319,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4527091 59.6855042,30.4528709 59.6855164,30.4529043 59.6855189,30.4529835 59.685525,30.4530542 59.6855302,30.4530286 59.6856166,30.4529796 59.6857822,30.4529559 59.6858622,30.4528897 59.6858572,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088)))', 'relation', 6636658, '{"height": "19.650", "architect": "Чарльз Камерон", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2.45", "building:part": "yes", "building:colour": "#FFE19C", "source:building:part": "http://pancer.ru/images/project/012/2.jpg"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4530216 59.6854636,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.453064 59.6855044,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 6636659, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528709 59.6855164,30.4528746 59.6855048,30.4528788 59.6854915,30.4529122 59.6854936,30.4529942 59.6854993,30.4529881 59.6855114,30.4529835 59.685525,30.4529043 59.6855189,30.4528709 59.6855164)))', 'relation', 14572596, '{"height": "6.65", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533818 59.6852214,30.453417 59.6852162,30.4534578 59.6852115,30.4535038 59.6852069,30.4535289 59.6853164,30.4535075 59.6853177,30.4534847 59.6853198,30.4534688 59.6853212,30.4534368 59.6853262,30.453436 59.6853248,30.4534146 59.6852887,30.4533878 59.6852355,30.4533818 59.6852214)))', 'relation', 17755881, '{"height": "13", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.453436 59.6853248,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533268 59.6853074,30.4532684 59.6852465)))', 'relation', 17755882, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.4533836 59.6852944,30.4533532 59.6853009,30.4533268 59.6853074,30.4532946 59.6853162,30.4532665 59.6853249,30.4532343 59.6853363,30.4532132 59.6853445,30.4531881 59.6853553,30.453164 59.6853668,30.4531411 59.6853788,30.4531158 59.6853933,30.4530954 59.6854062,30.4530746 59.6854199,30.4530552 59.6854344,30.4530382 59.6854491,30.4530216 59.6854636,30.4530079 59.6854761,30.4530004 59.6854886,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 17904735, '{"height": "10", "roof:shape": "flat", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.4528469 59.6846817,30.452843 59.684694,30.4529628 59.6847041,30.4530706 59.6847131,30.4530752 59.684699,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4535302 59.6851198,30.4535229 59.6851437,30.4535137 59.6851734,30.4535124 59.6851786,30.4535038 59.6852069,30.4534979 59.6851951,30.4534914 59.6851874,30.4534811 59.6851808,30.4534678 59.6851758,30.4534524 59.6851728,30.453436 59.6851719,30.4534196 59.6851732,30.4534028 59.6851772,30.4533891 59.6851835,30.4533796 59.6851915,30.4533752 59.6852006,30.4533763 59.68521,30.4533818 59.6852214,30.4533524 59.685227,30.4533302 59.6852316,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4528993 59.6854656,30.4528865 59.6854815,30.4528788 59.6854915,30.4528746 59.6855048,30.4527686 59.6854977,30.452777 59.6854654,30.4527565 59.685464,30.4527224 59.6854618,30.4526841 59.6854592,30.4526646 59.6854579,30.4526564 59.6854895,30.4525812 59.6854845,30.4525787 59.6854944,30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858,30.4522278 59.6851794)))', 'relation', 4274530, '{"fee": "yes", "ref": "IIIа", "name": "Собственный сад", "leisure": "garden", "name:fr": "Jardin privé", "ref:okn": "781620399040366", "tourism": "attraction", "alt_name": "Собственный садик", "boundary": "protected_area", "heritage": "2", "wikidata": "Q118122043", "start_date": "1803", "garden:style": "french", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6518/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4521745 59.6857248,30.4521808 59.6857036,30.4522002 59.685638,30.4522191 59.6855742,30.4522258 59.6855515,30.4522802 59.6855556,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533763 59.68521,30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540229 59.6848667,30.4540358 59.6848708,30.454047 59.6848759,30.4540561 59.6848821,30.454063 59.6848889,30.4540674 59.6848962,30.4540691 59.6849039,30.454068 59.6849115,30.4540643 59.6849189,30.454058 59.6849259,30.4540493 59.6849322,30.4540386 59.6849376,30.4540261 59.684942,30.4540122 59.6849452,30.4539975 59.684947,30.4539823 59.6849475,30.4539763 59.6849646,30.453965 59.6849637,30.4539277 59.6849606,30.4538688 59.6849558,30.4538059 59.6849506,30.4537818 59.6849487,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537483 59.6850789,30.4538612 59.6850876,30.4539247 59.6850925,30.4539406 59.6850424,30.4539786 59.6850519,30.4540221 59.685063,30.4540417 59.6850686,30.4540646 59.6850751,30.4541059 59.6850881,30.4541472 59.6851025,30.4541871 59.685118,30.4542254 59.6851343,30.4542622 59.6851516,30.4542942 59.6851377,30.4544115 59.6852076,30.4543838 59.6852203,30.4544141 59.6852392,30.4544426 59.6852588,30.4544691 59.6852791,30.4544972 59.6853031,30.4545225 59.6853279,30.4545451 59.6853534,30.4545829 59.6853462,30.4546442 59.6854282,30.4546081 59.6854351,30.4546263 59.6854611,30.4546407 59.6854917,30.4546513 59.6855211,30.4546577 59.6855509,30.4545667 59.6855569,30.4545695 59.6855677,30.4545502 59.6855689,30.4545521 59.6855762,30.454475 59.6855814,30.454473 59.685574,30.4544524 59.6855754,30.4544496 59.6855646,30.4544349 59.6855656,30.4543687 59.68557,30.4543619 59.6855441,30.4543522 59.6855184,30.4543439 59.6854971,30.4543247 59.685468,30.454307 59.6854434,30.4542866 59.6854194,30.4542636 59.6853959,30.4542381 59.6853732,30.4542062 59.685347,30.4541753 59.6853248,30.4541426 59.6853062,30.4541083 59.6852876,30.4540689 59.6852681,30.4540273 59.6852498,30.4539837 59.6852328,30.4539382 59.685217,30.4538908 59.6852026,30.4538877 59.6852126,30.4539316 59.6852158,30.4539299 59.6852218,30.4539248 59.68524,30.453923 59.6852463,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536921 59.6853643,30.4536766 59.6853631,30.453626 59.6853592,30.4536111 59.6853581,30.4536187 59.6853329,30.4534688 59.6853212,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.4532824 59.685393,30.4532679 59.6854007,30.4532019 59.6854356,30.4531881 59.6854429,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.45306 59.6855156,30.4530542 59.6855302,30.4530286 59.6856166,30.4530752 59.6856201,30.4531272 59.685624,30.4531226 59.6856395,30.4531 59.6857159,30.4530826 59.6857747,30.4530781 59.6857896,30.4530261 59.6857857,30.4529796 59.6857822,30.4529559 59.6858622,30.4529512 59.6858765,30.4529486 59.6858896,30.4529478 59.6859011,30.4529482 59.6859112,30.452952 59.685926,30.4529569 59.6859385,30.4529638 59.6859523,30.4529718 59.6859649,30.4529791 59.6859757,30.4529856 59.6859841,30.4530246 59.6859742,30.4530338 59.6859834,30.4530767 59.6860278,30.4530861 59.6860371,30.4530482 59.6860471,30.4530568 59.6860536,30.4530663 59.6860602,30.4530779 59.6860674,30.4530898 59.6860742,30.4531018 59.6860809,30.4531136 59.6860871,30.4531293 59.6860946,30.453148 59.6861029,30.4531695 59.6861116,30.4532167 59.6861306,30.4533686 59.6861421,30.453376 59.6861189,30.4533898 59.68612,30.4534436 59.6861244,30.453457 59.6861255,30.4534496 59.6861487,30.4536027 59.6861615,30.4535556 59.6863114,30.4535958 59.6863065,30.4536563 59.6862959,30.4537014 59.6862868,30.4537731 59.6862682,30.4538342 59.6862493,30.453879 59.6862345,30.4539364 59.686214,30.4539768 59.686198,30.45402 59.6861768,30.4540703 59.686148,30.4541119 59.6861223,30.4541469 59.6860952,30.4541742 59.6860729,30.4541995 59.6860505,30.4542215 59.6860272,30.4542918 59.6860451,30.4543031 59.6860479,30.4543127 59.6860386,30.45433 59.6860429,30.4543365 59.6860363,30.4544062 59.6860538,30.4543997 59.6860604,30.4544185 59.6860651,30.4544086 59.6860746,30.4544964 59.6860973,30.4544728 59.6861239,30.4544395 59.686154,30.4544059 59.686181,30.4543849 59.6861942,30.4544137 59.6862059,30.4542999 59.6862773,30.4542705 59.6862654,30.4542363 59.6862844,30.4541965 59.6863041,30.4541887 59.6863078,30.4542091 59.6863195,30.4542 59.6863235,30.4541696 59.6863371,30.4541607 59.6863411,30.4541407 59.6863296,30.4541297 59.6863344,30.4540887 59.6863495,30.4540549 59.6863624,30.4540219 59.6863729,30.4540399 59.6863883,30.4540005 59.6863999,30.4540172 59.6864141,30.4540057 59.6864176,30.4539576 59.686432,30.4539454 59.6864356,30.4539287 59.6864214,30.4538817 59.6864353,30.453863 59.6864194,30.4538212 59.6864281,30.4537814 59.6864354,30.4537376 59.6864434,30.4536952 59.6864492,30.4536556 59.6864553,30.4536188 59.68646,30.4535812 59.6864636,30.453575 59.6864544,30.4534768 59.6864467,30.4533659 59.6864383,30.4533611 59.6864525,30.4533485 59.6864515,30.4533248 59.6864494,30.4532998 59.6864473,30.4532869 59.6864462,30.4532916 59.686432,30.4532725 59.6864305,30.4532826 59.6863983,30.4531363 59.6863866,30.453138 59.686381,30.4531642 59.6862975,30.4531215 59.686294,30.4531372 59.6862455,30.4531795 59.686249,30.453196 59.6861992,30.4531704 59.6862175,30.4531608 59.6862141,30.453137 59.6862056,30.4531278 59.6862023,30.4531534 59.686184,30.4530963 59.6861616,30.4530418 59.6861992,30.4530167 59.6861897,30.4529804 59.6861727,30.4529497 59.6861561,30.4529175 59.6861373,30.4528879 59.6861175,30.4528659 59.6861008,30.4528406 59.6860793,30.4528174 59.6860572,30.4527956 59.6860336,30.4527791 59.6860133,30.4527643 59.6859927,30.4527472 59.6859643,30.4527383 59.6859422,30.4527314 59.6859191,30.4527279 59.6859036,30.4528174 59.6858982,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088,30.4522705 59.6857319,30.4522289 59.6857289,30.4521745 59.6857248)))', 'relation', 1759666, '{"name": "Павловский дворец", "name:ca": "Palau Pàvlovsk", "name:en": "Pavlovsk Palace", "name:fi": "Pavlovskin_palatsi", "name:fr": "Palais de Pavlovsk", "name:pt": "Palácio de Pavlovsk", "name:uz": "Pavlovsk saroyi", "name:zh": "巴甫洛夫斯克的宫殿", "ref:okn": "781610399040316", "tourism": "museum", "building": "palace", "historic": "yes", "int_name": "Palais de Pavlovsk", "wikidata": "Q118121947", "wikipedia": "ru:Павловский дворец", "start_date": "1782", "addr:street": "Садовая улица", "roof:colour": "#DADDE2", "building:colour": "#FFE19C", "addr:housenumber": "20 литА"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534688 59.6853212,30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536666 59.6853366,30.4536187 59.6853329,30.4534688 59.6853212)))', 'relation', 6636665, '{"name": "Южный корпус", "height": "15", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4534995 59.6852209)))', 'relation', 14572597, '{"height": "15", "roof:shape": "gabled", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540054 59.6848752,30.4537854 59.6848579,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537003 59.685133,30.453682 59.6851921,30.4535124 59.6851786)))', 'relation', 18019154, '{"height": "13", "roof:shape": "hipped", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL);
--Testcase 402:
SELECT count(*) FROM json_osm_test;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 404: オーク / Sồi
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 406:
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 407:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 408: 落葉性 / Cây rụng lá
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 409:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 410: 常緑植物 / Cây thường xanh
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 411:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 412: XVIII cent.
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 413:
DELETE FROM json_osm_test;
--Testcase 500:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/macaddr.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR"( "i" int OPTIONS (key 'true'), "m" macaddr) SERVER sqlite_svr OPTIONS (table 'type_MACADDR');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (1, '08:00:2b:01:02:03');
--Testcase 012:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (2, '08-00-2b-01-02-03');
--Testcase 013:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (3, '08002b:010203');
--Testcase 014:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (4, '08002b-010203');
--Testcase 015:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (5, '0800.2b01.0203');
--Testcase 016:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (6, '0800-2b01-0203');
--Testcase 017:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (7, '08002b010203');
--Testcase 018:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (8, '08:00:2F:01:02:03');
--Testcase 019:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (9, '08-00-2F-01-02-03');
--Testcase 020:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (10, '08002F:010203');
--Testcase 021:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (11, '08002F-010203');
--Testcase 022:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (12, '0800.2F01.0203');
--Testcase 023:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (13, '0800-2F01-0203');
--Testcase 024:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (14, '08002F010203');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (15, decode('08002F010203', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (16, decode('08002b010203', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE macaddr;
--Testcase 029:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (17, '08:00:2b:01:02:03');
--Testcase 030:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (18, '08-00-2b-01-02-03');
--Testcase 031:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (19, '08002b:010203');
--Testcase 032:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (20, '08002b-010203');
--Testcase 033:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (21, '0800.2b01.0203');
--Testcase 034:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (22, '0800-2b01-0203');
--Testcase 035:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (23, '08002b010203');
--Testcase 036:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (24, '08:00:2F:01:02:03');
--Testcase 037:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (25, '08-00-2F-01-02-03');
--Testcase 038:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (26, '08002F:010203');
--Testcase 039:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (27, '08002F-010203');
--Testcase 040:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (28, '0800.2F01.0203');
--Testcase 041:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (29, '0800-2F01-0203');
--Testcase 042:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (31, '08:00:2b:01:02:03');
--Testcase 046:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (32, '08-00-2b-01-02-03');
--Testcase 047:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (33, '08002b:010203');
--Testcase 048:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (34, '08002b-010203');
--Testcase 049:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (35, '0800.2b01.0203');
--Testcase 050:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (36, '0800-2b01-0203');
--Testcase 051:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (37, '08002b010203');
--Testcase 052:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (38, '08:00:2F:01:02:03');
--Testcase 053:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (39, '08-00-2F-01-02-03');
--Testcase 054:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (40, '08002F:010203');
--Testcase 055:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (41, '08002F-010203');
--Testcase 056:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (42, '0800.2F01.0203');
--Testcase 057:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (43, '0800-2F01-0203');
--Testcase 058:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (45, '08:00:2b:01:02:03');
--Testcase 062:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (46, '08-00-2b-01-02-03');
--Testcase 063:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (47, '08002b:010203');
--Testcase 064:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (48, '08002b-010203');
--Testcase 065:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (49, '0800.2b01.0203');
--Testcase 066:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (50, '0800-2b01-0203');
--Testcase 067:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (51, '08002b010203');
--Testcase 068:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (52, '08:00:2F:01:02:03');
--Testcase 069:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (53, '08-00-2F-01-02-03');
--Testcase 070:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (54, '08002F:010203');
--Testcase 071:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (55, '08002F-010203');
--Testcase 072:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (56, '0800.2F01.0203');
--Testcase 073:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (57, '0800-2F01-0203');
--Testcase 074:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR+"( "i" int OPTIONS (key 'true'), "m" macaddr, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR+');
--Testcase 077:
SELECT * FROM "type_MACADDR+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 084:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 088:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 091:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17; -- 9527026057731
--Testcase 098:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 106:
SELECT * FROM "type_MACADDR+";
--Testcase 107:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (59, '08:AA:2F:01:02:04');
--Testcase 108:
SELECT * FROM "type_MACADDR+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 111:
SELECT * FROM "type_MACADDR+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 115:
SELECT * FROM "type_MACADDR+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 119:
SELECT * FROM "type_MACADDR+";
--Testcase 120:
DELETE FROM "type_MACADDR";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (60, '01:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (61, '02:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (62, '03:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (63, '00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (64, '00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (65, '00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (66, '00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (67, '00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (68, '00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDRpk" (col macaddr OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDRpk" VALUES ('01-02-03-04-05-06');
--Testcase 159:
SELECT * FROM "type_MACADDRpk";
--Testcase 160:
DELETE FROM "type_MACADDRpk";
--no macaddr operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/macaddr8.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR8"( "i" int OPTIONS (key 'true'), "m" macaddr8) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (1, '08:00:2b:01:02:03:04:05');
--Testcase 012:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (2, '08-00-2b-01-02-03-04-05');
--Testcase 013:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (3, '08002b01:02030405');
--Testcase 014:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (4, '08002b01-02030405');
--Testcase 015:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (5, '0800.2b01.0203.0405');
--Testcase 016:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (6, '0800-2b01-0203-0405');
--Testcase 017:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (7, '08002b0102030405');
--Testcase 018:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (8, '08:00:2F:01:02:03:04:05');
--Testcase 019:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (9, '08-00-2F-01-02-03-04-05');
--Testcase 020:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (10, '08002F01:02030405');
--Testcase 021:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (11, '08002F01-02030405');
--Testcase 022:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (12, '0800.2F01.0203.0405');
--Testcase 023:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (13, '0800-2F01-0203-0405');
--Testcase 024:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (14, '08002F0102030405');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (15, decode('08002F0102030405', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (16, decode('08002b0102030405', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE macaddr8;
--Testcase 029:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (17, '08:00:2b:01:02:03:04:05');
--Testcase 030:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (18, '08-00-2b-01-02-03-04-05');
--Testcase 031:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (19, '08002b01:02030405');
--Testcase 032:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (20, '08002b01-02030405');
--Testcase 033:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (21, '0800.2b01.0203.0405');
--Testcase 034:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (22, '0800-2b01-0203-0405');
--Testcase 035:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (23, '08002b0102030405');
--Testcase 036:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (24, '08:00:2F:01:02:03:04:05');
--Testcase 037:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (25, '08-00-2F-01-02-03-04-05');
--Testcase 038:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (26, '08002F01:02030405');
--Testcase 039:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (27, '08002F01-02030405');
--Testcase 040:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (28, '0800.2F01.0203.0405');
--Testcase 041:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (29, '0800-2F01-0203-0405');
--Testcase 042:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (31, '08:00:2b:01:02:03:04:05');
--Testcase 046:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (32, '08-00-2b-01-02-03-04-05');
--Testcase 047:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (33, '08002b01:02030405');
--Testcase 048:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (34, '08002b01-02030405');
--Testcase 049:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (35, '0800.2b01.0203.0405');
--Testcase 050:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (36, '0800-2b01-0203-0405');
--Testcase 051:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (37, '08002b0102030405');
--Testcase 052:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (38, '08:00:2F:01:02:03:04:05');
--Testcase 053:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (39, '08-00-2F-01-02-03-04-05');
--Testcase 054:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (40, '08002F01:02030405');
--Testcase 055:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (41, '08002F01-02030405');
--Testcase 056:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (42, '0800.2F01.0203.0405');
--Testcase 057:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (43, '0800-2F01-0203-0405');
--Testcase 058:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (45, '08:00:2b:01:02:03:04:05');
--Testcase 062:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (46, '08-00-2b-01-02-03-04-05');
--Testcase 063:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (47, '08002b01:02030405');
--Testcase 064:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (48, '08002b01-02030405');
--Testcase 065:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (49, '0800.2b01.0203.0405');
--Testcase 066:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (50, '0800-2b01-0203-0405');
--Testcase 067:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (51, '08002b0102030405');
--Testcase 068:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (52, '08:00:2F:01:02:03:04:05');
--Testcase 069:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (53, '08-00-2F-01-02-03-04-05');
--Testcase 070:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (54, '08002F01:02030405');
--Testcase 071:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (55, '08002F01-02030405');
--Testcase 072:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (56, '0800.2F01.0203.0405');
--Testcase 073:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (57, '0800-2F01-0203-0405');
--Testcase 074:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR8+"( "i" int OPTIONS (key 'true'), "m" macaddr8, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8+');
--Testcase 077:
SELECT * FROM "type_MACADDR8+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 084:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 088:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 091:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 098:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 106:
SELECT * FROM "type_MACADDR8+";
--Testcase 107:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (59, '08:AA:2F:01:02:04:04:05');
--Testcase 108:
SELECT * FROM "type_MACADDR8+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 111:
SELECT * FROM "type_MACADDR8+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 115:
SELECT * FROM "type_MACADDR8+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 119:
SELECT * FROM "type_MACADDR8+";
--Testcase 120:
DELETE FROM "type_MACADDR8";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (60, '01:00:00:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (61, '02:00:00:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (62, '03:00:00:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (63, '00:00:00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (64, '00:00:00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (65, '00:00:00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (66, '00:00:00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (67, '00:00:00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (68, '00:00:00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR8" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR8" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDR8pk" (col macaddr8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDR8pk" VALUES ('01-02-03-04-05-06-07-08');
--Testcase 159:
SELECT * FROM "type_MACADDR8pk";
--Testcase 160:
DELETE FROM "type_MACADDR8pk";
--no macaddr8 operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR8";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/numeric.sql
================================================
--
-- NUMERIC
--
--Testcase 567:
CREATE EXTENSION sqlite_fdw;
--Testcase 568:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 569:
CREATE FOREIGN TABLE num_data (id int4 OPTIONS (key 'true'), val numeric(210,10)) SERVER sqlite_svr;
--Testcase 570:
CREATE FOREIGN TABLE num_exp_add (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 571:
CREATE FOREIGN TABLE num_exp_sub (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 572:
CREATE FOREIGN TABLE num_exp_div (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 573:
CREATE FOREIGN TABLE num_exp_mul (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 574:
CREATE FOREIGN TABLE num_exp_sqrt (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 575:
CREATE FOREIGN TABLE num_exp_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 576:
CREATE FOREIGN TABLE num_exp_log10 (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 577:
CREATE FOREIGN TABLE num_exp_power_10_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 578:
CREATE FOREIGN TABLE num_result (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), result numeric(210,10)) SERVER sqlite_svr;
-- ******************************
-- * The following EXPECTED results are computed by bc(1)
-- * with a scale of 200
-- ******************************
BEGIN TRANSACTION;
--Testcase 1:
INSERT INTO num_exp_add VALUES (0,0,'0');
--Testcase 2:
INSERT INTO num_exp_sub VALUES (0,0,'0');
--Testcase 3:
INSERT INTO num_exp_mul VALUES (0,0,'0');
--Testcase 4:
INSERT INTO num_exp_div VALUES (0,0,'NaN');
--Testcase 5:
INSERT INTO num_exp_add VALUES (0,1,'0');
--Testcase 6:
INSERT INTO num_exp_sub VALUES (0,1,'0');
--Testcase 7:
INSERT INTO num_exp_mul VALUES (0,1,'0');
--Testcase 8:
INSERT INTO num_exp_div VALUES (0,1,'NaN');
--Testcase 9:
INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047');
--Testcase 10:
INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047');
--Testcase 11:
INSERT INTO num_exp_mul VALUES (0,2,'0');
--Testcase 12:
INSERT INTO num_exp_div VALUES (0,2,'0');
--Testcase 13:
INSERT INTO num_exp_add VALUES (0,3,'4.31');
--Testcase 14:
INSERT INTO num_exp_sub VALUES (0,3,'-4.31');
--Testcase 15:
INSERT INTO num_exp_mul VALUES (0,3,'0');
--Testcase 16:
INSERT INTO num_exp_div VALUES (0,3,'0');
--Testcase 17:
INSERT INTO num_exp_add VALUES (0,4,'7799461.4119');
--Testcase 18:
INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119');
--Testcase 19:
INSERT INTO num_exp_mul VALUES (0,4,'0');
--Testcase 20:
INSERT INTO num_exp_div VALUES (0,4,'0');
--Testcase 21:
INSERT INTO num_exp_add VALUES (0,5,'16397.038491');
--Testcase 22:
INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491');
--Testcase 23:
INSERT INTO num_exp_mul VALUES (0,5,'0');
--Testcase 24:
INSERT INTO num_exp_div VALUES (0,5,'0');
--Testcase 25:
INSERT INTO num_exp_add VALUES (0,6,'93901.57763026');
--Testcase 26:
INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026');
--Testcase 27:
INSERT INTO num_exp_mul VALUES (0,6,'0');
--Testcase 28:
INSERT INTO num_exp_div VALUES (0,6,'0');
--Testcase 29:
INSERT INTO num_exp_add VALUES (0,7,'-83028485');
--Testcase 30:
INSERT INTO num_exp_sub VALUES (0,7,'83028485');
--Testcase 31:
INSERT INTO num_exp_mul VALUES (0,7,'0');
--Testcase 32:
INSERT INTO num_exp_div VALUES (0,7,'0');
--Testcase 33:
INSERT INTO num_exp_add VALUES (0,8,'74881');
--Testcase 34:
INSERT INTO num_exp_sub VALUES (0,8,'-74881');
--Testcase 35:
INSERT INTO num_exp_mul VALUES (0,8,'0');
--Testcase 36:
INSERT INTO num_exp_div VALUES (0,8,'0');
--Testcase 37:
INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420');
--Testcase 38:
INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420');
--Testcase 39:
INSERT INTO num_exp_mul VALUES (0,9,'0');
--Testcase 40:
INSERT INTO num_exp_div VALUES (0,9,'0');
--Testcase 41:
INSERT INTO num_exp_add VALUES (1,0,'0');
--Testcase 42:
INSERT INTO num_exp_sub VALUES (1,0,'0');
--Testcase 43:
INSERT INTO num_exp_mul VALUES (1,0,'0');
--Testcase 44:
INSERT INTO num_exp_div VALUES (1,0,'NaN');
--Testcase 45:
INSERT INTO num_exp_add VALUES (1,1,'0');
--Testcase 46:
INSERT INTO num_exp_sub VALUES (1,1,'0');
--Testcase 47:
INSERT INTO num_exp_mul VALUES (1,1,'0');
--Testcase 48:
INSERT INTO num_exp_div VALUES (1,1,'NaN');
--Testcase 49:
INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047');
--Testcase 50:
INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047');
--Testcase 51:
INSERT INTO num_exp_mul VALUES (1,2,'0');
--Testcase 52:
INSERT INTO num_exp_div VALUES (1,2,'0');
--Testcase 53:
INSERT INTO num_exp_add VALUES (1,3,'4.31');
--Testcase 54:
INSERT INTO num_exp_sub VALUES (1,3,'-4.31');
--Testcase 55:
INSERT INTO num_exp_mul VALUES (1,3,'0');
--Testcase 56:
INSERT INTO num_exp_div VALUES (1,3,'0');
--Testcase 57:
INSERT INTO num_exp_add VALUES (1,4,'7799461.4119');
--Testcase 58:
INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119');
--Testcase 59:
INSERT INTO num_exp_mul VALUES (1,4,'0');
--Testcase 60:
INSERT INTO num_exp_div VALUES (1,4,'0');
--Testcase 61:
INSERT INTO num_exp_add VALUES (1,5,'16397.038491');
--Testcase 62:
INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491');
--Testcase 63:
INSERT INTO num_exp_mul VALUES (1,5,'0');
--Testcase 64:
INSERT INTO num_exp_div VALUES (1,5,'0');
--Testcase 65:
INSERT INTO num_exp_add VALUES (1,6,'93901.57763026');
--Testcase 66:
INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026');
--Testcase 67:
INSERT INTO num_exp_mul VALUES (1,6,'0');
--Testcase 68:
INSERT INTO num_exp_div VALUES (1,6,'0');
--Testcase 69:
INSERT INTO num_exp_add VALUES (1,7,'-83028485');
--Testcase 70:
INSERT INTO num_exp_sub VALUES (1,7,'83028485');
--Testcase 71:
INSERT INTO num_exp_mul VALUES (1,7,'0');
--Testcase 72:
INSERT INTO num_exp_div VALUES (1,7,'0');
--Testcase 73:
INSERT INTO num_exp_add VALUES (1,8,'74881');
--Testcase 74:
INSERT INTO num_exp_sub VALUES (1,8,'-74881');
--Testcase 75:
INSERT INTO num_exp_mul VALUES (1,8,'0');
--Testcase 76:
INSERT INTO num_exp_div VALUES (1,8,'0');
--Testcase 77:
INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420');
--Testcase 78:
INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420');
--Testcase 79:
INSERT INTO num_exp_mul VALUES (1,9,'0');
--Testcase 80:
INSERT INTO num_exp_div VALUES (1,9,'0');
--Testcase 81:
INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047');
--Testcase 82:
INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047');
--Testcase 83:
INSERT INTO num_exp_mul VALUES (2,0,'0');
--Testcase 84:
INSERT INTO num_exp_div VALUES (2,0,'NaN');
--Testcase 85:
INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047');
--Testcase 86:
INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047');
--Testcase 87:
INSERT INTO num_exp_mul VALUES (2,1,'0');
--Testcase 88:
INSERT INTO num_exp_div VALUES (2,1,'NaN');
--Testcase 89:
INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094');
--Testcase 90:
INSERT INTO num_exp_sub VALUES (2,2,'0');
--Testcase 91:
INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209');
--Testcase 92:
INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000');
--Testcase 93:
INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047');
--Testcase 94:
INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047');
--Testcase 95:
INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257');
--Testcase 96:
INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266');
--Testcase 97:
INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047');
--Testcase 98:
INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047');
--Testcase 99:
INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593');
--Testcase 100:
INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685');
--Testcase 101:
INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047');
--Testcase 102:
INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047');
--Testcase 103:
INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077');
--Testcase 104:
INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429');
--Testcase 105:
INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787');
--Testcase 106:
INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307');
--Testcase 107:
INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222');
--Testcase 108:
INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940');
--Testcase 109:
INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047');
--Testcase 110:
INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953');
--Testcase 111:
INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795');
--Testcase 112:
INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518');
--Testcase 113:
INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047');
--Testcase 114:
INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047');
--Testcase 115:
INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407');
--Testcase 116:
INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476');
--Testcase 117:
INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467');
--Testcase 118:
INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627');
--Testcase 119:
INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740');
--Testcase 120:
INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811');
--Testcase 121:
INSERT INTO num_exp_add VALUES (3,0,'4.31');
--Testcase 122:
INSERT INTO num_exp_sub VALUES (3,0,'4.31');
--Testcase 123:
INSERT INTO num_exp_mul VALUES (3,0,'0');
--Testcase 124:
INSERT INTO num_exp_div VALUES (3,0,'NaN');
--Testcase 125:
INSERT INTO num_exp_add VALUES (3,1,'4.31');
--Testcase 126:
INSERT INTO num_exp_sub VALUES (3,1,'4.31');
--Testcase 127:
INSERT INTO num_exp_mul VALUES (3,1,'0');
--Testcase 128:
INSERT INTO num_exp_div VALUES (3,1,'NaN');
--Testcase 129:
INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047');
--Testcase 130:
INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047');
--Testcase 131:
INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257');
--Testcase 132:
INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352');
--Testcase 133:
INSERT INTO num_exp_add VALUES (3,3,'8.62');
--Testcase 134:
INSERT INTO num_exp_sub VALUES (3,3,'0');
--Testcase 135:
INSERT INTO num_exp_mul VALUES (3,3,'18.5761');
--Testcase 136:
INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000');
--Testcase 137:
INSERT INTO num_exp_add VALUES (3,4,'7799465.7219');
--Testcase 138:
INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019');
--Testcase 139:
INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289');
--Testcase 140:
INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552');
--Testcase 141:
INSERT INTO num_exp_add VALUES (3,5,'16401.348491');
--Testcase 142:
INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491');
--Testcase 143:
INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621');
--Testcase 144:
INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504');
--Testcase 145:
INSERT INTO num_exp_add VALUES (3,6,'93905.88763026');
--Testcase 146:
INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026');
--Testcase 147:
INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206');
--Testcase 148:
INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595');
--Testcase 149:
INSERT INTO num_exp_add VALUES (3,7,'-83028480.69');
--Testcase 150:
INSERT INTO num_exp_sub VALUES (3,7,'83028489.31');
--Testcase 151:
INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35');
--Testcase 152:
INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240');
--Testcase 153:
INSERT INTO num_exp_add VALUES (3,8,'74885.31');
--Testcase 154:
INSERT INTO num_exp_sub VALUES (3,8,'-74876.69');
--Testcase 155:
INSERT INTO num_exp_mul VALUES (3,8,'322737.11');
--Testcase 156:
INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553');
--Testcase 157:
INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420');
--Testcase 158:
INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420');
--Testcase 159:
INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020');
--Testcase 160:
INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854');
--Testcase 161:
INSERT INTO num_exp_add VALUES (4,0,'7799461.4119');
--Testcase 162:
INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119');
--Testcase 163:
INSERT INTO num_exp_mul VALUES (4,0,'0');
--Testcase 164:
INSERT INTO num_exp_div VALUES (4,0,'NaN');
--Testcase 165:
INSERT INTO num_exp_add VALUES (4,1,'7799461.4119');
--Testcase 166:
INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119');
--Testcase 167:
INSERT INTO num_exp_mul VALUES (4,1,'0');
--Testcase 168:
INSERT INTO num_exp_div VALUES (4,1,'NaN');
--Testcase 169:
INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047');
--Testcase 170:
INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047');
--Testcase 171:
INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593');
--Testcase 172:
INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385');
--Testcase 173:
INSERT INTO num_exp_add VALUES (4,3,'7799465.7219');
--Testcase 174:
INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019');
--Testcase 175:
INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289');
--Testcase 176:
INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883');
--Testcase 177:
INSERT INTO num_exp_add VALUES (4,4,'15598922.8238');
--Testcase 178:
INSERT INTO num_exp_sub VALUES (4,4,'0');
--Testcase 179:
INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161');
--Testcase 180:
INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000');
--Testcase 181:
INSERT INTO num_exp_add VALUES (4,5,'7815858.450391');
--Testcase 182:
INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409');
--Testcase 183:
INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429');
--Testcase 184:
INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061');
--Testcase 185:
INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026');
--Testcase 186:
INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974');
--Testcase 187:
INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094');
--Testcase 188:
INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606');
--Testcase 189:
INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881');
--Testcase 190:
INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119');
--Testcase 191:
INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715');
--Testcase 192:
INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637');
--Testcase 193:
INSERT INTO num_exp_add VALUES (4,8,'7874342.4119');
--Testcase 194:
INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119');
--Testcase 195:
INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839');
--Testcase 196:
INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143');
--Testcase 197:
INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420');
--Testcase 198:
INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420');
--Testcase 199:
INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980');
--Testcase 200:
INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409');
--Testcase 201:
INSERT INTO num_exp_add VALUES (5,0,'16397.038491');
--Testcase 202:
INSERT INTO num_exp_sub VALUES (5,0,'16397.038491');
--Testcase 203:
INSERT INTO num_exp_mul VALUES (5,0,'0');
--Testcase 204:
INSERT INTO num_exp_div VALUES (5,0,'NaN');
--Testcase 205:
INSERT INTO num_exp_add VALUES (5,1,'16397.038491');
--Testcase 206:
INSERT INTO num_exp_sub VALUES (5,1,'16397.038491');
--Testcase 207:
INSERT INTO num_exp_mul VALUES (5,1,'0');
--Testcase 208:
INSERT INTO num_exp_div VALUES (5,1,'NaN');
--Testcase 209:
INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047');
--Testcase 210:
INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047');
--Testcase 211:
INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077');
--Testcase 212:
INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446');
--Testcase 213:
INSERT INTO num_exp_add VALUES (5,3,'16401.348491');
--Testcase 214:
INSERT INTO num_exp_sub VALUES (5,3,'16392.728491');
--Testcase 215:
INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621');
--Testcase 216:
INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584');
--Testcase 217:
INSERT INTO num_exp_add VALUES (5,4,'7815858.450391');
--Testcase 218:
INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409');
--Testcase 219:
INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429');
--Testcase 220:
INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192');
--Testcase 221:
INSERT INTO num_exp_add VALUES (5,5,'32794.076982');
--Testcase 222:
INSERT INTO num_exp_sub VALUES (5,5,'0');
--Testcase 223:
INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081');
--Testcase 224:
INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000');
--Testcase 225:
INSERT INTO num_exp_add VALUES (5,6,'110298.61612126');
--Testcase 226:
INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926');
--Testcase 227:
INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766');
--Testcase 228:
INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689');
--Testcase 229:
INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509');
--Testcase 230:
INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491');
--Testcase 231:
INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135');
--Testcase 232:
INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710');
--Testcase 233:
INSERT INTO num_exp_add VALUES (5,8,'91278.038491');
--Testcase 234:
INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509');
--Testcase 235:
INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571');
--Testcase 236:
INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228');
--Testcase 237:
INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420');
--Testcase 238:
INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420');
--Testcase 239:
INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220');
--Testcase 240:
INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427');
--Testcase 241:
INSERT INTO num_exp_add VALUES (6,0,'93901.57763026');
--Testcase 242:
INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026');
--Testcase 243:
INSERT INTO num_exp_mul VALUES (6,0,'0');
--Testcase 244:
INSERT INTO num_exp_div VALUES (6,0,'NaN');
--Testcase 245:
INSERT INTO num_exp_add VALUES (6,1,'93901.57763026');
--Testcase 246:
INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026');
--Testcase 247:
INSERT INTO num_exp_mul VALUES (6,1,'0');
--Testcase 248:
INSERT INTO num_exp_div VALUES (6,1,'NaN');
--Testcase 249:
INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787');
--Testcase 250:
INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307');
--Testcase 251:
INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222');
--Testcase 252:
INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823');
--Testcase 253:
INSERT INTO num_exp_add VALUES (6,3,'93905.88763026');
--Testcase 254:
INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026');
--Testcase 255:
INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206');
--Testcase 256:
INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907');
--Testcase 257:
INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026');
--Testcase 258:
INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974');
--Testcase 259:
INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094');
--Testcase 260:
INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469');
--Testcase 261:
INSERT INTO num_exp_add VALUES (6,5,'110298.61612126');
--Testcase 262:
INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926');
--Testcase 263:
INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766');
--Testcase 264:
INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679');
--Testcase 265:
INSERT INTO num_exp_add VALUES (6,6,'187803.15526052');
--Testcase 266:
INSERT INTO num_exp_sub VALUES (6,6,'0');
--Testcase 267:
INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676');
--Testcase 268:
INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000');
--Testcase 269:
INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974');
--Testcase 270:
INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026');
--Testcase 271:
INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610');
--Testcase 272:
INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980');
--Testcase 273:
INSERT INTO num_exp_add VALUES (6,8,'168782.57763026');
--Testcase 274:
INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026');
--Testcase 275:
INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906');
--Testcase 276:
INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184');
--Testcase 277:
INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160');
--Testcase 278:
INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680');
--Testcase 279:
INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920');
--Testcase 280:
INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789');
--Testcase 281:
INSERT INTO num_exp_add VALUES (7,0,'-83028485');
--Testcase 282:
INSERT INTO num_exp_sub VALUES (7,0,'-83028485');
--Testcase 283:
INSERT INTO num_exp_mul VALUES (7,0,'0');
--Testcase 284:
INSERT INTO num_exp_div VALUES (7,0,'NaN');
--Testcase 285:
INSERT INTO num_exp_add VALUES (7,1,'-83028485');
--Testcase 286:
INSERT INTO num_exp_sub VALUES (7,1,'-83028485');
--Testcase 287:
INSERT INTO num_exp_mul VALUES (7,1,'0');
--Testcase 288:
INSERT INTO num_exp_div VALUES (7,1,'NaN');
--Testcase 289:
INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047');
--Testcase 290:
INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953');
--Testcase 291:
INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795');
--Testcase 292:
INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700');
--Testcase 293:
INSERT INTO num_exp_add VALUES (7,3,'-83028480.69');
--Testcase 294:
INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31');
--Testcase 295:
INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35');
--Testcase 296:
INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974');
--Testcase 297:
INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881');
--Testcase 298:
INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119');
--Testcase 299:
INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715');
--Testcase 300:
INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686');
--Testcase 301:
INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509');
--Testcase 302:
INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491');
--Testcase 303:
INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135');
--Testcase 304:
INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574');
--Testcase 305:
INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974');
--Testcase 306:
INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026');
--Testcase 307:
INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610');
--Testcase 308:
INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294');
--Testcase 309:
INSERT INTO num_exp_add VALUES (7,7,'-166056970');
--Testcase 310:
INSERT INTO num_exp_sub VALUES (7,7,'0');
--Testcase 311:
INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225');
--Testcase 312:
INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000');
--Testcase 313:
INSERT INTO num_exp_add VALUES (7,8,'-82953604');
--Testcase 314:
INSERT INTO num_exp_sub VALUES (7,8,'-83103366');
--Testcase 315:
INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285');
--Testcase 316:
INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118');
--Testcase 317:
INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420');
--Testcase 318:
INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580');
--Testcase 319:
INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700');
--Testcase 320:
INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382');
--Testcase 321:
INSERT INTO num_exp_add VALUES (8,0,'74881');
--Testcase 322:
INSERT INTO num_exp_sub VALUES (8,0,'74881');
--Testcase 323:
INSERT INTO num_exp_mul VALUES (8,0,'0');
--Testcase 324:
INSERT INTO num_exp_div VALUES (8,0,'NaN');
--Testcase 325:
INSERT INTO num_exp_add VALUES (8,1,'74881');
--Testcase 326:
INSERT INTO num_exp_sub VALUES (8,1,'74881');
--Testcase 327:
INSERT INTO num_exp_mul VALUES (8,1,'0');
--Testcase 328:
INSERT INTO num_exp_div VALUES (8,1,'NaN');
--Testcase 329:
INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047');
--Testcase 330:
INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047');
--Testcase 331:
INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407');
--Testcase 332:
INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615');
--Testcase 333:
INSERT INTO num_exp_add VALUES (8,3,'74885.31');
--Testcase 334:
INSERT INTO num_exp_sub VALUES (8,3,'74876.69');
--Testcase 335:
INSERT INTO num_exp_mul VALUES (8,3,'322737.11');
--Testcase 336:
INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410');
--Testcase 337:
INSERT INTO num_exp_add VALUES (8,4,'7874342.4119');
--Testcase 338:
INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119');
--Testcase 339:
INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839');
--Testcase 340:
INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956');
--Testcase 341:
INSERT INTO num_exp_add VALUES (8,5,'91278.038491');
--Testcase 342:
INSERT INTO num_exp_sub VALUES (8,5,'58483.961509');
--Testcase 343:
INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571');
--Testcase 344:
INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456');
--Testcase 345:
INSERT INTO num_exp_add VALUES (8,6,'168782.57763026');
--Testcase 346:
INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026');
--Testcase 347:
INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906');
--Testcase 348:
INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424');
--Testcase 349:
INSERT INTO num_exp_add VALUES (8,7,'-82953604');
--Testcase 350:
INSERT INTO num_exp_sub VALUES (8,7,'83103366');
--Testcase 351:
INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285');
--Testcase 352:
INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172');
--Testcase 353:
INSERT INTO num_exp_add VALUES (8,8,'149762');
--Testcase 354:
INSERT INTO num_exp_sub VALUES (8,8,'0');
--Testcase 355:
INSERT INTO num_exp_mul VALUES (8,8,'5607164161');
--Testcase 356:
INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000');
--Testcase 357:
INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420');
--Testcase 358:
INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420');
--Testcase 359:
INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020');
--Testcase 360:
INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735');
--Testcase 361:
INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420');
--Testcase 362:
INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420');
--Testcase 363:
INSERT INTO num_exp_mul VALUES (9,0,'0');
--Testcase 364:
INSERT INTO num_exp_div VALUES (9,0,'NaN');
--Testcase 365:
INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420');
--Testcase 366:
INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420');
--Testcase 367:
INSERT INTO num_exp_mul VALUES (9,1,'0');
--Testcase 368:
INSERT INTO num_exp_div VALUES (9,1,'NaN');
--Testcase 369:
INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467');
--Testcase 370:
INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627');
--Testcase 371:
INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740');
--Testcase 372:
INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526');
--Testcase 373:
INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420');
--Testcase 374:
INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420');
--Testcase 375:
INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020');
--Testcase 376:
INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677');
--Testcase 377:
INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420');
--Testcase 378:
INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420');
--Testcase 379:
INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980');
--Testcase 380:
INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484');
--Testcase 381:
INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420');
--Testcase 382:
INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420');
--Testcase 383:
INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220');
--Testcase 384:
INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807');
--Testcase 385:
INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160');
--Testcase 386:
INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680');
--Testcase 387:
INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920');
--Testcase 388:
INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280');
--Testcase 389:
INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420');
--Testcase 390:
INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580');
--Testcase 391:
INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700');
--Testcase 392:
INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689');
--Testcase 393:
INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420');
--Testcase 394:
INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420');
--Testcase 395:
INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020');
--Testcase 396:
INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748');
--Testcase 397:
INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840');
--Testcase 398:
INSERT INTO num_exp_sub VALUES (9,9,'0');
--Testcase 399:
INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400');
--Testcase 400:
INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 401:
INSERT INTO num_exp_sqrt VALUES (0,'0');
--Testcase 402:
INSERT INTO num_exp_sqrt VALUES (1,'0');
--Testcase 403:
INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505');
--Testcase 404:
INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396');
--Testcase 405:
INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923');
--Testcase 406:
INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473');
--Testcase 407:
INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406');
--Testcase 408:
INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230');
--Testcase 409:
INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542');
--Testcase 410:
INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 411:
INSERT INTO num_exp_ln VALUES (0,'NaN');
--Testcase 412:
INSERT INTO num_exp_ln VALUES (1,'NaN');
--Testcase 413:
INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514');
--Testcase 414:
INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971');
--Testcase 415:
INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464');
--Testcase 416:
INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038');
--Testcase 417:
INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127');
--Testcase 418:
INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991');
--Testcase 419:
INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668');
--Testcase 420:
INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 421:
INSERT INTO num_exp_log10 VALUES (0,'NaN');
--Testcase 422:
INSERT INTO num_exp_log10 VALUES (1,'NaN');
--Testcase 423:
INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459');
--Testcase 424:
INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075');
--Testcase 425:
INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345');
--Testcase 426:
INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626');
--Testcase 427:
INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671');
--Testcase 428:
INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914');
--Testcase 429:
INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138');
--Testcase 430:
INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 431:
INSERT INTO num_exp_power_10_ln VALUES (0,'NaN');
--Testcase 432:
INSERT INTO num_exp_power_10_ln VALUES (1,'NaN');
--Testcase 433:
INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184');
--Testcase 434:
INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393');
--Testcase 435:
INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636');
--Testcase 436:
INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098');
--Testcase 437:
INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067');
--Testcase 438:
INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627');
--Testcase 439:
INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952');
--Testcase 440:
INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 441:
INSERT INTO num_data VALUES (0, '0');
--Testcase 442:
INSERT INTO num_data VALUES (1, '0');
--Testcase 443:
INSERT INTO num_data VALUES (2, '-34338492.215397047');
--Testcase 444:
INSERT INTO num_data VALUES (3, '4.31');
--Testcase 445:
INSERT INTO num_data VALUES (4, '7799461.4119');
--Testcase 446:
INSERT INTO num_data VALUES (5, '16397.038491');
--Testcase 447:
INSERT INTO num_data VALUES (6, '93901.57763026');
--Testcase 448:
INSERT INTO num_data VALUES (7, '-83028485');
--Testcase 449:
INSERT INTO num_data VALUES (8, '74881');
--Testcase 450:
INSERT INTO num_data VALUES (9, '-24926804.045047420');
COMMIT TRANSACTION;
-- ******************************
-- * Create indices for faster checks
-- ******************************
-- Skip these setting, creating foreign table with primary key already covered.
--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
-- ******************************
--Testcase 451:
DELETE FROM num_result;
--Testcase 452:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val
FROM num_data t1, num_data t2;
--Testcase 453:
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;
--Testcase 454:
DELETE FROM num_result;
--Testcase 455:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10)
FROM num_data t1, num_data t2;
--Testcase 456:
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
-- ******************************
--Testcase 457:
DELETE FROM num_result;
--Testcase 458:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val
FROM num_data t1, num_data t2;
--Testcase 459:
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;
--Testcase 460:
DELETE FROM num_result;
--Testcase 461:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40)
FROM num_data t1, num_data t2;
--Testcase 462:
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
-- ******************************
--Testcase 463:
DELETE FROM num_result;
--Testcase 464:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val
FROM num_data t1, num_data t2;
--Testcase 465:
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;
--Testcase 466:
DELETE FROM num_result;
--Testcase 467:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30)
FROM num_data t1, num_data t2;
--Testcase 468:
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
-- ******************************
--Testcase 469:
DELETE FROM num_result;
--Testcase 470:
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';
--Testcase 471:
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;
--Testcase 472:
DELETE FROM num_result;
--Testcase 473:
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';
--Testcase 474:
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
-- ******************************
--Testcase 475:
DELETE FROM num_result;
--Testcase 476:
INSERT INTO num_result SELECT id, 0, SQRT(ABS(val))
FROM num_data;
--Testcase 477:
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
-- ******************************
--Testcase 478:
DELETE FROM num_result;
--Testcase 479:
INSERT INTO num_result SELECT id, 0, LN(ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 480:
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
-- ******************************
--Testcase 481:
DELETE FROM num_result;
--Testcase 482:
INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 483:
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
-- ******************************
--Testcase 484:
DELETE FROM num_result;
--Testcase 485:
INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
FROM num_data
WHERE val != '0.0';
--Testcase 486:
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.
-- ******************************
--Testcase 1451:
CREATE FOREIGN TABLE v (id int4 OPTIONS (key 'true'), x numeric, val float8) SERVER sqlite_svr;
BEGIN;
--Testcase 1452:
DELETE FROM v;
--Testcase 1453:
INSERT INTO v(x) VALUES ('0'::float8),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan');
--Testcase 1454:
SELECT x1, x2,
x1::numeric + x2::numeric AS sum,
x1::numeric - x2::numeric AS diff,
x1::numeric * x2::numeric AS prod
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1455:
SELECT x1, x2,
x1::numeric / x2::numeric AS quot,
x1::numeric % x2::numeric AS mod,
div(x1::numeric, x2::numeric) AS div
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x2 != 0;
ROLLBACK;
BEGIN;
--Testcase 1286:
DELETE FROM v;
--Testcase 1287:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1288:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1289:
DELETE FROM v;
--Testcase 1290:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1291:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1292:
DELETE FROM v;
--Testcase 1293:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1294:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1295:
DELETE FROM v;
--Testcase 1296:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1297:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1298:
DELETE FROM v;
--Testcase 1299:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1300:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1301:
DELETE FROM v;
--Testcase 1302:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1303:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1304:
DELETE FROM v;
--Testcase 1305:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1306:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1307:
DELETE FROM v;
--Testcase 1308:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1309:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1310:
DELETE FROM v;
--Testcase 1311:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1312:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1313:
DELETE FROM v;
--Testcase 1314:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1315:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1316:
DELETE FROM v;
--Testcase 1317:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1318:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1319:
DELETE FROM v;
--Testcase 1320:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1321:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1456:
DELETE FROM v;
--Testcase 1457:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1458:
SELECT x, -x as minusx, abs(x::numeric), floor(x::numeric), ceil(x::numeric), sign(x::numeric), numeric_inc(x::numeric) as inc
FROM v;
ROLLBACK;
BEGIN;
--Testcase 1459:
DELETE FROM v;
--Testcase 1460:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1461:
SELECT x, round(x::numeric), round(x::numeric,1) as round1, trunc(x::numeric), trunc(x::numeric,1) as trunc1
FROM v;
ROLLBACK;
-- the large values fall into the numeric abbreviation code's maximal classes
BEGIN;
--Testcase 1462:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),
('inf'),('-inf'),('nan'),
('inf'),('-inf'),('nan');
--Testcase 1463:
SELECT substring(x::text, 1, 32) FROM v ORDER BY x;
ROLLBACK;
--Testcase 1464:
DELETE FROM v;
--Testcase 1465:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('4.2'),('inf'),('nan');
--Testcase 1466:
SELECT x, sqrt(x) FROM v;
--Testcase 1333:
DELETE FROM v;
--Testcase 1334:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1335:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1336:
DELETE FROM v;
--Testcase 1337:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1338:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1467:
DELETE FROM v;
--Testcase 1468:
INSERT INTO v(x) VALUES ('1'::numeric),('4.2'),('inf'),('nan');
--Testcase 1469:
SELECT x,
log(x::numeric),
log10(x::numeric),
ln(x::numeric)
FROM v;
--Testcase 1342:
DELETE FROM v;
--Testcase 1343:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1344:
SELECT ln(x::numeric) FROM v;
--Testcase 1345:
DELETE FROM v;
--Testcase 1346:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1347:
SELECT ln(x::numeric) FROM v;
--Testcase 1348:
DELETE FROM v;
--Testcase 1349:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1350:
SELECT ln(x::numeric) FROM v;
--Testcase 1470:
DELETE FROM v;
--Testcase 1471:
INSERT INTO v(x) VALUES ('2'::numeric),('4.2'),('inf'),('nan');
--Testcase 1472:
SELECT x1, x2,
log(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1354:
DELETE FROM v;
--Testcase 1355:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1356:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1357:
DELETE FROM v;
--Testcase 1358:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1359:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1360:
DELETE FROM v;
--Testcase 1361:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1362:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1363:
DELETE FROM v;
--Testcase 1364:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1365:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1366:
DELETE FROM v;
--Testcase 1367:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1368:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1369:
DELETE FROM v;
--Testcase 1370:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1371:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1372:
DELETE FROM v;
--Testcase 1373:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1374:
SELECT log(x::numeric, 'inf') FROM v;
--Testcase 1473:
DELETE FROM v;
--Testcase 1474:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('2'),('4.2'),('inf'),('nan');
--Testcase 1475:
SELECT x1, x2,
power(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x1 != 0 OR x2 >= 0;
--Testcase 1378:
DELETE FROM v;
--Testcase 1379:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1380:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1381:
DELETE FROM v;
--Testcase 1382:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1383:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1384:
DELETE FROM v;
--Testcase 1385:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1386:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1387:
DELETE FROM v;
--Testcase 1388:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1389:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1390:
DELETE FROM v;
--Testcase 1391:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1392:
SELECT power(x::numeric, '3.3') FROM v;
--Testcase 1393:
DELETE FROM v;
--Testcase 1394:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1395:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1396:
DELETE FROM v;
--Testcase 1397:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1398:
SELECT power(x::numeric, '-1.5') FROM v;
--Testcase 1399:
DELETE FROM v;
--Testcase 1400:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1401:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1402:
DELETE FROM v;
--Testcase 1403:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1404:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1405:
DELETE FROM v;
--Testcase 1406:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1407:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1408:
DELETE FROM v;
--Testcase 1409:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1410:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1411:
DELETE FROM v;
--Testcase 1412:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1413:
SELECT power(x::numeric, '2') FROM v;
--Testcase 1414:
DELETE FROM v;
--Testcase 1415:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1416:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1417:
DELETE FROM v;
--Testcase 1418:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1419:
SELECT power(x::numeric, '4.5') FROM v;
--Testcase 1420:
DELETE FROM v;
--Testcase 1421:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1422:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1423:
DELETE FROM v;
--Testcase 1424:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1425:
SELECT power(x::numeric, '-3') FROM v;
--Testcase 1426:
DELETE FROM v;
--Testcase 1427:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1428:
SELECT power(x::numeric, '0') FROM v;
--Testcase 1429:
DELETE FROM v;
--Testcase 1430:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1431:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1432:
DELETE FROM v;
--Testcase 1433:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1434:
SELECT power(x::numeric, '-inf') FROM v;
-- ******************************
-- * miscellaneous checks for things that have been broken in the past...
-- ******************************
-- numeric AVG used to fail on some platforms
--Testcase 487:
SELECT AVG(val) FROM num_data;
--Testcase 1137:
SELECT MAX(val) FROM num_data;
--Testcase 1138:
SELECT MIN(val) FROM num_data;
--Testcase 488:
SELECT STDDEV(val) FROM num_data;
--Testcase 489:
SELECT VARIANCE(val) FROM num_data;
-- Check for appropriate rounding and overflow
--Testcase 579:
CREATE FOREIGN TABLE fract_only (id int, val numeric(4,4)) SERVER sqlite_svr;
--Testcase 490:
INSERT INTO fract_only VALUES (1, '0.0');
--Testcase 491:
INSERT INTO fract_only VALUES (2, '0.1');
--Testcase 492:
INSERT INTO fract_only VALUES (3, '1.0'); -- should fail
--Testcase 493:
INSERT INTO fract_only VALUES (4, '-0.9999');
--Testcase 494:
INSERT INTO fract_only VALUES (5, '0.99994');
--Testcase 495:
INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail
--Testcase 496:
INSERT INTO fract_only VALUES (7, '0.00001');
--Testcase 497:
INSERT INTO fract_only VALUES (8, '0.00017');
--Testcase 1139:
INSERT INTO fract_only VALUES (9, 'NaN');
--Testcase 1140:
INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail
--Testcase 1141:
INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail
--Testcase 498:
SELECT * FROM fract_only;
--Testcase 580:
DROP FOREIGN TABLE fract_only;
-- Check conversion to integers
-- SQLite promises to preserve the first 15 significant decimal digits of the floating point value.
-- However, it makes no guarantees about the accuracy of computations on floating point values, as no such guarantees are possible.
-- A floating-point value as written in an SQL statement may not be the same as the value represented internally.
-- Actual result is different from expected result.
--Testcase 1485:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 1486:
DELETE FROM num_tmp;
--Testcase 1487:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.5);
--Testcase 1488:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1489:
DELETE FROM num_tmp;
--Testcase 1490:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.4);
--Testcase 1491:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1492:
DELETE FROM num_tmp;
--Testcase 1493:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.4);
--Testcase 1494:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1495:
DELETE FROM num_tmp;
--Testcase 1496:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.5);
--Testcase 1497:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1498:
DELETE FROM num_tmp;
--Testcase 1499:
INSERT INTO num_tmp(n1) VALUES (-2147483648.5);
--Testcase 1500:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1501:
DELETE FROM num_tmp;
--Testcase 1502:
INSERT INTO num_tmp(n1) VALUES (-2147483648.4);
--Testcase 1503:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1504:
DELETE FROM num_tmp;
--Testcase 1505:
INSERT INTO num_tmp(n1) VALUES (2147483647.4);
--Testcase 1506:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1507:
DELETE FROM num_tmp;
--Testcase 1508:
INSERT INTO num_tmp(n1) VALUES (2147483647.5);
--Testcase 1509:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1510:
DELETE FROM num_tmp;
--Testcase 1511:
INSERT INTO num_tmp(n1) VALUES (-32768.5);
--Testcase 1512:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1513:
DELETE FROM num_tmp;
--Testcase 1514:
INSERT INTO num_tmp(n1) VALUES (-32768.4);
--Testcase 1515:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1516:
DELETE FROM num_tmp;
--Testcase 1517:
INSERT INTO num_tmp(n1) VALUES (32767.4);
--Testcase 1518:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1519:
DELETE FROM num_tmp;
--Testcase 1520:
INSERT INTO num_tmp(n1) VALUES (32767.5);
--Testcase 1521:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1555:
DELETE FROM num_tmp;
--Testcase 1555:
DROP FOREIGN TABLE num_tmp;
-- Check inf/nan conversion behavior
--Testcase 581:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 582:
DELETE FROM FLOAT8_TMP;
--Testcase 583:
INSERT INTO FLOAT8_TMP VALUES ('NaN');
--Testcase 584:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 585:
DELETE FROM FLOAT8_TMP;
--Testcase 586:
INSERT INTO FLOAT8_TMP VALUES ('Infinity');
--Testcase 587:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 588:
DELETE FROM FLOAT8_TMP;
--Testcase 589:
INSERT INTO FLOAT8_TMP VALUES ('-Infinity');
--Testcase 590:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 1142:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, f2 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1143:
DELETE FROM NUMERIC_TMP;
--Testcase 1144:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1145:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1146:
DELETE FROM NUMERIC_TMP;
--Testcase 1147:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1148:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1149:
DELETE FROM NUMERIC_TMP;
--Testcase 1150:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1151:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 591:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 592:
DELETE FROM FLOAT4_TMP;
--Testcase 593:
INSERT INTO FLOAT4_TMP VALUES ('NaN');
--Testcase 594:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 595:
DELETE FROM FLOAT4_TMP;
--Testcase 596:
INSERT INTO FLOAT4_TMP VALUES ('Infinity');
--Testcase 597:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 598:
DELETE FROM FLOAT4_TMP;
--Testcase 599:
INSERT INTO FLOAT4_TMP VALUES ('-Infinity');
--Testcase 600:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 1152:
DELETE FROM NUMERIC_TMP;
--Testcase 1153:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1154:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1155:
DELETE FROM NUMERIC_TMP;
--Testcase 1156:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1157:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1158:
DELETE FROM NUMERIC_TMP;
--Testcase 1159:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1160:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1161:
DELETE FROM NUMERIC_TMP;
--Testcase 1162:
INSERT INTO NUMERIC_TMP VALUES ('42'::int2);
--Testcase 1163:
SELECT f1::numeric FROM NUMERIC_TMP;
--Testcase 1164:
DELETE FROM NUMERIC_TMP;
--Testcase 1165:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1166:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1167:
DELETE FROM NUMERIC_TMP;
--Testcase 1168:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1169:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1170:
DELETE FROM NUMERIC_TMP;
--Testcase 1171:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1172:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1173:
DELETE FROM NUMERIC_TMP;
--Testcase 1174:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1175:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1176:
DELETE FROM NUMERIC_TMP;
--Testcase 1177:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1178:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1179:
DELETE FROM NUMERIC_TMP;
--Testcase 1180:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1181:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1182:
DELETE FROM NUMERIC_TMP;
--Testcase 1183:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1184:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1185:
DELETE FROM NUMERIC_TMP;
--Testcase 1186:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1187:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1188:
DELETE FROM NUMERIC_TMP;
--Testcase 1189:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1190:
SELECT f1::int8 FROM NUMERIC_TMP;
-- Simple check that ceil(), floor(), and round() work correctly
--Testcase 601:
CREATE FOREIGN TABLE ceil_floor_round (a numeric OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 499:
INSERT INTO ceil_floor_round VALUES ('-5.5');
--Testcase 500:
INSERT INTO ceil_floor_round VALUES ('-5.499999');
--Testcase 501:
INSERT INTO ceil_floor_round VALUES ('9.5');
--Testcase 502:
INSERT INTO ceil_floor_round VALUES ('9.4999999');
--Testcase 503:
INSERT INTO ceil_floor_round VALUES ('0.0');
--Testcase 504:
INSERT INTO ceil_floor_round VALUES ('0.0000001');
--Testcase 505:
INSERT INTO ceil_floor_round VALUES ('-0.000001');
--Testcase 506:
SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round ORDER BY a;
-- Check rounding, it should round ties away from zero.
--Testcase 602:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 603:
DELETE FROM INT4_TMP;
--Testcase 604:
INSERT INTO INT4_TMP SELECT a FROM generate_series(-5,5) a;
--Testcase 605:
SELECT f1 as pow,
round((-2.5 * 10 ^ f1)::numeric, -f1),
round((-1.5 * 10 ^ f1)::numeric, -f1),
round((-0.5 * 10 ^ f1)::numeric, -f1),
round((0.5 * 10 ^ f1)::numeric, -f1),
round((1.5 * 10 ^ f1)::numeric, -f1),
round((2.5 * 10 ^ f1)::numeric, -f1)
FROM INT4_TMP;
-- Testing for width_bucket(). For convenience, we test both the
-- numeric and float8 versions of the function in this file.
-- errors
--Testcase 606:
CREATE FOREIGN TABLE width_bucket_tbl (
id1 numeric,
id2 numeric,
id3 numeric,
id4 int,
id int OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 607:
DELETE FROM width_bucket_tbl;
--Testcase 608:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 609:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 610:
DELETE FROM width_bucket_tbl;
--Testcase 611:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 612:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 613:
DELETE FROM width_bucket_tbl;
--Testcase 614:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 615:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 616:
DELETE FROM width_bucket_tbl;
--Testcase 617:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 618:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 619:
DELETE FROM width_bucket_tbl;
--Testcase 620:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 621:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 622:
DELETE FROM width_bucket_tbl;
--Testcase 623:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 624:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 625:
DELETE FROM width_bucket_tbl;
--Testcase 626:
INSERT INTO width_bucket_tbl VALUES ('NaN'::numeric, 3.0, 4.0, 888);
--Testcase 627:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 628:
DELETE FROM width_bucket_tbl;
--Testcase 629:
INSERT INTO width_bucket_tbl VALUES (0, 'NaN'::numeric, 4.0, 888);
--Testcase 630:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 1191:
DELETE FROM width_bucket_tbl;
--Testcase 1192:
INSERT INTO width_bucket_tbl VALUES (2.0, 3.0, '-inf'::numeric, 888);
--Testcase 1193:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 1194:
DELETE FROM width_bucket_tbl;
--Testcase 1195:
INSERT INTO width_bucket_tbl VALUES (0, '-inf'::numeric, 4.0 , 888);
--Testcase 1196:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
-- normal operation
--Testcase 631:
CREATE FOREIGN TABLE width_bucket_test (
operand_num numeric OPTIONS (key 'true'),
operand_f8 float8
) SERVER sqlite_svr;
--COPY width_bucket_test (operand_num) FROM stdin;
--Testcase 507:
INSERT INTO width_bucket_test (operand_num) 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);
--Testcase 508:
UPDATE width_bucket_test SET operand_f8 = operand_num::float8;
--Testcase 509:
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
--Testcase 1197:
DELETE FROM width_bucket_tbl;
--Testcase 1198:
INSERT INTO width_bucket_tbl VALUES (0.0, 'Infinity'::numeric , 5, 10);
--Testcase 1199:
SELECT width_bucket(id1::numeric, 'Infinity'::numeric, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 1200:
DELETE FROM width_bucket_tbl;
--Testcase 1201:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, '-Infinity'::numeric, 20);
--Testcase 1202:
SELECT width_bucket(id1::numeric, id2, '-Infinity'::numeric, id4) FROM width_bucket_tbl; -- error
--Testcase 1203:
DELETE FROM width_bucket_tbl;
--Testcase 1204:
INSERT INTO width_bucket_tbl VALUES ('Infinity'::numeric, 1, 10, 10), ('-Infinity'::numeric, 1, 10, 10);
--Testcase 1205:
SELECT width_bucket(id1::numeric, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 510:
DELETE FROM width_bucket_tbl;
-- postgres does not support insert 'Infinity' and '-Infinity' as numeric.
--Testcase 632:
INSERT INTO width_bucket_tbl VALUES (0.0, 0.0, 5, 10);
--Testcase 633:
SELECT width_bucket(id1::float8, 'Infinity'::float8, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 511:
DELETE FROM width_bucket_tbl;
--Testcase 634:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, 0.0, 20);
--Testcase 635:
SELECT width_bucket(id1::float8, id2, 'Infinity'::float8, id4) FROM width_bucket_tbl; -- error
--Testcase 512:
DELETE FROM width_bucket_tbl;
--Testcase 636:
INSERT INTO width_bucket_tbl VALUES (0.0, 1, 10, 10);
--Testcase 637:
SELECT width_bucket('Infinity'::float8, id2, id3, id4), width_bucket('-Infinity'::float8, id2, id3, id4) FROM width_bucket_tbl;
-- Simple test for roundoff error when results should be exact
--Testcase 1445:
DELETE FROM width_bucket_tbl;
--Testcase 1446:
INSERT INTO width_bucket_tbl SELECT x, 10, 100, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1447:
SELECT id1, width_bucket(id1::float8, id2, id3, id4) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
--Testcase 1448:
DELETE FROM width_bucket_tbl;
--Testcase 1449:
INSERT INTO width_bucket_tbl SELECT x, 100, 10, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1450:
SELECT id1, width_bucket(id1::float8, 100, 10, 9) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
--Testcase 638:
DROP FOREIGN TABLE width_bucket_test;
-- TO_CHAR()
--
--Testcase 513:
SELECT to_char(val, '9G999G999G999G999G999')
FROM num_data;
--Testcase 514:
SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999')
FROM num_data;
--Testcase 515:
SELECT to_char(val, '9999999999999999.999999999999999PR')
FROM num_data;
--Testcase 516:
SELECT to_char(val, '9999999999999999.999999999999999S')
FROM num_data;
--Testcase 517:
SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data;
--Testcase 518:
SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data;
--Testcase 519:
SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data;
--Testcase 520:
SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data;
--Testcase 521:
SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data;
--Testcase 522:
SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data;
--Testcase 523:
SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data;
--Testcase 524:
SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data;
--Testcase 525:
SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data;
--Testcase 526:
SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data;
--Testcase 527:
SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data;
--Testcase 528:
SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data;
--Testcase 529:
SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data;
--Testcase 530:
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;
--Testcase 531:
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;
--Testcase 532:
SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data;
--Testcase 533:
SELECT to_char(val, '999999SG9999999999') FROM num_data;
--Testcase 534:
SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data;
--Testcase 535:
SELECT to_char(val, '9.999EEEE') FROM num_data;
--Testcase 1476:
DELETE FROM v;
--Testcase 1477:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1478:
SELECT x,
to_char(x, '9.999EEEE') as numeric,
to_char(x::float8, '9.999EEEE') as float8,
to_char(x::float4, '9.999EEEE') as float4
FROM v;
--Testcase 1522:
DELETE FROM v;
--Testcase 1523:
INSERT INTO v(x) VALUES (-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0),
(1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071);
--Testcase 1524:
SELECT x,
to_char(('1.2345e'||x)::numeric, '9.999EEEE') as numeric
FROM v;
--Testcase 1479:
DELETE FROM v;
--Testcase 1480:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1481:
SELECT x,
to_char(x, 'MI9999999999.99') as numeric,
to_char(x::float8, 'MI9999999999.99') as float8,
to_char(x::float4, 'MI9999999999.99') as float4
FROM v;
--Testcase 1482:
DELETE FROM v;
--Testcase 1483:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1484:
SELECT x,
to_char(x, 'MI99.99') as numeric,
to_char(x::float8, 'MI99.99') as float8,
to_char(x::float4, 'MI99.99') as float4
FROM v;
--Testcase 536:
DELETE FROM ceil_floor_round;
--Testcase 537:
INSERT INTO ceil_floor_round VALUES ('100'::numeric);
--Testcase 538:
SELECT to_char(a, 'FM999.9') FROM ceil_floor_round;
--Testcase 539:
SELECT to_char(a, 'FM999.') FROM ceil_floor_round;
--Testcase 540:
SELECT to_char(a, 'FM999') FROM ceil_floor_round;
-- Check parsing of literal text in a format string
--Testcase 541:
SELECT to_char(a, 'foo999') FROM ceil_floor_round;
--Testcase 542:
SELECT to_char(a, 'f\oo999') FROM ceil_floor_round;
--Testcase 543:
SELECT to_char(a, 'f\\oo999') FROM ceil_floor_round;
--Testcase 544:
SELECT to_char(a, 'f\"oo999') FROM ceil_floor_round;
--Testcase 545:
SELECT to_char(a, 'f\\"oo999') FROM ceil_floor_round;
--Testcase 546:
SELECT to_char(a, 'f"ool"999') FROM ceil_floor_round;
--Testcase 547:
SELECT to_char(a, 'f"\ool"999') FROM ceil_floor_round;
--Testcase 548:
SELECT to_char(a, 'f"\\ool"999') FROM ceil_floor_round;
--Testcase 549:
SELECT to_char(a, 'f"ool\"999') FROM ceil_floor_round;
--Testcase 550:
SELECT to_char(a, 'f"ool\\"999') FROM ceil_floor_round;
-- TO_NUMBER()
--
--Testcase 639:
create foreign table to_number_tbl (a text, id int options (key 'true')) server sqlite_svr;
--Testcase 1211:
SET lc_numeric = 'C';
--Testcase 640:
DELETE FROM to_number_tbl;
--Testcase 641:
INSERT INTO to_number_tbl VALUES ('-34,338,492');
--Testcase 642:
SELECT to_number(a, '99G999G999') FROM to_number_tbl;
--Testcase 643:
DELETE FROM to_number_tbl;
--Testcase 644:
INSERT INTO to_number_tbl VALUES ('-34,338,492.654,878');
--Testcase 645:
SELECT to_number(a, '99G999G999D999G999') FROM to_number_tbl;
--Testcase 646:
DELETE FROM to_number_tbl;
--Testcase 647:
INSERT INTO to_number_tbl VALUES ('<564646.654564>');
--Testcase 648:
SELECT to_number(a, '999999.999999PR') FROM to_number_tbl;
--Testcase 649:
DELETE FROM to_number_tbl;
--Testcase 650:
INSERT INTO to_number_tbl VALUES ('0.00001-');
--Testcase 651:
SELECT to_number(a, '9.999999S') FROM to_number_tbl;
--Testcase 652:
DELETE FROM to_number_tbl;
--Testcase 653:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 654:
SELECT to_number(a, 'FM9.999999S') FROM to_number_tbl;
--Testcase 655:
DELETE FROM to_number_tbl;
--Testcase 656:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 657:
SELECT to_number(a, 'FM9.999999MI') FROM to_number_tbl;
--Testcase 658:
DELETE FROM to_number_tbl;
--Testcase 659:
INSERT INTO to_number_tbl VALUES ('5 4 4 4 4 8 . 7 8');
--Testcase 660:
SELECT to_number(a, '9 9 9 9 9 9 . 9 9') FROM to_number_tbl;
--Testcase 661:
DELETE FROM to_number_tbl;
--Testcase 662:
INSERT INTO to_number_tbl VALUES ('.01');
--Testcase 663:
SELECT to_number(a, 'FM9.99') FROM to_number_tbl;
--Testcase 664:
DELETE FROM to_number_tbl;
--Testcase 665:
INSERT INTO to_number_tbl VALUES ('.0');
--Testcase 666:
SELECT to_number(a, '99999999.99999999') FROM to_number_tbl;
--Testcase 667:
DELETE FROM to_number_tbl;
--Testcase 668:
INSERT INTO to_number_tbl VALUES ('0');
--Testcase 669:
SELECT to_number(a, '99.99') FROM to_number_tbl;
--Testcase 670:
DELETE FROM to_number_tbl;
--Testcase 671:
INSERT INTO to_number_tbl VALUES ('.-01');
--Testcase 672:
SELECT to_number(a, 'S99.99') FROM to_number_tbl;
--Testcase 673:
DELETE FROM to_number_tbl;
--Testcase 674:
INSERT INTO to_number_tbl VALUES ('.01-');
--Testcase 675:
SELECT to_number(a, '99.99S') FROM to_number_tbl;
--Testcase 676:
DELETE FROM to_number_tbl;
--Testcase 677:
INSERT INTO to_number_tbl VALUES (' . 0 1-');
--Testcase 678:
SELECT to_number(a, ' 9 9 . 9 9 S') FROM to_number_tbl;
--Testcase 679:
DELETE FROM to_number_tbl;
--Testcase 680:
INSERT INTO to_number_tbl VALUES ('34,50');
--Testcase 681:
SELECT to_number(a,'999,99') FROM to_number_tbl;
--Testcase 682:
DELETE FROM to_number_tbl;
--Testcase 683:
INSERT INTO to_number_tbl VALUES ('123,000');
--Testcase 684:
SELECT to_number(a,'999G') FROM to_number_tbl;
--Testcase 685:
DELETE FROM to_number_tbl;
--Testcase 686:
INSERT INTO to_number_tbl VALUES ('123456');
--Testcase 687:
SELECT to_number(a,'999G999') FROM to_number_tbl;
--Testcase 688:
DELETE FROM to_number_tbl;
--Testcase 689:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 690:
SELECT to_number(a,'L9,999.99') FROM to_number_tbl;
--Testcase 691:
DELETE FROM to_number_tbl;
--Testcase 692:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 693:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 694:
DELETE FROM to_number_tbl;
--Testcase 695:
INSERT INTO to_number_tbl VALUES ('$1,234.56');
--Testcase 696:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 697:
DELETE FROM to_number_tbl;
--Testcase 698:
INSERT INTO to_number_tbl VALUES ('1234.56');
--Testcase 699:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 700:
DELETE FROM to_number_tbl;
--Testcase 701:
INSERT INTO to_number_tbl VALUES ('1,234.56');
--Testcase 702:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 703:
DELETE FROM to_number_tbl;
--Testcase 704:
INSERT INTO to_number_tbl VALUES ('42nd');
--Testcase 705:
SELECT to_number(a, '99th') FROM to_number_tbl;
--Testcase 1212:
RESET lc_numeric;
--
-- Input syntax
--
--Testcase 706:
CREATE FOREIGN TABLE num_input_test (n1 numeric) SERVER sqlite_svr;
-- good inputs
--Testcase 551:
INSERT INTO num_input_test(n1) VALUES (' 123');
--Testcase 552:
INSERT INTO num_input_test(n1) VALUES (' 3245874 ');
--Testcase 553:
INSERT INTO num_input_test(n1) VALUES (' -93853');
--Testcase 554:
INSERT INTO num_input_test(n1) VALUES ('555.50');
--Testcase 555:
INSERT INTO num_input_test(n1) VALUES ('-555.50');
--Testcase 556:
INSERT INTO num_input_test(n1) VALUES ('NaN ');
--Testcase 557:
INSERT INTO num_input_test(n1) VALUES (' nan');
--Testcase 1213:
INSERT INTO num_input_test(n1) VALUES (' inf ');
--Testcase 1214:
INSERT INTO num_input_test(n1) VALUES (' +inf ');
--Testcase 1215:
INSERT INTO num_input_test(n1) VALUES (' -inf ');
--Testcase 1216:
INSERT INTO num_input_test(n1) VALUES (' Infinity ');
--Testcase 1217:
INSERT INTO num_input_test(n1) VALUES (' +inFinity ');
--Testcase 1218:
INSERT INTO num_input_test(n1) VALUES (' -INFINITY ');
-- bad inputs
--Testcase 558:
INSERT INTO num_input_test(n1) VALUES (' ');
--Testcase 559:
INSERT INTO num_input_test(n1) VALUES (' 1234 %');
--Testcase 560:
INSERT INTO num_input_test(n1) VALUES ('xyz');
--Testcase 561:
INSERT INTO num_input_test(n1) VALUES ('- 1234');
--Testcase 562:
INSERT INTO num_input_test(n1) VALUES ('5 . 0');
--Testcase 563:
INSERT INTO num_input_test(n1) VALUES ('5. 0 ');
--Testcase 564:
INSERT INTO num_input_test(n1) VALUES ('');
--Testcase 565:
INSERT INTO num_input_test(n1) VALUES (' N aN ');
--Testcase 1219:
INSERT INTO num_input_test(n1) VALUES ('+ infinity');
--Testcase 566:
SELECT * FROM num_input_test;
--
-- Test some corner cases for multiplication
--
--Testcase 707:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 708:
INSERT INTO num_tmp VALUES (4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 709:
SELECT n1 * n2 FROM num_tmp;
--Testcase 710:
DELETE FROM num_tmp;
--Testcase 711:
INSERT INTO num_tmp VALUES (4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 712:
SELECT n1 * n2 FROM num_tmp;
--Testcase 713:
DELETE FROM num_tmp;
--Testcase 714:
INSERT INTO num_tmp VALUES (4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 715:
SELECT n1 * n2 FROM num_tmp;
--Testcase 716:
DELETE FROM num_tmp;
--Testcase 717:
INSERT INTO num_tmp VALUES (4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 718:
SELECT n1 * n2 FROM num_tmp;
--Testcase 1525:
DELETE FROM num_tmp;
--Testcase 1526:
INSERT INTO num_tmp VALUES ((0.1 - 2e-16383), (0.1 - 3e-16383));
--Testcase 1527:
SELECT trim_scale(n1 * n2) FROM num_tmp;
--
-- Test some corner cases for division
--
--Testcase 719:
DELETE FROM num_tmp;
--Testcase 720:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 721:
SELECT n1::numeric / n2 FROM num_tmp;
--Testcase 722:
DELETE FROM num_tmp;
--Testcase 723:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 724:
SELECT div(n1::numeric, n2) FROM num_tmp;
--Testcase 725:
SELECT mod(n1::numeric, n2) FROM num_tmp;
--Testcase 726:
SELECT div(-n1::numeric, n2) FROM num_tmp;
--Testcase 727:
SELECT mod(-n1::numeric, n2) FROM num_tmp;
--Testcase 728:
select div(-n1::numeric,n2)*n2 + mod(-n1::numeric,n2) FROM num_tmp;
--Testcase 729:
DELETE FROM num_tmp;
--Testcase 730:
INSERT INTO num_tmp VALUES (70.0,70);
--Testcase 731:
select mod (n1, n2) FROM num_tmp;
--Testcase 732:
select div (n1, n2) FROM num_tmp;
--Testcase 733:
select n1 / n2 FROM num_tmp;
--Testcase 734:
DELETE FROM num_tmp;
--Testcase 735:
INSERT INTO num_tmp VALUES (12345678901234567890, 123);
--Testcase 736:
select n1 % n2 FROM num_tmp;
--Testcase 737:
select n1 / n2 FROM num_tmp;
--Testcase 738:
select div(n1, n2) FROM num_tmp;
--Testcase 739:
select div(n1, n2) * n2 + n1 % n2 FROM num_tmp;
--
-- Test some corner cases for square root
--
--Testcase 740:
DELETE FROM num_tmp;
--Testcase 741:
INSERT INTO num_tmp VALUES (1.000000000000003::numeric);
--Testcase 742:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 743:
DELETE FROM num_tmp;
--Testcase 744:
INSERT INTO num_tmp VALUES (1.000000000000004::numeric);
--Testcase 745:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 746:
DELETE FROM num_tmp;
--Testcase 747:
INSERT INTO num_tmp VALUES (96627521408608.56340355805::numeric);
--Testcase 748:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 749:
DELETE FROM num_tmp;
--Testcase 750:
INSERT INTO num_tmp VALUES (96627521408608.56340355806::numeric);
--Testcase 751:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 752:
DELETE FROM num_tmp;
--Testcase 753:
INSERT INTO num_tmp VALUES (515549506212297735.073688290367::numeric);
--Testcase 754:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 755:
DELETE FROM num_tmp;
--Testcase 756:
INSERT INTO num_tmp VALUES (515549506212297735.073688290368::numeric);
--Testcase 757:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 758:
DELETE FROM num_tmp;
--Testcase 759:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900306::numeric);
--Testcase 760:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 761:
DELETE FROM num_tmp;
--Testcase 762:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900307::numeric);
--Testcase 763:
SELECT sqrt(n1) FROM num_tmp;
--
-- Test code path for raising to integer powers
--
--Testcase 764:
DELETE FROM num_tmp;
--Testcase 765:
INSERT INTO num_tmp VALUES (10.0, -2147483648);
--Testcase 766:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 767:
DELETE FROM num_tmp;
--Testcase 768:
INSERT INTO num_tmp VALUES (10.0, -2147483647);
--Testcase 769:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 770:
DELETE FROM num_tmp;
--Testcase 771:
INSERT INTO num_tmp VALUES (10.0, 2147483647);
--Testcase 772:
SELECT n1 ^ n2 as overflows FROM num_tmp;
--Testcase 773:
DELETE FROM num_tmp;
--Testcase 774:
INSERT INTO num_tmp VALUES (117743296169.0, -1000000000);
--Testcase 775:
SELECT n1 ^ n2 as overflows FROM num_tmp;
-- cases that used to return inaccurate results
--Testcase 776:
DELETE FROM num_tmp;
--Testcase 777:
INSERT INTO num_tmp VALUES (3.789, 21);
--Testcase 778:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 779:
DELETE FROM num_tmp;
--Testcase 780:
INSERT INTO num_tmp VALUES (3.789, 35);
--Testcase 781:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 782:
DELETE FROM num_tmp;
--Testcase 783:
INSERT INTO num_tmp VALUES (1.2, 345);
--Testcase 784:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 785:
DELETE FROM num_tmp;
--Testcase 786:
INSERT INTO num_tmp VALUES (0.12, (-20));
--Testcase 787:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1220:
DELETE FROM num_tmp;
--Testcase 1221:
INSERT INTO num_tmp VALUES (1.000000000123, (-2147483648));
--Testcase 1222:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1528:
DELETE FROM num_tmp;
--Testcase 1529:
INSERT INTO num_tmp VALUES (0.9999999999, 23300000000000);
--Testcase 1530:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
-- cases that used to error out
--Testcase 788:
DELETE FROM num_tmp;
--Testcase 789:
INSERT INTO num_tmp VALUES (0.12, (-25));
--Testcase 790:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 791:
DELETE FROM num_tmp;
--Testcase 792:
INSERT INTO num_tmp VALUES (0.5678, (-85));
--Testcase 793:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1531:
DELETE FROM num_tmp;
--Testcase 1532:
INSERT INTO num_tmp VALUES (0.9999999999, 70000000000000);
--Testcase 1533:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
-- negative base to integer powers
--Testcase 1534:
DELETE FROM num_tmp;
--Testcase 1535:
INSERT INTO num_tmp VALUES ((-1.0), 2147483646);
--Testcase 1536:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1537:
DELETE FROM num_tmp;
--Testcase 1538:
INSERT INTO num_tmp VALUES ((-1.0), 2147483647);
--Testcase 1539:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1540:
DELETE FROM num_tmp;
--Testcase 1541:
INSERT INTO num_tmp VALUES ((-1.0), 2147483648);
--Testcase 1542:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1543:
DELETE FROM num_tmp;
--Testcase 1544:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000000);
--Testcase 1545:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1546:
DELETE FROM num_tmp;
--Testcase 1547:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000001);
--Testcase 1548:
SELECT n1 ^ n2 FROM num_tmp;
--
-- Tests for raising to non-integer powers
--
-- special cases
--Testcase 794:
DELETE FROM num_tmp;
--Testcase 795:
INSERT INTO num_tmp VALUES (0.0, 0.0);
--Testcase 796:
select n1 ^ n2 FROM num_tmp;
--Testcase 797:
DELETE FROM num_tmp;
--Testcase 798:
INSERT INTO num_tmp VALUES ((-12.34), 0.0);
--Testcase 799:
select n1 ^ n2 FROM num_tmp;
--Testcase 800:
DELETE FROM num_tmp;
--Testcase 801:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 802:
select n1 ^ n2 FROM num_tmp;
--Testcase 803:
DELETE FROM num_tmp;
--Testcase 804:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 805:
select n1 ^ n2 FROM num_tmp;
-- NaNs
--Testcase 806:
DELETE FROM num_tmp;
--Testcase 807:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 'NaN'::numeric);
--Testcase 808:
select n1 ^ n2 FROM num_tmp;
--Testcase 809:
DELETE FROM num_tmp;
--Testcase 810:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 0);
--Testcase 811:
select n1 ^ n2 FROM num_tmp;
--Testcase 812:
DELETE FROM num_tmp;
--Testcase 813:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 1);
--Testcase 814:
select n1 ^ n2 FROM num_tmp;
--Testcase 815:
DELETE FROM num_tmp;
--Testcase 816:
INSERT INTO num_tmp VALUES (0, 'NaN'::numeric);
--Testcase 817:
select n1 ^ n2 FROM num_tmp;
--Testcase 818:
DELETE FROM num_tmp;
--Testcase 819:
INSERT INTO num_tmp VALUES (1, 'NaN'::numeric);
--Testcase 820:
select n1 ^ n2 FROM num_tmp;
-- invalid inputs
--Testcase 821:
DELETE FROM num_tmp;
--Testcase 822:
INSERT INTO num_tmp VALUES (0.0, (-12.34));
--Testcase 823:
select n1 ^ n2 FROM num_tmp;
--Testcase 824:
DELETE FROM num_tmp;
--Testcase 825:
INSERT INTO num_tmp VALUES ((-12.34), 1.2);
--Testcase 826:
select n1 ^ n2 FROM num_tmp;
-- cases that used to generate inaccurate results
--Testcase 827:
DELETE FROM num_tmp;
--Testcase 828:
INSERT INTO num_tmp VALUES (32.1, 9.8);
--Testcase 829:
select n1 ^ n2 FROM num_tmp;
--Testcase 830:
DELETE FROM num_tmp;
--Testcase 831:
INSERT INTO num_tmp VALUES (32.1, (-9.8));
--Testcase 832:
select n1 ^ n2 FROM num_tmp;
--Testcase 833:
DELETE FROM num_tmp;
--Testcase 834:
INSERT INTO num_tmp VALUES (12.3, 45.6);
--Testcase 835:
select n1 ^ n2 FROM num_tmp;
--Testcase 836:
DELETE FROM num_tmp;
--Testcase 837:
INSERT INTO num_tmp VALUES (12.3, (-45.6));
--Testcase 838:
select n1 ^ n2 FROM num_tmp;
-- big test
--Testcase 839:
DELETE FROM num_tmp;
--Testcase 840:
INSERT INTO num_tmp VALUES (1.234, 5678);
--Testcase 841:
select n1 ^ n2 FROM num_tmp;
--
-- Tests for EXP()
--
-- special cases
--Testcase 842:
DELETE FROM num_tmp;
--Testcase 843:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 844:
select exp(n1) from num_tmp;
--Testcase 845:
DELETE FROM num_tmp;
--Testcase 846:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 847:
select exp(n1) from num_tmp;
--Testcase 848:
DELETE FROM num_tmp;
--Testcase 849:
INSERT INTO num_tmp VALUES (1.0::numeric(71,70));
--Testcase 850:
select exp(n1) from num_tmp;
--Testcase 1223:
DELETE FROM num_tmp;
--Testcase 1224:
INSERT INTO num_tmp VALUES ('nan'::numeric);
--Testcase 1225:
select exp(n1) from num_tmp;
--Testcase 1226:
DELETE FROM num_tmp;
--Testcase 1227:
INSERT INTO num_tmp VALUES ('inf'::numeric);
--Testcase 1228:
select exp(n1) from num_tmp;
--Testcase 1229:
DELETE FROM num_tmp;
--Testcase 1230:
INSERT INTO num_tmp VALUES ('-inf'::numeric);
--Testcase 1231:
select exp(n1) from num_tmp;
--Testcase 1549:
DELETE FROM num_tmp;
--Testcase 1550:
INSERT INTO num_tmp VALUES ('-5000'::numeric);
--Testcase 1551:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
--Testcase 1552:
DELETE FROM num_tmp;
--Testcase 1553:
INSERT INTO num_tmp VALUES ('-10000'::numeric);
--Testcase 1554:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
-- cases that used to generate inaccurate results
--Testcase 851:
DELETE FROM num_tmp;
--Testcase 852:
INSERT INTO num_tmp VALUES (32.999);
--Testcase 853:
select exp(n1) from num_tmp;
--Testcase 854:
DELETE FROM num_tmp;
--Testcase 855:
INSERT INTO num_tmp VALUES (-32.999);
--Testcase 856:
select exp(n1) from num_tmp;
--Testcase 857:
DELETE FROM num_tmp;
--Testcase 858:
INSERT INTO num_tmp VALUES (123.456);
--Testcase 859:
select exp(n1) from num_tmp;
--Testcase 860:
DELETE FROM num_tmp;
--Testcase 861:
INSERT INTO num_tmp VALUES (-123.456);
--Testcase 862:
select exp(n1) from num_tmp;
-- big test
--Testcase 863:
DELETE FROM num_tmp;
--Testcase 864:
INSERT INTO num_tmp VALUES (1234.5678);
--Testcase 865:
select exp(n1) from num_tmp;
--
-- Tests for generate_series
--
--Testcase 866:
DELETE FROM num_tmp;
--Testcase 867:
INSERT INTO num_tmp select * from generate_series(0.0::numeric, 4.0::numeric);
--Testcase 868:
SELECT n1 FROM num_tmp;
--Testcase 869:
DELETE FROM num_tmp;
--Testcase 870:
INSERT INTO num_tmp select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric);
--Testcase 871:
SELECT n1 FROM num_tmp;
--Testcase 872:
DELETE FROM num_tmp;
--Testcase 873:
INSERT INTO num_tmp select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric);
--Testcase 874:
SELECT n1 FROM num_tmp;
-- Trigger errors
--Testcase 875:
DELETE FROM num_tmp;
--Testcase 876:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 0::numeric);
--Testcase 877:
SELECT n1 FROM num_tmp;
--Testcase 878:
DELETE FROM num_tmp;
--Testcase 879:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric);
--Testcase 880:
SELECT n1 FROM num_tmp;
--Testcase 881:
DELETE FROM num_tmp;
--Testcase 882:
INSERT INTO num_tmp select * from generate_series('nan'::numeric, 100::numeric, 10::numeric);
--Testcase 883:
SELECT n1 FROM num_tmp;
--Testcase 884:
DELETE FROM num_tmp;
--Testcase 885:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric);
--Testcase 886:
SELECT n2 FROM num_tmp;
--Testcase 1232:
DELETE FROM num_tmp;
--Testcase 1233:
INSERT INTO num_tmp select * from generate_series('inf'::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1234:
SELECT n2 FROM num_tmp;
--Testcase 1235:
DELETE FROM num_tmp;
--Testcase 1236:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1237:
SELECT n2 FROM num_tmp;
--Testcase 1238:
DELETE FROM num_tmp;
--Testcase 1239:
INSERT INTO num_tmp select * from generate_series(0::numeric, '42'::numeric, '-inf'::numeric);
--Testcase 1240:
SELECT n2 FROM num_tmp;
-- Checks maximum, output is truncated
--Testcase 887:
DELETE FROM num_tmp;
--Testcase 888:
INSERT INTO num_tmp select (i / (10::numeric ^ 131071))::numeric(1,0)
from generate_series(6 * (10::numeric ^ 131071),
9 * (10::numeric ^ 131071),
10::numeric ^ 131071) i;
--Testcase 889:
SELECT n1 FROM num_tmp;
-- Check usage with variables
--Testcase 890:
DELETE FROM num_tmp;
--Testcase 891:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
--Testcase 892:
SELECT n1, n2 FROM num_tmp;
--Testcase 893:
DELETE FROM num_tmp;
--Testcase 894:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
--Testcase 895:
SELECT n1, n2 FROM num_tmp;
--Testcase 896:
DELETE FROM num_tmp;
--Testcase 897:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
--Testcase 898:
SELECT n1, n2 FROM num_tmp;
--
-- Tests for LN()
--
-- Invalid inputs
--Testcase 899:
DELETE FROM num_tmp;
--Testcase 900:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 901:
select ln(n1) from num_tmp;
--Testcase 902:
DELETE FROM num_tmp;
--Testcase 903:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 904:
select ln(n1) from num_tmp;
-- Some random tests
--Testcase 905:
DELETE FROM num_tmp;
--Testcase 906:
INSERT INTO num_tmp VALUES (1.2345678e-28);
--Testcase 907:
select ln(n1) from num_tmp;
--Testcase 908:
DELETE FROM num_tmp;
--Testcase 909:
INSERT INTO num_tmp VALUES (0.0456789);
--Testcase 910:
select ln(n1) from num_tmp;
--Testcase 911:
DELETE FROM num_tmp;
--Testcase 912:
INSERT INTO num_tmp VALUES (0.349873948359354029493948309745709580730482050975);
--Testcase 913:
select ln(n1) from num_tmp;
--Testcase 914:
DELETE FROM num_tmp;
--Testcase 915:
INSERT INTO num_tmp VALUES (0.99949452);
--Testcase 916:
select ln(n1) from num_tmp;
--Testcase 917:
DELETE FROM num_tmp;
--Testcase 918:
INSERT INTO num_tmp VALUES (1.00049687395);
--Testcase 919:
select ln(n1) from num_tmp;
--Testcase 920:
DELETE FROM num_tmp;
--Testcase 921:
INSERT INTO num_tmp VALUES (1234.567890123456789);
--Testcase 922:
select ln(n1) from num_tmp;
--Testcase 923:
DELETE FROM num_tmp;
--Testcase 924:
INSERT INTO num_tmp VALUES (5.80397490724e5);
--Testcase 925:
select ln(n1) from num_tmp;
--Testcase 926:
DELETE FROM num_tmp;
--Testcase 927:
INSERT INTO num_tmp VALUES (9.342536355e34);
--Testcase 928:
select ln(n1) from num_tmp;
--
-- Tests for LOG() (base 10)
--
-- invalid inputs
--Testcase 929:
DELETE FROM num_tmp;
--Testcase 930:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 931:
select log(n1) from num_tmp;
--Testcase 932:
DELETE FROM num_tmp;
--Testcase 933:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 934:
select log(n1) from num_tmp;
-- some random tests
--Testcase 935:
DELETE FROM num_tmp;
--Testcase 936:
INSERT INTO num_tmp VALUES (1.234567e-89);
--Testcase 937:
select log(n1) from num_tmp;
--Testcase 938:
DELETE FROM num_tmp;
--Testcase 939:
INSERT INTO num_tmp VALUES (3.4634998359873254962349856073435545);
--Testcase 940:
select log(n1) from num_tmp;
--Testcase 941:
DELETE FROM num_tmp;
--Testcase 942:
INSERT INTO num_tmp VALUES (9.999999999999999999);
--Testcase 943:
select log(n1) from num_tmp;
--Testcase 944:
DELETE FROM num_tmp;
--Testcase 945:
INSERT INTO num_tmp VALUES (10.00000000000000000);
--Testcase 946:
select log(n1) from num_tmp;
--Testcase 947:
DELETE FROM num_tmp;
--Testcase 948:
INSERT INTO num_tmp VALUES (10.00000000000000001);
--Testcase 949:
select log(n1) from num_tmp;
--Testcase 950:
DELETE FROM num_tmp;
--Testcase 951:
INSERT INTO num_tmp VALUES (590489.45235237);
--Testcase 952:
select log(n1) from num_tmp;
--
-- Tests for LOG() (arbitrary base)
--
-- invalid inputs
--Testcase 953:
DELETE FROM num_tmp;
--Testcase 954:
INSERT INTO num_tmp VALUES (-12.34, 56.78);
--Testcase 955:
select log(n1, n2) from num_tmp;
--Testcase 956:
DELETE FROM num_tmp;
--Testcase 957:
INSERT INTO num_tmp VALUES (-12.34, -56.78);
--Testcase 958:
select log(n1, n2) from num_tmp;
--Testcase 959:
DELETE FROM num_tmp;
--Testcase 960:
INSERT INTO num_tmp VALUES (12.34, -56.78);
--Testcase 961:
select log(n1, n2) from num_tmp;
--Testcase 962:
DELETE FROM num_tmp;
--Testcase 963:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 964:
select log(n1, n2) from num_tmp;
--Testcase 965:
DELETE FROM num_tmp;
--Testcase 966:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 967:
select log(n1, n2) from num_tmp;
--Testcase 968:
DELETE FROM num_tmp;
--Testcase 969:
INSERT INTO num_tmp VALUES (.0, 12.34);
--Testcase 970:
select log(n1, n2) from num_tmp;
-- some random tests
--Testcase 971:
DELETE FROM num_tmp;
--Testcase 972:
INSERT INTO num_tmp VALUES (1.23e-89, 6.4689e45);
--Testcase 973:
select log(n1, n2) from num_tmp;
--Testcase 974:
DELETE FROM num_tmp;
--Testcase 975:
INSERT INTO num_tmp VALUES (0.99923, 4.58934e34);
--Testcase 976:
select log(n1, n2) from num_tmp;
--Testcase 977:
DELETE FROM num_tmp;
--Testcase 978:
INSERT INTO num_tmp VALUES (1.000016, 8.452010e18);
--Testcase 979:
select log(n1, n2) from num_tmp;
--Testcase 980:
DELETE FROM num_tmp;
--Testcase 981:
INSERT INTO num_tmp VALUES (3.1954752e47, 9.4792021e-73);
--Testcase 982:
select log(n1, n2) from num_tmp;
--
-- Tests for scale()
--
--Testcase 983:
DELETE FROM num_tmp;
--Testcase 984:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 985:
select scale(n1) from num_tmp;
--Testcase 1241:
DELETE FROM num_tmp;
--Testcase 1242:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1243:
select scale(n1) from num_tmp;
--Testcase 986:
DELETE FROM num_tmp;
--Testcase 987:
INSERT INTO num_tmp VALUES (NULL::numeric);
--Testcase 988:
select scale(n1) from num_tmp;
--Testcase 989:
DELETE FROM num_tmp;
--Testcase 990:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 991:
select scale(n1) from num_tmp;
--Testcase 992:
DELETE FROM num_tmp;
--Testcase 993:
INSERT INTO num_tmp VALUES (0);
--Testcase 994:
select scale(n1) from num_tmp;
--Testcase 995:
DELETE FROM num_tmp;
--Testcase 996:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 997:
select scale(n1) from num_tmp;
--Testcase 998:
DELETE FROM num_tmp;
--Testcase 999:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1000:
select scale(n1) from num_tmp;
--Testcase 1001:
DELETE FROM num_tmp;
--Testcase 1002:
INSERT INTO num_tmp VALUES (110123.12475871856128);
--Testcase 1003:
select scale(n1) from num_tmp;
--Testcase 1004:
DELETE FROM num_tmp;
--Testcase 1005:
INSERT INTO num_tmp VALUES (-1123.12471856128);
--Testcase 1006:
select scale(n1) from num_tmp;
--Testcase 1007:
DELETE FROM num_tmp;
--Testcase 1008:
INSERT INTO num_tmp VALUES (-13.000000000000000);
--Testcase 1009:
select scale(n1) from num_tmp;
--
-- Tests for min_scale()
--
--Testcase 1010:
DELETE FROM num_tmp;
--Testcase 1011:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1012:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1244:
DELETE FROM num_tmp;
--Testcase 1245:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1246:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1013:
DELETE FROM num_tmp;
--Testcase 1014:
INSERT INTO num_tmp VALUES (0);
--Testcase 1015:
select min_scale(n1) from num_tmp; -- no digits
--Testcase 1016:
DELETE FROM num_tmp;
--Testcase 1017:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1018:
select min_scale(n1) from num_tmp; -- no digits again
--Testcase 1019:
DELETE FROM num_tmp;
--Testcase 1020:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 1021:
select min_scale(n1) from num_tmp; -- no scale
--Testcase 1022:
DELETE FROM num_tmp;
--Testcase 1023:
INSERT INTO num_tmp VALUES (1.1);
--Testcase 1024:
select min_scale(n1) from num_tmp; -- scale 1
--Testcase 1025:
DELETE FROM num_tmp;
--Testcase 1026:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 1027:
select min_scale(n1) from num_tmp; -- scale 2
--Testcase 1028:
DELETE FROM num_tmp;
--Testcase 1029:
INSERT INTO num_tmp VALUES (1.123);
--Testcase 1030:
select min_scale(n1) from num_tmp; -- scale 3
--Testcase 1031:
DELETE FROM num_tmp;
--Testcase 1032:
INSERT INTO num_tmp VALUES (1.1234);
--Testcase 1033:
select min_scale(n1) from num_tmp; -- scale 4, filled digit
--Testcase 1034:
DELETE FROM num_tmp;
--Testcase 1035:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1036:
select min_scale(n1) from num_tmp; -- scale 5, 2 NDIGITS
--Testcase 1037:
DELETE FROM num_tmp;
--Testcase 1038:
INSERT INTO num_tmp VALUES (1.1000);
--Testcase 1039:
select min_scale(n1) from num_tmp; -- 1 pos in NDIGITS
--Testcase 1040:
DELETE FROM num_tmp;
--Testcase 1041:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1042:
select min_scale(n1) from num_tmp; -- very big number
--
-- Tests for trim_scale()
--
--Testcase 1043:
DELETE FROM num_tmp;
--Testcase 1044:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1045:
select trim_scale(n1) from num_tmp;
--Testcase 1247:
DELETE FROM num_tmp;
--Testcase 1248:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1249:
select trim_scale(n1) from num_tmp;
--Testcase 1046:
DELETE FROM num_tmp;
--Testcase 1047:
INSERT INTO num_tmp VALUES (1.120);
--Testcase 1048:
select trim_scale(n1) from num_tmp;
--Testcase 1049:
DELETE FROM num_tmp;
--Testcase 1050:
INSERT INTO num_tmp VALUES (0);
--Testcase 1051:
select trim_scale(n1) from num_tmp;
--Testcase 1052:
DELETE FROM num_tmp;
--Testcase 1053:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1054:
select trim_scale(n1) from num_tmp;
--Testcase 1055:
DELETE FROM num_tmp;
--Testcase 1056:
INSERT INTO num_tmp VALUES (1.1234500);
--Testcase 1057:
select trim_scale(n1) from num_tmp;
--Testcase 1058:
DELETE FROM num_tmp;
--Testcase 1059:
INSERT INTO num_tmp VALUES (110123.12475871856128000);
--Testcase 1060:
select trim_scale(n1) from num_tmp;
--Testcase 1061:
DELETE FROM num_tmp;
--Testcase 1062:
INSERT INTO num_tmp VALUES (-123.124718561280000000);
--Testcase 1063:
select trim_scale(n1) from num_tmp;
--Testcase 1064:
DELETE FROM num_tmp;
--Testcase 1065:
INSERT INTO num_tmp VALUES (-13.00000000000000000000);
--Testcase 1066:
select trim_scale(n1) from num_tmp;
--Testcase 1067:
DELETE FROM num_tmp;
--Testcase 1068:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1069:
select trim_scale(n1) from num_tmp;
--
-- Tests for SUM()
--
-- cases that need carry propagation
--Testcase 1070:
DELETE FROM num_tmp;
--Testcase 1071:
INSERT INTO num_tmp SELECT * FROM generate_series(1, 100000);
--Testcase 1072:
SELECT SUM(9999::numeric) FROM num_tmp;
--Testcase 1073:
SELECT SUM((-9999)::numeric) FROM num_tmp;
--
-- Tests for GCD()
--
--Testcase 1074:
DELETE FROM num_tmp;
--Testcase 1075:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1076:
SELECT n1 as a, n2 as b, gcd(n1, n2), gcd(n1, -n2), gcd(-n2, n1), gcd(-n2, -n1) FROM num_tmp;
--
-- Tests for LCM()
--
--Testcase 1077:
DELETE FROM num_tmp;
--Testcase 1078:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1079:
SELECT n1 as a, n2 as b, lcm(n1, n2), lcm(n1, -n2), lcm(-n2, n1), lcm(-n2, -n1) FROM num_tmp;
--Testcase 1080:
DELETE FROM num_tmp;
--Testcase 1081:
INSERT INTO num_tmp VALUES (10::numeric, 131068);
--Testcase 1082:
SELECT lcm(9999 * (n1)^n2 + (n1^n2 - 1), 2) FROM num_tmp; -- overflow
--
-- Tests for factorial
--
--Testcase 1250:
DELETE FROM num_tmp;
--Testcase 1251:
INSERT INTO num_tmp VALUES (4);
--Testcase 1252:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1253:
DELETE FROM num_tmp;
--Testcase 1254:
INSERT INTO num_tmp VALUES (15);
--Testcase 1255:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1256:
DELETE FROM num_tmp;
--Testcase 1257:
INSERT INTO num_tmp VALUES (100000);
--Testcase 1258:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1259:
DELETE FROM num_tmp;
--Testcase 1260:
INSERT INTO num_tmp VALUES (0);
--Testcase 1261:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1262:
DELETE FROM num_tmp;
--Testcase 1263:
INSERT INTO num_tmp VALUES (-4);
--Testcase 1264:
SELECT factorial(n1::int4) FROM num_tmp;
--
-- Tests for pg_lsn()
--
--Testcase 1265:
DELETE FROM num_tmp;
--Testcase 1266:
INSERT INTO num_tmp VALUES (23783416::numeric);
--Testcase 1267:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1268:
DELETE FROM num_tmp;
--Testcase 1269:
INSERT INTO num_tmp VALUES (0::numeric);
--Testcase 1270:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1271:
DELETE FROM num_tmp;
--Testcase 1272:
INSERT INTO num_tmp VALUES (18446744073709551615::numeric);
--Testcase 1273:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1274:
DELETE FROM num_tmp;
--Testcase 1275:
INSERT INTO num_tmp VALUES (-1::numeric);
--Testcase 1276:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1277:
DELETE FROM num_tmp;
--Testcase 1278:
INSERT INTO num_tmp VALUES (18446744073709551616::numeric);
--Testcase 1279:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1280:
DELETE FROM num_tmp;
--Testcase 1281:
INSERT INTO num_tmp VALUES ('NaN'::numeric);
--Testcase 1282:
SELECT pg_lsn(n1) FROM num_tmp;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 1083:
DROP SERVER sqlite_svr;
--Testcase 1084:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/out_of_range.sql
================================================
--
-- INT4 + INT2
--
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 01:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 02:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 03:
DELETE FROM INT4_TMP;
--Testcase 04:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 05:
INSERT INTO INT4_TMP VALUES (x'7FFFFFFF'::int8 + 1, 0);
--Testcase 06:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 07:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 08:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 09:
DELETE FROM INT4_TMP;
--Testcase 10:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 11:
INSERT INTO INT4_TMP VALUES (-(x'7FFFFFFF'::int8) - 2, 0);
--Testcase 12:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 13:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 14:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 15:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 16:
CREATE FOREIGN TABLE INT2_TMP(f1 int2, f2 int2, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 17:
DELETE FROM INT2_TMP;
--Testcase 18:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 19:
INSERT INTO INT2_TMP VALUES (x'7FFF'::int8 + 1, 0);
--Testcase 20:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 21:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 22:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 23:
DELETE FROM INT2_TMP;
--Testcase 24:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 25:
INSERT INTO INT2_TMP VALUES (-(x'7FFF'::int8) - 2, 0);
--Testcase 26:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 27:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 28:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 29:
CREATE FOREIGN TABLE INT8_TBL(q1 int8 OPTIONS (key 'true'), q2 int8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 31:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 32:
INSERT INTO INT8_TBL VALUES (-9223372036854775810, 0);
--Testcase 33:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 34:
SELECT * FROM INT8_TBL; -- NO overflow
--Testcase 35:
SELECT q1 FROM INT8_TBL; -- NO overflow
--Testcase 36:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 37:
DELETE FROM INT8_TBL WHERE q1 = -9223372036854775810;
--Testcase 38:
INSERT INTO INT8_TBL VALUES (9223372036854775809, 0);
--Testcase 39:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 40:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 41:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 42:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 43:
DELETE FROM INT8_TBL WHERE q1 = 9223372036854775809;
--Testcase 44:
INSERT INTO INT8_TBL VALUES (10 * -9223372036854775810, 0);
--Testcase 45:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 46:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 47:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 48:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 49:
DELETE FROM INT8_TBL WHERE q1 = 10 * -9223372036854775810;
--Testcase 50:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 003:
DROP SERVER sqlite_svr CASCADE;
--Testcase 004:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/timestamp.sql
================================================
--
-- TIMESTAMP
--
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 3:
CREATE FOREIGN TABLE dates1 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number timestamp without time zone OPTIONS (column_type 'INT'))
SERVER sqlite_svr
OPTIONS (table 'dates');
--Testcase 4:
CREATE FOREIGN TABLE dates2 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number double precision)
SERVER sqlite_svr
OPTIONS (table 'dates');
-- Showing timestamp column from SQLite value as TEXT and as INTEGER/FLOAT has same value
--Testcase 5:
SELECT name,
to_char(date_as_text, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_text,
to_char(date_as_number, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_number
FROM dates1;
--Testcase 6:
SELECT * FROM dates2;
-- Comparing exact values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 7:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 8:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 9:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 10:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
-- Comparing greater values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 11:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 12:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 13:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 14:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 15:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 16:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 17:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 18:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--- Comparing without using to_timestamp
--Testcase 19:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 20:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 21:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 22:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 23:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 24:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 25:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
--Testcase 26:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
-- Comparing greater values without using to_timestamp
--Testcase 27:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 28:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 29:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 30:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 31:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 32:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 33:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 34:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 35:
DROP FOREIGN TABLE dates1;
--Testcase 36:
DROP FOREIGN TABLE dates2;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/types/uuid.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_UUID"( "i" int OPTIONS (key 'true'), "u" uuid) SERVER sqlite_svr OPTIONS (table 'type_UUID');
--Testcase 010:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE text;
--Testcase 011:
INSERT INTO "type_UUID" ("i", "u") VALUES (1, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 012:
INSERT INTO "type_UUID" ("i", "u") VALUES (2, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 013:
INSERT INTO "type_UUID" ("i", "u") VALUES (3, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 014:
INSERT INTO "type_UUID" ("i", "u") VALUES (4, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 015:
INSERT INTO "type_UUID" ("i", "u") VALUES (5, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 016:
INSERT INTO "type_UUID" ("i", "u") VALUES (6, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 017:
INSERT INTO "type_UUID" ("i", "u") VALUES (7, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 018:
INSERT INTO "type_UUID" ("i", "u") VALUES (8, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 019:
INSERT INTO "type_UUID" ("i", "u") VALUES (9, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 020:
INSERT INTO "type_UUID" ("i", "u") VALUES (10, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 021:
INSERT INTO "type_UUID" ("i", "u") VALUES (11, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 022:
INSERT INTO "type_UUID" ("i", "u") VALUES (12, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 023:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 024:
INSERT INTO "type_UUID" ("i", "u") VALUES (13, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 025:
INSERT INTO "type_UUID" ("i", "u") VALUES (14, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 026:
INSERT INTO "type_UUID" ("i", "u") VALUES (15, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 027:
INSERT INTO "type_UUID" ("i", "u") VALUES (16, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 029:
INSERT INTO "type_UUID" ("i", "u") VALUES (17, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 030:
INSERT INTO "type_UUID" ("i", "u") VALUES (18, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 031:
INSERT INTO "type_UUID" ("i", "u") VALUES (19, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 032:
INSERT INTO "type_UUID" ("i", "u") VALUES (20, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 033:
INSERT INTO "type_UUID" ("i", "u") VALUES (21, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 034:
INSERT INTO "type_UUID" ("i", "u") VALUES (22, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 035:
INSERT INTO "type_UUID" ("i", "u") VALUES (23, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 036:
INSERT INTO "type_UUID" ("i", "u") VALUES (24, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 037:
INSERT INTO "type_UUID" ("i", "u") VALUES (25, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 038:
INSERT INTO "type_UUID" ("i", "u") VALUES (26, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 039:
INSERT INTO "type_UUID" ("i", "u") VALUES (27, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 040:
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 041:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 042:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (ADD column_type 'BLOB');
--Testcase 043:
INSERT INTO "type_UUID" ("i", "u") VALUES (29, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 044:
INSERT INTO "type_UUID" ("i", "u") VALUES (30, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 045:
INSERT INTO "type_UUID" ("i", "u") VALUES (31, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 046:
INSERT INTO "type_UUID" ("i", "u") VALUES (32, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 047:
INSERT INTO "type_UUID" ("i", "u") VALUES (33, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 048:
INSERT INTO "type_UUID" ("i", "u") VALUES (34, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 049:
INSERT INTO "type_UUID" ("i", "u") VALUES (35, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 050:
INSERT INTO "type_UUID" ("i", "u") VALUES (36, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 051:
INSERT INTO "type_UUID" ("i", "u") VALUES (37, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 052:
INSERT INTO "type_UUID" ("i", "u") VALUES (38, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 053:
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 054:
INSERT INTO "type_UUID" ("i", "u") VALUES (40, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 056:
CREATE FOREIGN TABLE "type_UUID+"( "i" int OPTIONS (key 'true'), "u" uuid, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_UUID+');
--Testcase 057:
SELECT * FROM "type_UUID+";
--Testcase 058:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 059:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 060:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 061:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 062:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 063:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 064:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 065:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 066:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 067:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 068:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 069:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 071:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 072:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 073:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 074:
SELECT * FROM "type_UUID+";
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11';
--Testcase 076:
SELECT * FROM "type_UUID+";
--Testcase 077:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 077:
SELECT * FROM "type_UUID+";
--Testcase 078:
INSERT INTO "type_UUID" ("i", "u") VALUES (41, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}');
--Testcase 079:
SELECT * FROM "type_UUID+" WHERE "i" = 41;
--Testcase 080:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 081:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 082:
SELECT * FROM "type_UUID+";
--Testcase 083:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}';
--Testcase 085:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 086:
INSERT INTO "type_UUID" ("i", "u") VALUES (42, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11f1', 'hex'));
--Testcase 087:
INSERT INTO "type_UUID" ("i", "u") VALUES (43, decode('b0eebc999c0b4ef8bb6d6bb9bd380a', 'hex'));
--Testcase 088:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 089:
SELECT * FROM "type_UUID+" WHERE "i" = 42;
--Testcase 090:
SELECT * FROM "type_UUID+" WHERE "i" = 43;
--Testcase 091:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 092:
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 093:
INSERT INTO "type_UUID" ("i", "u") VALUES (44, NULL);
--Testcase 094:
SELECT * FROM "type_UUID+";
--Testcase 095:
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 096:
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 100:
CREATE FOREIGN TABLE "type_UUIDpk" (col uuid OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 101:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (ADD column_type 'TEXT');
--Testcase 102:
INSERT INTO "type_UUIDpk" VALUES ('{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 103:
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 104:
SELECT * FROM "type_UUIDpk";
--Testcase 105: ERR - primary key
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 106:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 107: NO ERR, but the same semantics!
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 108:
SELECT * FROM "type_UUIDpk";
--Testcase 109:
DELETE FROM "type_UUIDpk";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/with_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/with_gis_support/postgis.sql
================================================
--Testcase 2:
CREATE EXTENSION sqlite_fdw;
--Testcase 3:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 4:
CREATE EXTENSION IF NOT EXISTS postgis;
--Testcase 5:
CREATE EXTENSION postgis_raster;
--Testcase 6:
CREATE EXTENSION postgis_topology;
-- TEST GIS DATA FROM UNION ASTRONOMIQUE INTERNATIONAL (国際天文学連合): MARS, Olympus mons
--Testcase 11:
CREATE SCHEMA "♂";
--Testcase 12:
CREATE TABLE "♂"."テスト" (
id int4 NULL,
"UAI" varchar(254) NULL,
"⌖" public.geometry(point, 104904) NULL,
geom public.geometry(geometry, 104904) NULL,
"t₀" date NULL,
"class" text NULL,
"URL" varchar(80) NULL
);
--Testcase 13: ETC...
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(991, 'Olympus Mons', 'SRID=104904;POINT (226.19749330952843 18.652758890345698)'::geometry, 'SRID=104904;MULTIPOLYGON (((223.78717231750488 23.3314151763916, 224.22803688049316 23.324007034301758, 224.32436180114746 23.5648136138916, 224.7186985015869 23.593564987182617, 224.79486274719238 23.45737648010254, 225.06530570983887 23.238798141479492, 225.67255210876465 23.437196731567383, 226.2211856842041 23.6611385345459, 226.5472011566162 23.65372657775879, 227.6215763092041 23.435148239135742, 228.19009590148926 23.390283584594727, 228.753023147583 23.24955177307129, 228.90711784362793 23.1943416595459, 229.23219108581543 23.004926681518555, 229.5288143157959 22.75514030456543, 229.87227058410645 22.442903518676758, 230.2469539642334 22.14628028869629, 230.7309169769287 21.927717208862305, 231.30854988098145 21.64670753479004, 231.85495948791504 21.084684371948242, 232.19841957092285 19.88258171081543, 231.88618278503418 18.47752571105957, 231.30854988098145 17.743772506713867, 231.21887397766113 17.218599319458008, 231.17812156677246 16.751802444458008, 230.97346687316895 16.353670120239258, 230.8327350616455 15.947111129760742, 230.62945365905762 15.478002548217773, 230.4574489593506 15.352907180786133, 230.20748329162598 15.29954719543457, 229.99631309509277 15.036508560180664, 229.72586631774902 14.640104293823242, 229.41096305847168 14.377065658569336, 228.98862266540527 14.10291862487793, 228.74040412902832 13.854700088500977, 228.5107135772705 13.83247184753418, 228.31806755065918 13.962137222290039, 227.93990516662598 13.929948806762695, 227.36133766174316 13.883039474487305, 227.04734230041504 13.813947677612305, 226.68895149230957 13.851762771606445, 226.4101276397705 13.839879989624023, 226.06347465515137 13.632848739624023, 225.7766170501709 13.617597579956055, 225.32925987243652 13.481771469116211, 224.76723670959473 13.591054916381836, 224.15838050842285 13.731557846069336, 223.12800407409668 14.106241226196289, 222.39425468444824 14.402864456176758, 221.67611503601074 14.918050765991211, 221.434663772583 15.403280258178711, 221.30129432678223 16.051607131958008, 221.0864200592041 16.410966873168945, 221.09012413024902 16.6591854095459, 221.1975612640381 17.09263801574707, 220.9971103668213 17.32316017150879, 220.75670051574707 17.422361373901367, 220.82338523864746 17.844701766967773, 221.18475532531738 18.073732376098633, 221.3567600250244 18.5584774017334, 221.40367317199707 19.10576820373535, 221.3567600250244 19.90325355529785, 221.42725563049316 20.59361457824707, 221.778959274292 21.40439796447754, 222.34188652038574 22.201879501342773, 223.01658821105957 23.272138595581055, 223.3759479522705 23.668546676635742, 223.3722438812256 23.675954818725586, 223.57600212097168 23.675954818725586, 223.70566749572754 23.542585372924805, 223.78717231750488 23.3314151763916)))'::geometry, '1973-01-01', 'mo', 'http://planetarynames.wr.usgs.gov/Feature/4453');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(248, 'Karzok', 'SRID=104904;POINT (228.262902951161 18.4035270924109)'::geometry, 'SRID=104904;MULTIPOLYGON (((228.269330978394 18.2748584747314, 228.266962051392 18.2748394012451, 228.264589309692 18.2748584747314, 228.26222038269 18.2749156951904, 228.259851455688 18.2750148773193, 228.257482528687 18.2751522064209, 228.255121231079 18.2753276824951, 228.252759933472 18.2755451202393, 228.250402450562 18.2757968902588, 228.248052597046 18.2760906219482, 228.245706558228 18.2764263153076, 228.243368148804 18.2767963409424, 228.241037368774 18.2772083282471, 228.23871421814 18.2776546478271, 228.236398696899 18.2781429290771, 228.234094619751 18.2786655426025, 228.231798171997 18.2792301177979, 228.229513168335 18.2798328399658, 228.227239608765 18.2804698944092, 228.224977493286 18.2811489105225, 228.222726821899 18.2818622589111, 228.220491409302 18.2826137542725, 228.218271255493 18.2833995819092, 228.216066360474 18.2842235565186, 228.213872909546 18.2850856781006, 228.211698532104 18.285982131958, 228.209539413452 18.2869167327881, 228.207399368286 18.2878856658936, 228.205278396606 18.2888889312744, 228.203172683716 18.2899265289307, 228.201089859009 18.2910022735596, 228.199026107788 18.2921085357666, 228.196981430054 18.2932529449463, 228.194959640503 18.2944278717041, 228.192956924438 18.2956371307373, 228.190980911255 18.2968769073486, 228.189023971558 18.2981548309326, 228.187093734741 18.2994594573975, 228.185186386108 18.3007984161377, 228.183305740356 18.3021678924561, 228.181447982788 18.3035678863525, 228.179616928101 18.3050022125244, 228.177812576294 18.3064632415771, 228.176038742065 18.307954788208, 228.174287796021 18.3094730377197, 228.172567367554 18.3110218048096, 228.170873641968 18.3126010894775, 228.16921043396 18.3142032623291, 228.16757774353 18.3158359527588, 228.165975570679 18.3174953460693, 228.164403915405 18.3191814422607, 228.162858963013 18.320894241333, 228.161352157593 18.3226299285889, 228.159872055054 18.3243923187256, 228.158430099487 18.3261775970459, 228.157014846802 18.3279857635498, 228.155637741089 18.3298168182373, 228.154294967651 18.3316707611084, 228.152982711792 18.3335475921631, 228.151708602905 18.3354473114014, 228.150468826294 18.337366104126, 228.149263381958 18.3393039703369, 228.148092269897 18.3412647247314, 228.14695930481 18.343240737915, 228.145864486694 18.3452396392822, 228.144804000854 18.3472537994385, 228.143781661987 18.3492832183838, 228.142793655396 18.3513317108154, 228.141847610474 18.3533954620361, 228.140939712524 18.3554744720459, 228.140066146851 18.3575687408447, 228.139234542847 18.3596782684326, 228.138441085815 18.3617992401123, 228.137685775757 18.3639354705811, 228.136972427368 18.3660831451416, 228.136297225952 18.3682422637939, 228.135660171509 18.3704090118408, 228.135065078735 18.3725872039795, 228.134511947632 18.37477684021, 228.133996963501 18.376974105835, 228.133520126343 18.3791828155518, 228.133085250854 18.3813953399658, 228.132692337036 18.3836154937744, 228.132341384888 18.3858432769775, 228.132028579712 18.3880748748779, 228.131757736206 18.3903102874756, 228.13152885437 18.3925533294678, 228.131341934204 18.39479637146, 228.131196975708 18.3970432281494, 228.131090164185 18.3992938995361, 228.131025314331 18.4015445709229, 228.131002426147 18.4037952423096, 228.131021499634 18.4060459136963, 228.13108253479 18.408296585083, 228.131185531616 18.4105472564697, 228.131326675415 18.4127941131592, 228.131513595581 18.4150371551514, 228.13173866272 18.4172801971436, 228.132005691528 18.4195156097412, 228.132314682007 18.4217510223389, 228.132661819458 18.4239749908447, 228.133054733276 18.4261989593506, 228.13348197937 18.4284114837646, 228.133955001831 18.4306163787842, 228.134466171265 18.4328174591064, 228.135019302368 18.4350070953369, 228.135610580444 18.4371852874756, 228.13624382019 18.4393558502197, 228.136919021606 18.4415149688721, 228.137628555298 18.4436626434326, 228.138380050659 18.4457988739014, 228.13917350769 18.4479236602783, 228.140001296997 18.4500331878662, 228.140871047974 18.452127456665, 228.141775131226 18.4542064666748, 228.142721176147 18.4562740325928, 228.143705368042 18.4583225250244, 228.144723892212 18.460355758667, 228.145784378052 18.4623699188232, 228.146879196167 18.4643688201904, 228.148008346558 18.4663486480713, 228.149175643921 18.4683094024658, 228.150381088257 18.4702472686768, 228.151620864868 18.4721698760986, 228.152894973755 18.4740695953369, 228.154203414917 18.4759464263916, 228.155546188354 18.47780418396, 228.156923294067 18.4796352386475, 228.158334732056 18.4814472198486, 228.159776687622 18.4832363128662, 228.161256790161 18.4849987030029, 228.162763595581 18.4867343902588, 228.164304733276 18.4884471893311, 228.16587638855 18.4901371002197, 228.167478561401 18.4917964935303, 228.169115066528 18.49342918396, 228.170778274536 18.4950351715088, 228.172468185425 18.4966144561768, 228.174192428589 18.4981670379639, 228.175939559937 18.4996891021729, 228.177717208862 18.5011806488037, 228.179521560669 18.5026454925537, 228.181352615356 18.5040760040283, 228.183210372925 18.5054798126221, 228.185094833374 18.5068492889404, 228.187002182007 18.5081920623779, 228.188936233521 18.50950050354, 228.190893173218 18.5107746124268, 228.192869186401 18.5120182037354, 228.194871902466 18.5132274627686, 228.196897506714 18.5144062042236, 228.198942184448 18.5155506134033, 228.201009750366 18.5166568756104, 228.203096389771 18.5177326202393, 228.205202102661 18.5187740325928, 228.207326889038 18.5197811126709, 228.209466934204 18.5207500457764, 228.211629867554 18.5216846466064, 228.213804244995 18.5225811004639, 228.21600151062 18.5234432220459, 228.218210220337 18.5242710113525, 228.220434188843 18.5250568389893, 228.22266960144 18.5258121490479, 228.224924087524 18.5265254974365, 228.227186203003 18.5272045135498, 228.229463577271 18.5278415679932, 228.23175239563 18.5284442901611, 228.234052658081 18.5290088653564, 228.236360549927 18.5295352935791, 228.238679885864 18.5300235748291, 228.241006851196 18.5304698944092, 228.243341445923 18.5308818817139, 228.245683670044 18.5312557220459, 228.248029708862 18.531587600708, 228.250383377075 18.5318813323975, 228.252744674683 18.5321369171143, 228.255109786987 18.5323505401611, 228.257474899292 18.5325298309326, 228.259847640991 18.5326671600342, 228.262216567993 18.5327663421631, 228.26459312439 18.5328235626221, 228.266965866089 18.5328426361084, 228.269342422485 18.5328235626221, 228.271715164185 18.5327625274658, 228.274087905884 18.5326671600342, 228.276456832886 18.5325298309326, 228.278825759888 18.5323505401611, 228.281187057495 18.5321369171143, 228.283548355103 18.5318813323975, 228.285902023315 18.531587600708, 228.288251876831 18.5312519073486, 228.290594100952 18.5308818817139, 228.292928695679 18.5304698944092, 228.295255661011 18.5300197601318, 228.297574996948 18.5295352935791, 228.299882888794 18.5290088653564, 228.302179336548 18.5284442901611, 228.304468154907 18.5278415679932, 228.306745529175 18.5272006988525, 228.309011459351 18.5265254974365, 228.311262130737 18.5258083343506, 228.313501358032 18.5250568389893, 228.315725326538 18.5242671966553, 228.317934036255 18.5234432220459, 228.320127487183 18.5225811004639, 228.322305679321 18.5216808319092, 228.324464797974 18.5207462310791, 228.326608657837 18.5197772979736, 228.328733444214 18.5187702178955, 228.330839157104 18.5177326202393, 228.332925796509 18.5166568756104, 228.334989547729 18.5155467987061, 228.337034225464 18.5144023895264, 228.339059829712 18.5132274627686, 228.341062545776 18.5120143890381, 228.343042373657 18.5107707977295, 228.344995498657 18.5094966888428, 228.346929550171 18.5081882476807, 228.348836898804 18.5068454742432, 228.350721359253 18.5054759979248, 228.352579116821 18.5040721893311, 228.354410171509 18.5026416778564, 228.356214523315 18.5011768341064, 228.357992172241 18.4996852874756, 228.359739303589 18.4981632232666, 228.361463546753 18.4966106414795, 228.363153457642 18.4950313568115, 228.364816665649 18.4934253692627, 228.366449356079 18.491792678833, 228.368055343628 18.4901294708252, 228.369626998901 18.4884433746338, 228.371168136597 18.4867305755615, 228.372674942017 18.4849910736084, 228.374151229858 18.4832286834717, 228.375597000122 18.4814434051514, 228.37700843811 18.4796314239502, 228.378385543823 18.4778003692627, 228.379728317261 18.4759426116943, 228.381036758423 18.4740619659424, 228.38231086731 18.4721660614014, 228.383550643921 18.4702434539795, 228.38475227356 18.4683017730713, 228.385919570923 18.4663410186768, 228.387052536011 18.4643650054932, 228.388147354126 18.462366104126, 228.389204025269 18.4603481292725, 228.390226364136 18.4583187103271, 228.391206741333 18.4562664031982, 228.392152786255 18.4542026519775, 228.393060684204 18.4521198272705, 228.393926620483 18.4500255584717, 228.394758224487 18.4479160308838, 228.395547866821 18.4457950592041, 228.396299362183 18.4436588287354, 228.397012710571 18.4415111541748, 228.39768409729 18.4393520355225, 228.398317337036 18.4371814727783, 228.398908615112 18.4349994659424, 228.399461746216 18.4328098297119, 228.399972915649 18.4306125640869, 228.40044593811 18.4284076690674, 228.400876998901 18.4261913299561, 228.401266098022 18.4239711761475, 228.401613235474 18.4217433929443, 228.401922225952 18.4195117950439, 228.402189254761 18.417272567749, 228.402414321899 18.4150333404541, 228.402597427368 18.4127864837646, 228.402742385864 18.4105396270752, 228.40284538269 18.4082927703857, 228.402902603149 18.406042098999, 228.402921676636 18.403787612915, 228.402898788452 18.4015369415283, 228.402837753296 18.3992862701416, 228.402730941772 18.3970394134521, 228.402585983276 18.3947887420654, 228.402395248413 18.3925457000732, 228.402166366577 18.3903064727783, 228.401895523071 18.3880672454834, 228.401586532593 18.385835647583, 228.401231765747 18.3836116790771, 228.400838851929 18.3813877105713, 228.40040397644 18.3791751861572, 228.399930953979 18.3769702911377, 228.399415969849 18.3747730255127, 228.398859024048 18.3725833892822, 228.398263931274 18.3704051971436, 228.397626876831 18.3682346343994, 228.396951675415 18.3660755157471, 228.396238327026 18.3639316558838, 228.395483016968 18.361795425415, 228.394689559937 18.3596744537354, 228.393857955933 18.3575649261475, 228.392988204956 18.3554706573486, 228.39207649231 18.3533916473389, 228.391130447388 18.3513278961182, 228.390146255493 18.3492794036865, 228.389120101929 18.3472461700439, 228.388063430786 18.3452320098877, 228.386964797974 18.3432369232178, 228.385831832886 18.3412609100342, 228.384660720825 18.3393001556396, 228.383455276489 18.3373622894287, 228.382215499878 18.3354434967041, 228.380941390991 18.3335437774658, 228.379629135132 18.3316669464111, 228.378286361694 18.32981300354, 228.376905441284 18.3279819488525, 228.375494003296 18.3261699676514, 228.374048233032 18.3243846893311, 228.37257194519 18.3226261138916, 228.371061325073 18.3208866119385, 228.369520187378 18.3191776275635, 228.367948532104 18.3174915313721, 228.366346359253 18.3158321380615, 228.364709854126 18.3141994476318, 228.363046646118 18.3125972747803, 228.361356735229 18.3110179901123, 228.359636306763 18.3094692230225, 228.357885360718 18.3079509735107, 228.356107711792 18.3064594268799, 228.354303359985 18.3049983978271, 228.352472305298 18.3035640716553, 228.350618362427 18.3021640777588, 228.348733901978 18.3007946014404, 228.346826553345 18.2994556427002, 228.344896316528 18.2981510162354, 228.342943191528 18.2968769073486, 228.340963363647 18.29563331604, 228.33896446228 18.2944240570068, 228.336938858032 18.293249130249, 228.334897994995 18.2921085357666, 228.332830429077 18.2909984588623, 228.33074760437 18.2899265289307, 228.328645706177 18.2888851165771, 228.3265209198 18.2878818511963, 228.324380874634 18.2869129180908, 228.322221755981 18.285982131958, 228.32004737854 18.2850856781006, 228.31785774231 18.2842235565186, 228.315649032593 18.2833995819092, 228.313428878784 18.2826099395752, 228.311193466187 18.2818584442139, 228.3089427948 18.2811450958252, 228.306684494019 18.2804698944092, 228.304410934448 18.2798290252686, 228.302125930786 18.2792301177979, 228.299829483032 18.2786655426025, 228.297521591187 18.2781391143799, 228.295206069946 18.2776546478271, 228.292882919312 18.2772045135498, 228.290552139282 18.2767963409424, 228.288213729858 18.2764225006104, 228.28586769104 18.2760906219482, 228.283517837524 18.2757968902588, 228.281160354614 18.2755451202393, 228.278802871704 18.2753276824951, 228.276437759399 18.2751522064209, 228.274072647095 18.2750148773193, 228.271703720093 18.2749156951904, 228.269330978394 18.2748584747314)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14144');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(249, 'Pangboche', 'SRID=104904;POINT (226.595873773026 17.2783598670807)'::geometry, 'SRID=104904;MULTIPOLYGON (((226.601442337036 17.1929302215576, 226.599878311157 17.1929187774658, 226.598310470581 17.1929302215576, 226.596746444702 17.1929721832275, 226.595178604126 17.1930370330811, 226.593618392944 17.1931285858154, 226.592054367065 17.1932430267334, 226.590497970581 17.1933879852295, 226.588941574097 17.1935558319092, 226.587385177612 17.193754196167, 226.585836410522 17.1939754486084, 226.58429145813 17.1942195892334, 226.582754135132 17.1944942474365, 226.581216812134 17.1947917938232, 226.57968711853 17.1951160430908, 226.578165054321 17.195463180542, 226.576650619507 17.195837020874, 226.57513999939 17.1962375640869, 226.573637008667 17.1966648101807, 226.572145462036 17.197114944458, 226.570657730103 17.1975879669189, 226.569181442261 17.1980876922607, 226.567712783813 17.1986103057861, 226.566255569458 17.1991596221924, 226.564809799194 17.1997318267822, 226.563371658325 17.2003269195557, 226.561948776245 17.20094871521, 226.56053352356 17.2015933990479, 226.559129714966 17.2022609710693, 226.557741165161 17.2029514312744, 226.556364059448 17.2036647796631, 226.555002212524 17.2044010162354, 226.553651809692 17.2051601409912, 226.552316665649 17.2059421539307, 226.550992965698 17.2067432403564, 226.549688339233 17.2075710296631, 226.54839515686 17.2084178924561, 226.547121047974 17.2092876434326, 226.545862197876 17.2101764678955, 226.544618606567 17.211088180542, 226.543394088745 17.2120189666748, 226.542184829712 17.2129688262939, 226.540990829468 17.2139415740967, 226.539819717407 17.2149333953857, 226.538663864136 17.2159404754639, 226.537527084351 17.2169704437256, 226.536409378052 17.2180194854736, 226.535310745239 17.219087600708, 226.534231185913 17.2201709747314, 226.533174514771 17.2212734222412, 226.532133102417 17.2223949432373, 226.531118392944 17.2235317230225, 226.530118942261 17.2246875762939, 226.529146194458 17.2258586883545, 226.528188705444 17.2270450592041, 226.527257919312 17.2282466888428, 226.526346206665 17.2294635772705, 226.525461196899 17.2306995391846, 226.52459526062 17.2319469451904, 226.523752212524 17.2332057952881, 226.522932052612 17.2344837188721, 226.522138595581 17.2357730865479, 226.521364212036 17.2370738983154, 226.520616531372 17.2383899688721, 226.519891738892 17.2397136688232, 226.519193649292 17.2410526275635, 226.518518447876 17.2424030303955, 226.517869949341 17.2437648773193, 226.517244338989 17.245138168335, 226.516641616821 17.2465190887451, 226.516069412231 17.2479114532471, 226.515520095825 17.2493152618408, 226.514993667603 17.2507228851318, 226.514497756958 17.2521419525146, 226.514024734497 17.253568649292, 226.513578414917 17.2550029754639, 226.513158798218 17.2564449310303, 226.512765884399 17.2578945159912, 226.512399673462 17.2593479156494, 226.512060165405 17.2608089447021, 226.511747360229 17.2622776031494, 226.511461257935 17.2637462615967, 226.511201858521 17.2652225494385, 226.510969161987 17.2667026519775, 226.510766983032 17.2681865692139, 226.510587692261 17.2696743011475, 226.51043510437 17.2711620330811, 226.510313034058 17.2726535797119, 226.510217666626 17.27414894104, 226.510149002075 17.2756404876709, 226.510107040405 17.277135848999, 226.510091781616 17.2786350250244, 226.510103225708 17.2801303863525, 226.510145187378 17.2816257476807, 226.510213851929 17.2831211090088, 226.510305404663 17.2846164703369, 226.510431289673 17.2861080169678, 226.510580062866 17.2875957489014, 226.51075553894 17.289083480835, 226.510957717896 17.2905673980713, 226.511190414429 17.2920475006104, 226.511449813843 17.2935237884521, 226.51173210144 17.2949924468994, 226.512044906616 17.2964611053467, 226.512384414673 17.2979221343994, 226.51275062561 17.2993755340576, 226.513139724731 17.3008251190186, 226.513559341431 17.302267074585, 226.514001846313 17.3037014007568, 226.514474868774 17.3051280975342, 226.514970779419 17.306547164917, 226.515493392944 17.3079586029053, 226.516042709351 17.309362411499, 226.51661491394 17.310754776001, 226.517213821411 17.3121356964111, 226.517839431763 17.3135089874268, 226.518487930298 17.3148708343506, 226.519163131714 17.3162212371826, 226.519861221313 17.3175601959229, 226.520586013794 17.3188877105713, 226.521333694458 17.3202037811279, 226.522104263306 17.3215045928955, 226.522897720337 17.3227939605713, 226.523717880249 17.3240718841553, 226.524557113647 17.3253345489502, 226.525423049927 17.3265819549561, 226.52631187439 17.3278141021729, 226.527219772339 17.3290348052979, 226.528150558472 17.3302364349365, 226.529108047485 17.3314228057861, 226.530080795288 17.3325939178467, 226.531076431274 17.3337497711182, 226.532094955444 17.3348903656006, 226.533132553101 17.3360080718994, 226.53419303894 17.3371143341064, 226.535272598267 17.3381977081299, 226.536371231079 17.3392658233643, 226.537488937378 17.3403148651123, 226.538625717163 17.341344833374, 226.539781570435 17.3423557281494, 226.540952682495 17.3433475494385, 226.542146682739 17.3443202972412, 226.543355941772 17.3452739715576, 226.544580459595 17.3462047576904, 226.545824050903 17.3471164703369, 226.547082901001 17.3480052947998, 226.548360824585 17.3488750457764, 226.549654006958 17.3497219085693, 226.550958633423 17.350549697876, 226.552282333374 17.351354598999, 226.553617477417 17.3521366119385, 226.554967880249 17.3528957366943, 226.55633354187 17.3536319732666, 226.557710647583 17.3543453216553, 226.559099197388 17.3550395965576, 226.560503005981 17.3557071685791, 226.561918258667 17.356351852417, 226.563344955444 17.356969833374, 226.564783096313 17.3575687408447, 226.566232681274 17.3581409454346, 226.56768989563 17.3586902618408, 226.569158554077 17.3592128753662, 226.570634841919 17.359712600708, 226.572122573853 17.3601894378662, 226.573617935181 17.3606395721436, 226.575120925903 17.36106300354, 226.576631546021 17.3614635467529, 226.578149795532 17.361837387085, 226.579675674438 17.3621883392334, 226.581205368042 17.362512588501, 226.58274269104 17.3628101348877, 226.584283828735 17.3630847930908, 226.585828781128 17.3633289337158, 226.587377548218 17.3635501861572, 226.588933944702 17.363748550415, 226.590490341187 17.3639163970947, 226.592050552368 17.3640613555908, 226.593614578247 17.3641757965088, 226.595178604126 17.3642673492432, 226.596746444702 17.3643321990967, 226.598314285278 17.3643741607666, 226.599882125854 17.3643856048584, 226.601449966431 17.3643741607666, 226.603017807007 17.3643321990967, 226.604581832886 17.3642673492432, 226.606145858765 17.3641757965088, 226.607709884644 17.3640613555908, 226.609270095825 17.3639163970947, 226.610830307007 17.3637447357178, 226.612382888794 17.3635501861572, 226.613931655884 17.3633289337158, 226.615480422974 17.3630809783936, 226.617021560669 17.3628101348877, 226.618558883667 17.362512588501, 226.620088577271 17.3621883392334, 226.621610641479 17.361837387085, 226.623128890991 17.3614635467529, 226.624639511108 17.36106300354, 226.626142501831 17.3606395721436, 226.627637863159 17.3601856231689, 226.629125595093 17.359712600708, 226.630601882935 17.3592128753662, 226.632070541382 17.3586902618408, 226.633531570435 17.3581409454346, 226.634977340698 17.3575687408447, 226.636415481567 17.356969833374, 226.637842178345 17.3563480377197, 226.63925743103 17.3557033538818, 226.640661239624 17.3550357818604, 226.642049789429 17.3543453216553, 226.643426895142 17.3536319732666, 226.644792556763 17.3528957366943, 226.646142959595 17.3521327972412, 226.647478103638 17.3513507843018, 226.648801803589 17.3505458831787, 226.650110244751 17.3497219085693, 226.651399612427 17.3488750457764, 226.652677536011 17.3480052947998, 226.653936386108 17.3471126556396, 226.655179977417 17.3462009429932, 226.656408309937 17.3452701568604, 226.65761756897 17.3443202972412, 226.658807754517 17.3433475494385, 226.659982681274 17.3423557281494, 226.661138534546 17.341344833374, 226.662275314331 17.3403148651123, 226.66339302063 17.3392658233643, 226.664487838745 17.3381977081299, 226.665567398071 17.3371105194092, 226.666627883911 17.3360080718994, 226.667665481567 17.3348865509033, 226.668684005737 17.3337459564209, 226.669679641724 17.3325939178467, 226.670656204224 17.3314228057861, 226.67160987854 17.3302326202393, 226.672540664673 17.3290309906006, 226.673448562622 17.3278141021729, 226.674337387085 17.3265781402588, 226.675203323364 17.3253307342529, 226.676042556763 17.324068069458, 226.676862716675 17.3227939605713, 226.677656173706 17.3215007781982, 226.678426742554 17.3201999664307, 226.679174423218 17.318883895874, 226.679899215698 17.3175563812256, 226.680597305298 17.3162174224854, 226.681272506714 17.3148670196533, 226.681921005249 17.3135051727295, 226.682546615601 17.3121318817139, 226.683145523071 17.3107509613037, 226.683717727661 17.3093585968018, 226.684267044067 17.307954788208, 226.684789657593 17.3065433502197, 226.685285568237 17.3051242828369, 226.685754776001 17.3036975860596, 226.686201095581 17.3022632598877, 226.686616897583 17.3008213043213, 226.687009811401 17.2993717193604, 226.687376022339 17.2979183197021, 226.687715530396 17.2964572906494, 226.688024520874 17.2949886322021, 226.688310623169 17.2935199737549, 226.688570022583 17.2920436859131, 226.688798904419 17.290563583374, 226.689004898071 17.2890796661377, 226.689180374146 17.2875919342041, 226.689329147339 17.2861042022705, 226.689451217651 17.2846126556396, 226.689546585083 17.2831172943115, 226.689615249634 17.2816219329834, 226.689653396606 17.2801265716553, 226.689668655396 17.2786312103271, 226.689653396606 17.277135848999, 226.689611434937 17.2756366729736, 226.689542770386 17.2741451263428, 226.689443588257 17.2726497650146, 226.689321517944 17.2711582183838, 226.689168930054 17.2696704864502, 226.688993453979 17.2681827545166, 226.688787460327 17.2666988372803, 226.688554763794 17.2652187347412, 226.68829536438 17.2637424468994, 226.688009262085 17.2622737884521, 226.687696456909 17.2608051300049, 226.687356948853 17.2593441009521, 226.686990737915 17.2578907012939, 226.686597824097 17.256441116333, 226.686178207397 17.2549991607666, 226.685731887817 17.2535648345947, 226.685258865356 17.2521381378174, 226.684762954712 17.2507190704346, 226.684236526489 17.2493114471436, 226.683687210083 17.2479076385498, 226.683115005493 17.2465152740479, 226.682512283325 17.2451343536377, 226.681886672974 17.2437610626221, 226.681238174438 17.2424030303955, 226.680562973022 17.2410526275635, 226.679864883423 17.2397136688232, 226.679140090942 17.2383861541748, 226.678392410278 17.2370700836182, 226.677618026733 17.2357692718506, 226.676824569702 17.2344799041748, 226.67600440979 17.2332057952881, 226.675161361694 17.2319431304932, 226.674295425415 17.2306957244873, 226.673410415649 17.2294635772705, 226.672498703003 17.2282428741455, 226.671564102173 17.2270412445068, 226.670610427856 17.2258548736572, 226.669637680054 17.2246837615967, 226.66863822937 17.2235317230225, 226.6676197052 17.22239112854, 226.666582107544 17.2212734222412, 226.665525436401 17.2201709747314, 226.664445877075 17.2190837860107, 226.663347244263 17.2180194854736, 226.662229537964 17.2169704437256, 226.661092758179 17.2159404754639, 226.659936904907 17.2149295806885, 226.658761978149 17.2139377593994, 226.657571792603 17.2129650115967, 226.656362533569 17.2120151519775, 226.655138015747 17.2110843658447, 226.653894424438 17.2101726531982, 226.652635574341 17.2092838287354, 226.651357650757 17.2084140777588, 226.650068283081 17.2075672149658, 226.648759841919 17.2067432403564, 226.647439956665 17.2059383392334, 226.646104812622 17.2051563262939, 226.64475440979 17.2043972015381, 226.643388748169 17.2036609649658, 226.642011642456 17.2029476165771, 226.640623092651 17.2022571563721, 226.639223098755 17.2015895843506, 226.637807846069 17.2009449005127, 226.636381149292 17.2003269195557, 226.63494682312 17.1997318267822, 226.633497238159 17.1991558074951, 226.632040023804 17.1986103057861, 226.630575180054 17.1980838775635, 226.629095077515 17.1975879669189, 226.627611160278 17.1971111297607, 226.62611579895 17.1966609954834, 226.624616622925 17.1962375640869, 226.623106002808 17.195837020874, 226.621587753296 17.195463180542, 226.620065689087 17.1951160430908, 226.618535995483 17.1947917938232, 226.617002487183 17.1944942474365, 226.615461349487 17.1942195892334, 226.613916397095 17.1939716339111, 226.612367630005 17.1937503814697, 226.610815048218 17.1935558319092, 226.609258651733 17.1933879852295, 226.607698440552 17.1932430267334, 226.60613822937 17.1931285858154, 226.604574203491 17.1930370330811, 226.603010177612 17.1929721832275, 226.601442337036 17.1929302215576)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14145');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1849, 'Hermes Patera', 'SRID=104904;POINT (226.57 18.33)'::geometry, 'SRID=104904;POLYGON ((226.27743530274 18.067016601562, 226.25820922852 18.135681152343, 226.255462646485 18.216705322265124, 226.26507568359813 18.293609619139627, 226.25614929199594 18.331375122069314, 226.26095581055 18.369140624999, 226.28842163086 18.465270996093, 226.35159301758 18.528442382812, 226.44772338867 18.577880859374, 226.48480224609438 18.594360351561626, 226.52462768555 18.6026000976555, 226.57955932617 18.608093261718, 226.68118286133 18.586120605468, 226.70590209961 18.569641113281, 226.74435424805 18.539428710937, 226.78555297852 18.514709472656, 226.83224487305 18.498229980468, 226.86932373046687 18.488616943359126, 226.89404296875 18.4721374511715, 226.90090942383 18.451538085937, 226.90640258789 18.410339355468, 226.91189575195 18.380126953124, 226.92013549805 18.322448730468, 226.90640258789 18.251037597656, 226.87344360352 18.187866210937, 226.82949829102 18.146667480468, 226.79379272461 18.113708496093, 226.77456665039 18.102722167968, 226.72787475586 18.119201660156, 226.68392944336 18.141174316406, 226.63723754883125 18.15490722656175, 226.58779907226562 18.14254760742125, 226.56033325195 18.121948242187, 226.52188110352 18.088989257812, 226.48617553711 18.067016601562, 226.45321655274 18.083496093749, 226.38729858399 18.086242675781, 226.32412719727 18.078002929687, 226.27743530274 18.067016601562))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15690');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1688, 'Olympus Rupes', 'SRID=104904;POINT (226.43548539543502 18.401964175317982)'::geometry, 'SRID=104904;MULTILINESTRING ((227.42951774597168 22.934080123901367, 227.93671226501465 22.65593910217285, 228.34573936462402 22.4268856048584, 228.52571296691895 22.295995712280273, 228.67296028137207 22.099660873413086, 228.96746253967285 22.099660873413086, 229.62190437316895 21.739717483520508, 230.1290988922119 21.477941513061523, 230.35815620422363 21.26524543762207, 230.38258171081543 21.086992263793945, 230.2117748260498 20.55558967590332, 230.71787071228027 19.182798385620117, 230.8653507232666 18.500219345092773, 230.8653507232666 18.058469772338867, 230.8653507232666 17.96030616760254, 230.88171195983887 16.978639602661133, 230.9144344329834 16.635053634643555, 230.73446083068848 16.389638900756836, 230.6690158843994 16.242387771606445, 230.55448722839355 15.980611801147461, 230.45632362365723 15.816999435424805, 230.35815620422363 15.506139755249023, 230.0472927093506 15.457056045532227, 229.83220100402832 15.140348434448242, 229.54010200500488 14.73716926574707, 229.22923851013184 14.442667007446289, 228.86929512023926 14.213613510131836, 228.5420742034912 14.05000114440918, 228.2148494720459 14.148168563842773, 227.8221836090088 14.148168563842773, 227.2168254852295 13.984556198120117, 226.85687828063965 13.968194961547852, 226.49693489074707 14.05000114440918, 226.0879077911377 13.77186393737793, 225.80977058410645 13.755502700805664, 225.55567741394043 13.881429672241211, 225.3911952972412 14.058565139770508, 224.9426326751709 14.73716926574707, 224.76265907287598 14.73716926574707, 224.36999320983887 14.573556900024414, 223.97732734680176 14.802610397338867, 223.29015922546387 15.12983512878418, 222.70116233825684 15.391611099243164, 222.4393825531006 15.40797233581543, 221.93218803405762 15.40797233581543, 221.57224464416504 15.66975212097168, 221.4413547515869 16.09514045715332, 221.3431911468506 16.700498580932617, 221.39227104187012 17.07680320739746, 221.16321754455566 17.404027938842773, 220.89009284973145 17.53165626525879, 220.90144157409668 17.84577751159668, 221.14274787902832 17.76296043395996, 221.52316093444824 17.61672019958496, 221.86674308776855 18.074831008911133, 222.06307792663574 18.614748001098633, 221.8994655609131 18.860166549682617, 221.6376895904541 19.252832412719727, 221.62132835388184 19.59641456604004, 221.7358570098877 20.185415267944336, 221.94854927062988 20.774412155151367, 222.079439163208 21.26524543762207, 222.48846626281738 21.854246139526367, 222.99566078186035 22.508691787719727, 223.43741035461426 22.934080123901367, 223.78099250793457 23.13041114807129, 224.04277229309082 23.064966201782227, 224.3045482635498 22.999521255493164, 224.72993659973145 22.934080123901367, 224.9917163848877 22.88499641418457, 225.2862148284912 22.934080123901367, 225.72796440124512 23.01588249206543, 226.2351589202881 23.146772384643555, 226.61146354675293 23.27766227722168, 227.05321311950684 23.097688674926758, 227.42951774597168 22.934080123901367))'::geometry, '1976-01-01', 'ru', 'http://planetarynames.wr.usgs.gov/Feature/4454');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1847, 'Zeus Patera', 'SRID=104904;POINT (227.07 18.39)'::geometry, 'SRID=104904;POLYGON ((226.50457763673 18.675384521485, 226.51556396485 18.70834350586, 226.55401611329 18.766021728516, 226.6254272461 18.820953369141, 226.71881103516 18.853912353516, 226.82043457032 18.886871337891, 226.91107177735 18.886871337891, 226.99621582032 18.875885009766, 227.03741455079 18.873138427735, 226.99346923829 18.831939697266, 226.97973632813 18.77426147461, 226.99896240235 18.702850341797, 227.06213378907 18.631439208985, 227.15002441407 18.584747314454, 227.23516845704 18.568267822266, 227.30383300781875 18.59024047851625, 227.33404541016 18.628692626954, 227.34503173829 18.658905029297, 227.39721679688 18.587493896485, 227.42742919923 18.494110107422, 227.42193603516 18.408966064454, 227.39996337891 18.315582275391, 227.39172363282 18.227691650391, 227.34228515626 18.123321533204, 227.29559326173 18.018951416016, 227.21319580079 17.942047119141, 227.15551757813 17.903594970704, 227.09783935548 17.876129150391, 227.00170898438 17.845916748047, 226.9330444336 17.840423583985, 226.88635253907 17.840423583985, 226.90832519532 17.876129150391, 226.91381835938 17.925567626954, 226.90283203126 17.972259521485, 226.87536621094 18.021697998047, 226.82318115235 18.062896728516, 226.77923583985 18.098602294922, 226.83691406251 18.156280517579, 226.88360595704 18.233184814454, 226.91107177735 18.315582275391, 226.8890991211 18.40072631836, 226.88085937501 18.474884033204, 226.83142089844 18.507843017579, 226.72430419923 18.546295166016, 226.67761230469 18.584747314454, 226.6254272461 18.614959716797, 226.58972167969 18.617706298829, 226.62817382813 18.645172119141, 226.67761230469 18.650665283204, 226.61993408204 18.661651611329, 226.56500244141 18.64242553711, 226.4935913086 18.653411865235, 226.50457763673 18.675384521485))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15689');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1848, 'Athena Patera', 'SRID=104904;POINT (227.18 18.74)'::geometry, 'SRID=104904;POLYGON ((227.0290374756 18.766021728515, 227.04002380372 18.807220458984, 227.06062316896 18.840179443359, 227.08259582521 18.867645263671, 227.12928771974 18.880004882812, 227.17597961427 18.877258300781, 227.22541809083 18.866271972656, 227.28172302247 18.825073242187, 227.31605529786 18.775634765624, 227.328414917 18.731689453124, 227.33116149903 18.691864013671, 227.30369567872 18.656158447265, 227.2844696045 18.619079589843, 227.23915100099 18.599853515624, 227.18147277833 18.599853515624, 227.10594177247 18.624572753906, 227.05513000489 18.665771484374, 227.02491760255 18.705596923828, 227.0207977295 18.744049072265, 227.0290374756 18.766021728515))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15693');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1850, 'Apollo Patera', 'SRID=104904;POINT (226.45 17.94)'::geometry, 'SRID=104904;POLYGON ((226.28540039064 17.909774780272, 226.27441406252 17.938613891601, 226.26754760744 17.981185913085, 226.27716064455 18.027877807616, 226.30325317385 18.074569702147, 226.35818481447 18.091049194335, 226.40075683596 18.091049194335, 226.46804809572 18.073196411132, 226.52572631838 18.045730590819, 226.56967163088 18.023757934569, 226.63146972658 17.946853637694, 226.63558959963 17.878189086913, 226.62185668947 17.83836364746, 226.61911010744 17.806777954101, 226.59439086916 17.788925170897, 226.52847290041 17.780685424804, 226.45980834963 17.808151245116, 226.40899658205 17.832870483397, 226.37878417971 17.841110229491, 226.33758544924 17.864456176757, 226.30462646486 17.887802124022, 226.28540039064 17.909774780272))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15694');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1851, 'Olympus Paterae', 'SRID=104904;POINT (226.81 18.32)'::geometry, 'SRID=104904;POLYGON ((226.14367675781 18.452911376953, 226.16564941406 18.513336181641, 226.2041015625 18.554534912109, 226.23431396484 18.592987060547, 226.30572509766 18.625946044922, 226.36889648438 18.650665283203, 226.42108154297 18.653411865234, 226.45678710938 18.642425537109, 226.49249267578 18.700103759766, 226.54193115234 18.755035400391, 226.58312988281 18.809967041016, 226.65454101563 18.845672607422, 226.72320556641 18.870391845703, 226.82757568359 18.895111083984, 226.88525390625 18.911590576172, 226.96545410157 18.900604248046, 227.0121459961 18.900604248046, 227.04785156251 18.889617919921, 227.08355712891 18.906097412109, 227.13299560548 18.917083740234, 227.21813964844 18.911590576171, 227.28405761719 18.875885009765, 227.33349609376 18.829193115234, 227.37194824219 18.771514892578, 227.37744140626 18.735809326171, 227.38156127930375 18.711776733397812, 227.3808746337928 18.69255065917931, 227.37469482423 18.675384521484, 227.40216064454 18.620452880859, 227.43237304688 18.571014404296, 227.4515991211 18.496856689453, 227.45709228516 18.441925048828, 227.44885253907 18.38150024414, 227.44061279298 18.323822021484, 227.43237304688 18.277130126953, 227.41589355469 18.202972412109, 227.38018798829 18.120574951171, 227.34448242188 18.05191040039, 227.31701660157 17.999725341796, 227.26757812501 17.950286865234, 227.22088623048 17.911834716796, 227.17419433594 17.870635986328, 227.12475585938 17.848663330078, 227.03686523438 17.821197509765, 226.97918701173 17.801971435546, 226.88580322266 17.815704345703, 226.85009765626 17.790985107421, 226.81439208985 17.769012451171, 226.7484741211 17.741546630859, 226.68530273438 17.733306884765, 226.62762451173 17.738800048828, 226.57543945313 17.736053466796, 226.50128173829 17.72232055664, 226.39416503907 17.758026123046, 226.32550048829 17.78823852539, 226.29803466798 17.823944091796, 226.27056884766 17.843170166015, 226.21289062501 17.89810180664, 226.20465087891 17.966766357421, 226.22937011719 18.035430908203, 226.20465087891 18.084869384765, 226.18267822266 18.13980102539, 226.17169189454 18.18374633789, 226.17993164063 18.20571899414, 226.15795898438 18.252410888671, 226.13873291016 18.318328857421, 226.13049316407 18.389739990234, 226.14367675781 18.452911376953))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15695');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1870, 'Dionysus Patera', 'SRID=104904;POINT (226.77 17.96)'::geometry, 'SRID=104904;POLYGON ((226.53973388672 18.046417236328, 226.564453125 18.082122802735, 226.60015869141 18.11508178711, 226.64410400391 18.134307861328, 226.71826171875 18.117828369141, 226.77868652344 18.09310913086, 226.83361816406 18.043670654297, 226.87756347656 17.988739013672, 226.89129638672 17.936553955078, 226.8720703125 17.870635986328, 226.828125 17.82943725586, 226.7484741211 17.799224853516, 226.68530273438 17.793731689453, 226.64959716797 17.78549194336, 226.61389160156 17.782745361328, 226.63037109375 17.848663330078, 226.63037109375 17.914581298828, 226.62213134766 17.972259521485, 226.58093261719 18.021697998047, 226.53973388672 18.046417236328))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15692');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1871, 'Hera Patera', 'SRID=104904;POINT (226.23 18.45)'::geometry, 'SRID=104904;POLYGON ((226.21000671387 18.244171142578, 226.18116760254063 18.30047607421875, 226.17567443848188 18.347167968749623, 226.17155456543125 18.41445922851525, 226.19902038575 18.489990234375377, 226.24021911621563 18.549041748046875, 226.32124328613438 18.602600097655873, 226.37892150879125 18.616333007812376, 226.44209289551 18.61083984375, 226.396774292 18.582000732422, 226.3610687255875 18.55316162109375, 226.31986999512 18.511962890625, 226.2827911377 18.474884033203, 226.27043151856 18.428192138672, 226.24845886231 18.367767333984, 226.24021911621 18.21533203125, 226.21000671387 18.244171142578))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15691');
-- TEST GIS DATA FROM OPENSTREETMAP: EARTH, Ancienne Sylvie
--Testcase 14:
CREATE TABLE "♁" (
geom public.geometry NOT NULL,
osm_type varchar(16) NOT NULL,
osm_id int8 NOT NULL,
ver int2 NOT NULL,
arr _int8 NULL,
t json NULL
);
--Testcase 15: ETC...
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4596087 59.6907755)'::geometry, 'node', 1621246531, 4, NULL, '{"drain":"disperse"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601391 59.6904673)'::geometry, 'node', 1621246620, 24, NULL, '{"access":"yes","addr:housenumber":"20 литВЕ","addr:street":"Садовая улица","architect":"Ж.-Ф. Тома де Томон","barrier":"gate","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6458/","historic":"yes","locked":"no","name":"Ворота памятника Любезным родителям","ref:okn":"781610399040286","start_date":"1807","tourism":"attraction","wikidata":"Q118122048"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617098 59.6910199)'::geometry, 'node', 1632220259, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617672 59.6909141)'::geometry, 'node', 1632220283, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461757 59.6909696)'::geometry, 'node', 1632220292, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614802 59.6907676)'::geometry, 'node', 1632220315, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615866 59.6907823)'::geometry, 'node', 1632220319, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611444 59.6908848)'::geometry, 'node', 1632220350, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611916 59.6908345)'::geometry, 'node', 1632220355, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.46127 59.6907954)'::geometry, 'node', 1632220358, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611342 59.6909402)'::geometry, 'node', 1632220359, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614212 59.6910868)'::geometry, 'node', 1632220364, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611621 59.6909941)'::geometry, 'node', 1632220366, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616766 59.6908145)'::geometry, 'node', 1632220378, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616314 59.691059)'::geometry, 'node', 1632220590, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613148 59.6910721)'::geometry, 'node', 1632220686, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613385 59.6907988)'::geometry, 'node', 1632497609, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6476/","historic":"yes","historic:start_date":"1794","int_name":"Euterpe","material":"metal","name":"Эвтерпа","name:el":"Εὐτέρπη","name:la":"Euterpē","name:uk":"Евтерпа","name:zh":"欧忒耳佩","note":"Ошибочно подписано «Clio»","ref":"П-61/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614438 59.6907856)'::geometry, 'node', 1632497610, 30, NULL, '{"alt_name:el":"Χλωρίς","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1796","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6475/","historic":"yes","historic:start_date":"1796","int_name":"Flore","material":"metal","name":"Флора","name:el":"Φλόρα","name:en":"Flora","ref":"П-62/1","ref:okn":"781610399040456","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461244 59.690833)'::geometry, 'node', 1632497611, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6470/","historic":"yes","historic:start_date":"1795","int_name":"Melpomene","material":"metal","name":"Мельпомена","name:el":"Μελπομένη","name:en":"Melpomene","name:la":"Melpomenē","name:uk":"Мельпомена","name:zh":"墨爾波墨涅","ref":"П-60/1","ref:okn":"781610399040376","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617227 59.6909514)'::geometry, 'node', 1632497612, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6468/","historic":"yes","historic:start_date":"1793","int_name":"Caliope","material":"metal","name":"Калиопа","name:el":"Καλλιόπη","name:la":"Calliopē","name:uk":"Калліопа","name:zh":"卡利俄佩","ref":"П-65/1","start_date":"1798","tourism":"artwork","wikidata":"Q120979306"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615805 59.6907985)'::geometry, 'node', 1632497613, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6474/","historic":"yes","historic:start_date":"1795","int_name":"Uranie","material":"metal","name":"Урания","name:el":"Οὐρανία","name:la":"Ūrania","ref":"П-63/1","ref:okn":"78161039904044","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616825 59.6908428)'::geometry, 'node', 1632497614, 29, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6469/","historic":"yes","historic:start_date":"1794","material":"metal","name":"Клио","name:el":"Κλειώ","name:la":"Clīō","note":"Подписано «Euterpe»","ref":"П-64/1","ref:okn":"781610399040466","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614541 59.6909278)'::geometry, 'node', 1632497615, 34, NULL, '{"alt_name":"Аполлон Бельведерский","artist_name":"Леохар;модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1782","artwork_type":"statue","description":"Иконография Бельведерского типа. В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6466/","historic":"yes","historic:start_date":"1782","material":"metal","name":"Аполлон","name:en":"Apollo","name:zh":"阿波罗神像","ref":"П-71/1","ref:okn":"781610399040386","start_date":"1817","tourism":"artwork","wikidata":"Q118122062"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616021 59.6910564)'::geometry, 'node', 1632497616, 26, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1780","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","historic":"yes","historic:start_date":"1780","material":"metal","name":"Венера Каллипиги","ref":"П-67/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616651 59.6910293)'::geometry, 'node', 1632497617, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6471/","historic":"yes","historic:start_date":"1793","int_name":"Polymnia","material":"metal","name":"Полигимния","name:el":"Πολύμνια","name:la":"Polyhymnia","name:uk":"Полігімнія","name:zh":"波吕许谟尼亚","ref":"П-66/1","ref:okn":"781610399040726","start_date":"1798","tourism":"artwork","wikidata":"Q121395079"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614666 59.6910732)'::geometry, 'node', 1632497618, 30, NULL, '{"alt_name":"Гермес Флорентийский","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6467/","historic":"yes","historic:start_date":"1794","int_name":"Hermes","material":"metal","name":"Меркурий","name:en":"Mercury","ref":"П-68/1","ref:okn":"781610399040396","start_date":"1810","tourism":"artwork","wikidata":"Q121395060"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613231 59.6910597)'::geometry, 'node', 1632497619, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_subject:wikidata":"Q104413","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6477/","historic":"yes","historic:start_date":"1793","int_name":"Erato","material":"metal","name":"Эрато","name:el":"Ἐρατώ","name:ka":"ერატო","name:ko":"에라토","name:la":"Eratō","name:uk":"Ерато","name:zh":"厄剌托","ref":"П-69/1","ref:okn":"781610399040476","start_date":"1798","tourism":"artwork","wikidata":"Q121395110"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612077 59.691005)'::geometry, 'node', 1632497620, 31, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6473/","historic":"yes","historic:start_date":"1794","int_name":"Terpsichore","material":"metal","name":"Терпсихора","name:el":"Τερψιχόρη","name:en":"Terpsichore","name:la":"Terpsichore","ref":"П-70/1","ref:okn":"781610399040436","start_date":"1798","tourism":"artwork","wikidata":"Q121395096"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611782 59.690902)'::geometry, 'node', 1632497621, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1792","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6472/","historic":"yes","historic:start_date":"1792","int_name":"Thalie","material":"metal","name":"Талия","name:el":"Θαλία","name:la":"Thalīa","name:uk":"Талія","name:zh":"塔利亚","ref":"П-59/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612041 59.6907321)'::geometry, 'node', 1632503254, 6, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.462536 59.6908707)'::geometry, 'node', 1652587953, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4619277 59.6908578)'::geometry, 'node', 1652587958, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617256 59.6909215)'::geometry, 'node', 3177639362, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612018 59.6909805)'::geometry, 'node', 3188928044, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613001 59.6906759)'::geometry, 'node', 3218618266, 4, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614144 59.6907882)'::geometry, 'node', 4912277772, 4, NULL, '{"board_type":"history","information":"board","name":"Флора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615482 59.6907937)'::geometry, 'node', 4912277773, 4, NULL, '{"board_type":"history","information":"board","name":"Урания","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613145 59.6908057)'::geometry, 'node', 4912277774, 4, NULL, '{"board_type":"history","information":"board","name":"Эвтерпа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616653 59.6908341)'::geometry, 'node', 4912277775, 4, NULL, '{"board_type":"history","information":"board","name":"Клио","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612216 59.6908451)'::geometry, 'node', 4912277776, 4, NULL, '{"board_type":"history","information":"board","name":"Мельпомена","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611751 59.690919)'::geometry, 'node', 4912277777, 4, NULL, '{"board_type":"history","information":"board","name":"Талия","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617272 59.6909351)'::geometry, 'node', 4912277778, 4, NULL, '{"board_type":"history","information":"board","name":"Калиопа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612298 59.691015)'::geometry, 'node', 4912277779, 4, NULL, '{"board_type":"history","information":"board","name":"Терпсихора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616819 59.6910157)'::geometry, 'node', 4912277780, 4, NULL, '{"board_type":"history","information":"board","name":"Полигимния","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461621 59.6910498)'::geometry, 'node', 4912277781, 4, NULL, '{"board_type":"history","information":"board","name":"Венера Каллипиги","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613548 59.6910624)'::geometry, 'node', 4912277782, 4, NULL, '{"board_type":"history","information":"board","name":"Эрато","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615016 59.6910712)'::geometry, 'node', 4912277783, 4, NULL, '{"board_type":"history","information":"board","name":"Меркурий","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608954 59.6897746)'::geometry, 'node', 5251698420, 25, NULL, '{"access":"permissive","addr:housenumber":"20 литББ","addr:street":"Садовая улица","architect":"Винченцо Бренна","barrier":"gate","description:access":"Ворота можно закрывать и открывать руками","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6459/","historic":"yes","locked":"no","name":"Большие Старосильвийские ворота","ref":"1","ref:okn":"781620399040626","start_date":"1786..1793","tourism":"attraction","website":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","wheelchair":"yes","wikidata":"Q118122050"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460198 59.6905729)'::geometry, 'node', 6758903438, 6, NULL, '{"artist_name":"И.П. Мартос","artwork_type":"sculpture","height":"4","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4625734 59.6908311)'::geometry, 'node', 8331430683, 3, NULL, '{"inlet":"grate","manhole":"drain","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614743 59.690923)'::geometry, 'node', 8530936200, 1, NULL, '{"board_type":"history","information":"board","name":"Аполлон","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4597619 59.6907527)'::geometry, 'node', 9140565043, 1, NULL, '{"ford":"yes"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4606891 59.6906687)'::geometry, 'node', 9140576937, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608515 59.6907117)'::geometry, 'node', 9140576938, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613945 59.6911519)'::geometry, 'node', 9143069530, 5, NULL, '{"drain":"no","source:direction":"survey"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('POINT (30.4615903 59.6911716)'::geometry, 'node', 9143069534, 1, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460339 59.6906064)'::geometry, 'node', 9143093777, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601191 59.6906349)'::geometry, 'node', 9143093778, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610445 59.6908345)'::geometry, 'node', 9143093802, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610243 59.6909861)'::geometry, 'node', 9143093804, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612126 59.691117)'::geometry, 'node', 9143093806, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460445 59.6910504)'::geometry, 'node', 9656736571, 2, NULL, '{"colour":"#4e3a39","description":"Веломаршрут №4","height":"4","information":"guidepost","material":"metal","start_date":"2021-03..2021-10","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4608056 59.6895935, 30.4608954 59.6897746, 30.4609447 59.6898691, 30.4614541 59.6909278)'::geometry, 'way', 30995960, 42, '{9140727117,5251698420,1518870630,1632497615}', '{"highway":"footway","historic":"yes","name":"Центральная аллея","ref":"VII","source:name":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605616 59.6906319, 30.4597619 59.6907527, 30.4596087 59.6907755)'::geometry, 'way', 149099000, 6, '{1621246509,9140565043,1621246531}', '{"intermittent":"yes","source:direction":"isoline","start_date":"1786","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604741 59.6903357, 30.4604598 59.6904575, 30.4604646 59.6905099, 30.4604784 59.6905443, 30.4604933 59.6905665, 30.4605321 59.6905996, 30.4605616 59.6906319)'::geometry, 'way', 149099004, 8, '{1621246503,9140576877,1621246482,1621246465,1621246454,9140576939,1621246509}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601177 59.6905796, 30.4600903 59.6905709, 30.4600721 59.6905605, 30.4600579 59.6905458, 30.4600519 59.6905296, 30.4600545 59.6905133, 30.4600656 59.6904979, 30.4600844 59.6904845, 30.4601095 59.690474, 30.4601391 59.6904673, 30.460169 59.6904648, 30.4601991 59.6904661, 30.4602277 59.6904711, 30.4602498 59.6904787, 30.4602686 59.6904892, 30.4602829 59.6905018, 30.4602918 59.6905174, 30.4602917 59.6905327, 30.4602881 59.6905462, 30.4602793 59.6905579)'::geometry, 'way', 149099028, 5, '{9140576951,9140576902,9140576952,1621246602,1621246607,1621246668,1621246614,1621246615,1621246618,1621246620,1621246630,1621246244,1621246631,1621246224,1621246250,1621246635,1621246647,9140576950,9140576903,9140576949}', '{"barrier":"fence","colour":"green","fence_type":"wood","height":"2"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4603352 59.6911039, 30.460353 59.6910638, 30.4603719 59.6910414, 30.4603979 59.691021, 30.4604807 59.6909761, 30.460577 59.6909284, 30.4606406 59.6908886, 30.460669 59.6908562, 30.460673 59.6908234, 30.4606633 59.6907504, 30.4606582 59.6907286, 30.4606491 59.6907025, 30.4606314 59.690668, 30.460609 59.690636, 30.4605858 59.6906064, 30.4605578 59.6905735, 30.4605362 59.6905385, 30.4605214 59.6905022, 30.4605119 59.6904644, 30.4605095 59.6904098, 30.460512 59.6903499, 30.4605096 59.6903011)'::geometry, 'way', 149099029, 36, '{9140727237,4260007753,9140727241,8650331583,1621246592,1621246588,1621246578,1652603857,9140727240,8650331584,1621246577,9143093738,1621246419,9140576875,1652603906,9140576876,1621246542,8650331586,9140576874,8650331585,1621246403,9140576873,1239612684}', '{"alt_name":"Окружная дорожка","highway":"footway","historic":"yes","name":"Круговая дорожка","start_date":"1789.1793","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610979 59.6907799, 30.4608515 59.6907117)'::geometry, 'way', 149099034, 9, '{1632503255,9140576938}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4629005 59.6913411, 30.4614541 59.6909278)'::geometry, 'way', 150294524, 8, '{1239612692,1632497615}', '{"highway":"footway","historic":"yes","ref":"III","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613148 59.6910721, 30.4613667 59.6910818, 30.4614212 59.6910868, 30.4614766 59.6910869, 30.4615311 59.6910822, 30.4615833 59.6910728, 30.4616314 59.691059, 30.461674 59.6910412, 30.4617098 59.6910199, 30.4617378 59.6909958, 30.461757 59.6909696, 30.4617669 59.6909421, 30.4617672 59.6909141, 30.4617579 59.6908866, 30.4617393 59.6908603, 30.4617119 59.690836, 30.4616766 59.6908145, 30.4616343 59.6907964, 30.4615866 59.6907823, 30.4615347 59.6907726, 30.4614802 59.6907676, 30.4614248 59.6907674, 30.4613703 59.6907721, 30.4613181 59.6907815, 30.46127 59.6907954, 30.4612274 59.6908132, 30.4611916 59.6908345, 30.4611636 59.6908586, 30.4611444 59.6908848, 30.4611345 59.6909123, 30.4611342 59.6909402, 30.4611435 59.6909678, 30.4611621 59.6909941, 30.4611895 59.6910184, 30.4612248 59.6910399, 30.461267 59.6910579, 30.4613148 59.6910721)'::geometry, 'way', 150294525, 6, '{1632220686,9143093824,1632220364,9143093807,1632220588,9143093808,1632220590,9143093809,1632220259,9143093810,1632220292,9143093811,1632220283,9143093812,1632220296,9143093813,1632220378,9143093814,1632220319,9143093815,1632220315,9143093816,1632220323,9143093817,1632220358,9143093818,1632220355,9143093819,1632220350,9143093820,1632220359,9143093821,1632220366,9143093822,1632220374,9143093823,1632220686}', '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.460726 59.6910052, 30.460614 59.6910145, 30.4605241 59.69102, 30.4604597 59.691022, 30.4603979 59.691021)'::geometry, 'way', 150294532, 30, '{1632497615,1632220252,9140727238,9140727242,9140727239,1621246592}', '{"highway":"footway","historic":"yes","name":"луч домика Крик","ref":"X","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605096 59.6903011, 30.4614541 59.6909278)'::geometry, 'way', 150294541, 8, '{1239612684,1632497615}', '{"highway":"footway","historic":"yes","ref":"VIII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4617339 59.6901702)'::geometry, 'way', 150294547, 9, '{1632497615,1518870645}', '{"highway":"footway","historic":"yes","ref":"VI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461819 59.6910085, 30.4618473 59.6909863, 30.4618928 59.6909647, 30.461951 59.6909401, 30.4620356 59.6909251, 30.462536 59.6908707)'::geometry, 'way', 152440395, 6, '{1652587944,1652587948,1652587950,9143093800,1652587952,1652587953}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613063 59.6907075, 30.4612631 59.6907161, 30.4612041 59.6907321)'::geometry, 'way', 152442436, 10, '{1652605207,9143204222,1632503254}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4617627 59.6907689, 30.4618218 59.6907946, 30.4618794 59.6908253, 30.4619277 59.6908578)'::geometry, 'way', 152442438, 8, '{1652605205,1652605201,1652605200,1652587958}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4612018 59.6909805, 30.4617256 59.6909215, 30.4625734 59.6908311, 30.4628306 59.6908088)'::geometry, 'way', 311975108, 20, '{3188928044,3177639362,8331430683,7911801321}', '{"layer":"-1","name":"Старосильвийская дождевая канализация","source:direction":"survey","tunnel":"yes","waterway":"drain"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611708 59.6911018, 30.4611289 59.6910829, 30.4610793 59.6910531, 30.4610552 59.6910294, 30.4610432 59.6910153, 30.4610243 59.6909861)'::geometry, 'way', 313051687, 8, '{1632503180,9143069533,9143093805,9143069532,1632503185,9143093804}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061)'::geometry, 'way', 426269715, 5, '{4255746051,4255746033,9140576943,9140576942,9140576941,9140576940,4255746057,4255746007,9140576945,9140576946,9140576944,4255746054,4255745992,4255746051}', '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603979 59.691021, 30.4603224 59.6910067, 30.4602382 59.6909843, 30.4601137 59.6909482, 30.4600256 59.6909178, 30.4599203 59.6908773, 30.4597958 59.6908259, 30.4597422 59.6908088, 30.4596966 59.6907997, 30.4596501 59.6907961, 30.4596189 59.6907966, 30.4595885 59.6908005, 30.4595518 59.6908091, 30.4595101 59.6908241)'::geometry, 'way', 438780267, 20, '{1621246592,1621246561,1622496989,8850590008,1621246248,1621246252,8650331580,8849369897,9140576840,8650331579,9140576841,8650331578,9140576842,1622496957}', '{"highway":"footway","historic":"yes","loc_name":"Спуск у места домика Крик","name":"Криковская дорога","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4625498 59.6908065, 30.4614541 59.6909278)'::geometry, 'way', 750779153, 4, '{1632220250,1632497615}', '{"highway":"footway","historic":"yes","ref":"IV","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4631938 59.6918756)'::geometry, 'way', 750779155, 5, '{1632497615,1195120146}', '{"highway":"footway","historic":"yes","ref":"II","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4606491 59.6907025)'::geometry, 'way', 750779156, 5, '{1632497615,1621246419}', '{"highway":"footway","historic":"yes","ref":"IX","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4625914 59.6924527)'::geometry, 'way', 750779157, 4, '{1632497615,1652587960}', '{"highway":"footway","historic":"yes","ref":"I","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611165 59.6918779, 30.46118 59.6916919, 30.4614541 59.6909278)'::geometry, 'way', 750779158, 4, '{9159459639,1239612686,1632497615}', '{"highway":"footway","historic":"yes","ref":"XII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4596189 59.6907966, 30.4596712 59.6907865, 30.4597275 59.6907729, 30.459757 59.6907607, 30.4597619 59.6907527, 30.4597677 59.6907431, 30.4597919 59.6907269, 30.4598455 59.6907093, 30.459934 59.6906931, 30.4600118 59.6906782, 30.4600467 59.690666, 30.4600681 59.6906484, 30.4600725 59.6906275, 30.4600655 59.6906044, 30.4600295 59.6905552, 30.4600066 59.6905268, 30.4600031 59.690512, 30.4600111 59.6904995, 30.460044 59.6904799, 30.4600789 59.6904629, 30.4601241 59.6904473)'::geometry, 'way', 988944864, 2, '{9140576841,9140565053,9140565052,9140565051,9140565043,9140565050,9140565049,9140565048,9140565047,9140565046,9140565045,9140565044,1621246253,9140565042,1621246302,1621246323,9140576899,9140576892,9143093786,9143093785,1621246340}', '{"highway":"path","surface":"ground"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4607784 59.690696, 30.4606891 59.6906687)'::geometry, 'way', 988944880, 3, '{9140576936,9140576937}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601316 59.6905738, 30.4601383 59.6905745, 30.460144 59.6905725, 30.4601453 59.6905691, 30.4601415 59.6905663, 30.4601348 59.6905656, 30.4601291 59.6905676, 30.4601278 59.6905709, 30.4601316 59.6905738)'::geometry, 'way', 989184163, 1, '{9142788307,9142788306,9142788305,9142788304,9142788303,9142788302,9142788301,9142788300,9142788307}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601637 59.6905695, 30.4601704 59.6905701, 30.4601761 59.6905682, 30.4601774 59.6905648, 30.4601736 59.6905619, 30.4601668 59.6905613, 30.4601612 59.6905632, 30.4601599 59.6905666, 30.4601637 59.6905695)'::geometry, 'way', 989184166, 1, '{9142819031,9142819030,9142819029,9142819028,9142819027,9142819026,9142819025,9142819024,9142819031}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4615026 59.6911479, 30.4614481 59.6911519, 30.4613945 59.6911519)'::geometry, 'way', 989211851, 4, '{1652605211,9143069529,9143069530}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603719 59.6910414, 30.4597387 59.6911122)'::geometry, 'way', 989211857, 12, '{8650331583,4260007752}', '{"highway":"path","historic":"yes","name":"луч домика Крик","start_date":"1780.1785"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603446 59.6911727, 30.4603806 59.6910714, 30.4603967 59.691047, 30.4604235 59.6910376, 30.4604664 59.6910348, 30.4605415 59.6910308)'::geometry, 'way', 989211858, 1, '{9143069609,9143069608,9143069607,9143069606,9143069605,9143069604}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613583 59.6906799, 30.4614025 59.6907746, 30.461428 59.6907726, 30.4614548 59.6907726, 30.4614763 59.6907739)'::geometry, 'way', 989211859, 1, '{9143093728,9143093727,9143093726,9143093725,9143093724}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461314 59.6906832, 30.461361 59.6907794, 30.4613301 59.6907854, 30.4613033 59.6907929, 30.4612845 59.690799, 30.4609841 59.6905973)'::geometry, 'way', 989211860, 1, '{9143093729,9143093730,9143093731,9143093732,9143093734,9143093733}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611484 59.6909364, 30.4611471 59.6909174, 30.4611497 59.6909005, 30.4611578 59.6908836, 30.4611645 59.6908714, 30.4611739 59.6908606, 30.4606917 59.6907283, 30.460681 59.6907283, 30.460677 59.6907337, 30.460685 59.6907601, 30.4606891 59.6907817, 30.4606917 59.6908129, 30.4606944 59.6908426, 30.4606837 59.6908656, 30.4606596 59.6908927, 30.4606247 59.6909184, 30.460563 59.6909523, 30.460453 59.6910064)'::geometry, 'way', 989211861, 1, '{9143093739,9143093740,9143093741,9143093742,9143093743,9143093744,9143093755,9143093737,9143093736,9143093754,9143093753,9143093722,9143093721,9143093720,9143093719,9143093718,9143093717,9143069616}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605335 59.6903364, 30.4605335 59.6903946, 30.4605308 59.6904501, 30.4605348 59.6904813, 30.4605442 59.6905137, 30.4605576 59.6905394, 30.4605818 59.6905773, 30.4606193 59.6906247, 30.4606408 59.6906545, 30.4606596 59.6906856, 30.4606716 59.6906958, 30.4606958 59.6907039, 30.4611947 59.6908433, 30.4612155 59.6908301, 30.4612369 59.6908166, 30.461253 59.6908098, 30.4609492 59.6906112)'::geometry, 'way', 989211862, 1, '{9143093764,9143093763,9143093762,9143093748,9143093761,9143093760,9143093759,9143093758,9143093757,9143093756,9143093752,9143093751,9143093750,9143093747,9143093746,9143093745,9143093735}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604919 59.6903357, 30.4604919 59.690398, 30.4604892 59.6904494, 30.4604946 59.690486, 30.4605053 59.6905157, 30.4605161 59.6905387, 30.4605402 59.6905766, 30.4605778 59.690624, 30.4605992 59.6906538, 30.460626 59.6906931, 30.4606368 59.6907255, 30.4606448 59.6907574, 30.4606502 59.6907871, 30.4606542 59.6908196, 30.4606502 59.6908494, 30.4606327 59.6908751, 30.4606059 59.6908927, 30.4605496 59.6909266, 30.4604128 59.6909942)'::geometry, 'way', 989211863, 1, '{9143093776,9143093775,9143093774,9143093773,9143093749,9143093772,9143093771,9143093770,9143093769,9143093768,9143093767,9143093765,9143093766,9143069615,9143069610,9143069614,9143069613,9143069612,9143069611}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619893 59.6908956, 30.4620356 59.6909251)'::geometry, 'way', 989211867, 2, '{1652587955,1652587952}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610753 59.6908007, 30.4610979 59.6907799)'::geometry, 'way', 989211868, 4, '{9143093801,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611491 59.6907553, 30.4610979 59.6907799)'::geometry, 'way', 989211869, 4, '{1632503177,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461012 59.6909572, 30.4610056 59.6909157, 30.4610163 59.6908698, 30.4610445 59.6908345)'::geometry, 'way', 989211870, 4, '{1632503179,9143093803,1632503181,9143093802}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613456 59.6911475, 30.46131 59.6911438, 30.4612696 59.6911343, 30.4612126 59.691117)'::geometry, 'way', 989211871, 4, '{1652605209,9143069531,1632503237,9143093806}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4622826 59.6903796)'::geometry, 'way', 991343632, 2, '{1632497615,1518870652}', '{"highway":"footway","historic":"yes","ref":"V","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4620021 59.690877, 30.4617551 59.6909043, 30.4617579 59.690914, 30.4617593 59.6909255, 30.4617606 59.6909377)'::geometry, 'way', 991343633, 1, '{9159456550,9159456549,9159456545,9159456544,9159456543}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619941 59.6908547, 30.4617471 59.690882, 30.4617392 59.6908714, 30.4617298 59.6908606, 30.4617164 59.6908491)'::geometry, 'way', 991343634, 1, '{9159456552,9159456551,9159456548,9159456547,9159456546}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4602794 59.6911745, 30.4603083 59.6910871)'::geometry, 'way', 991343661, 1, '{9159459675,9159459674}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4614541 59.6909278)'::geometry, 'way', 1042527594, 11, '{9140727237,1632497615}', '{"highway":"footway","historic":"yes","name":"луч Амфитеатра","ref":"XI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4611342 59.6909402, 30.4611345 59.6909123, 30.4611444 59.6908848, 30.4611636 59.6908586, 30.4611916 59.6908345, 30.4612274 59.6908132, 30.46127 59.6907954, 30.4613181 59.6907815, 30.4613703 59.6907721, 30.4614248 59.6907674, 30.4614802 59.6907676, 30.4615347 59.6907726, 30.4615866 59.6907823, 30.4616343 59.6907964, 30.4616766 59.6908145, 30.4617119 59.690836, 30.4617393 59.6908603, 30.4617579 59.6908866, 30.4617672 59.6909141, 30.4617669 59.6909421, 30.461757 59.6909696, 30.4617378 59.6909958, 30.4617098 59.6910199, 30.461674 59.6910412, 30.4616314 59.691059, 30.4615833 59.6910728, 30.4615311 59.6910822, 30.4614766 59.6910869, 30.4614212 59.6910868, 30.4613667 59.6910818, 30.4613148 59.6910721, 30.461267 59.6910579, 30.4612248 59.6910399, 30.4611895 59.6910184, 30.4611621 59.6909941, 30.4611435 59.6909678, 30.4611342 59.6909402)))'::geometry, 'way', 150294525, 6, NULL, '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034)))'::geometry, 'way', 426269715, 5, NULL, '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601599 59.6905666, 30.4601612 59.6905632, 30.4601668 59.6905613, 30.4601736 59.6905619, 30.4601774 59.6905648, 30.4601761 59.6905682, 30.4601704 59.6905701, 30.4601637 59.6905695, 30.4601599 59.6905666)))'::geometry, 'way', 989184166, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text, gm1 geometry, gg1 geography) SERVER sqlite_svr;
--Testcase 41: ERR - raster
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, read PostGOS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49: ERR, no SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 50: ERR, no SRID
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 52:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 53: ERR damaged, but there is SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = (decode('0101000020e6100000bf72ce99fe76', 'hex')::geometry);
-- Insert PostGIS/GEOS BLOB, read SpatiaLite BLOB
--Testcase 54: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 55:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 56:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 57: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 58:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 59:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 60: ERR damaged geometry, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (3, decode('0101000020e6100000bf72ce99fe76', 'hex'), NULL, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 61: ERR damaged geography, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (4, NULL, decode('0101000020e6100000bf72ce99fe76', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 62:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 63:
INSERT INTO "♂" SELECT * FROM "♂"."テスト";
--Testcase 64:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 65:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 66:
SELECT * FROM "♂";
--Testcase 67:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 69:
SELECT * FROM "♂";
--Testcase 70:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL ,
osm_id bigint OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t text
) SERVER sqlite_svr OPTIONS (table '♁');
--Testcase 71: ERR - No SRID
INSERT INTO "♁ FDW" SELECT * FROM "♁";
--Testcase 72: OK
SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 73:
UPDATE "♁" SET geom = ST_SetSRID(geom, 4326);
--Testcase 74:
INSERT INTO "♁ FDW" SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 75:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE bytea;
--Testcase 76:
SELECT * FROM "♁ FDW";
--Testcase 77:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE geometry;
--Testcase 78:
SELECT * FROM "♁ FDW";
--Testcase 79:
DROP FOREIGN TABLE "♂";
--Testcase 80:
DROP FOREIGN TABLE "♁ FDW";
--Testcase 81:
DROP TABLE "♁";
--Testcase 82:
DROP TABLE "♂"."テスト";
--Testcase 83:
DROP SCHEMA "♂";
-- Test operators implemented in PostGIS 3.4.2, other are not tested
-- SELECT testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 100 -> TC 150 -> TC200 -> TC250
-- WHERE testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 300 -> TC 350 -> TC400 -> TC450
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ gm1 g FROM "types_PostGIS";
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && gm1 g FROM "types_PostGIS";
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << gm1 g FROM "types_PostGIS";
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> gm1 g FROM "types_PostGIS";
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< gm1 g FROM "types_PostGIS";
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> gm1 g FROM "types_PostGIS";
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| gm1 g FROM "types_PostGIS";
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> gm1 g FROM "types_PostGIS";
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| gm1 g FROM "types_PostGIS";
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> gm1 g FROM "types_PostGIS";
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= gm1 g FROM "types_PostGIS";
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm = gm1 g FROM "types_PostGIS";
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| gm1 g FROM "types_PostGIS";
--Testcase 115
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> gm1 g FROM "types_PostGIS";
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> gm1 g FROM "types_PostGIS";
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ gm1 g FROM "types_PostGIS";
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ gm1 g FROM "types_PostGIS";
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 157:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 159:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> gg1 g FROM "types_PostGIS";
--Testcase 201:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && gg1 g FROM "types_PostGIS";
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> gg1 g FROM "types_PostGIS";
--Testcase 203:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg = gg1 g FROM "types_PostGIS";
--Testcase 204
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != gg1 g FROM "types_PostGIS";
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 300:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ gm1 IS NOT NULL;
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && gm1 IS NOT NULL;
--Testcase 302:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << gm1 IS NOT NULL;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> gm1 IS NOT NULL;
--Testcase 304:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< gm1 IS NOT NULL;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> gm1 IS NOT NULL;
--Testcase 306:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| gm1 IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> gm1 IS NOT NULL;
--Testcase 308:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| gm1 IS NOT NULL;
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> gm1 IS NOT NULL;
--Testcase 310:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= gm1 IS NOT NULL;
--Testcase 311:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm = gm1 IS NOT NULL;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& gm1 IS NOT NULL;
--Testcase 313:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| gm1 IS NOT NULL;
--Testcase 314:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> gm1 IS NOT NULL;
--Testcase 315:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> gm1 IS NOT NULL;
--Testcase 316:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ gm1 IS NOT NULL;
--Testcase 317:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ gm1 IS NOT NULL;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 351:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 352:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 353:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 354:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 355:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 356:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 357:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 358:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 359:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 360:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 361:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 362:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 363:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 364:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 365:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 366:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 367:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 368:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 369:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 370:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 400:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> gg1 IS NOT NULL;
--Testcase 401:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && gg1 IS NOT NULL;
--Testcase 402:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 404:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg = gg1 IS NOT NULL;
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != gg1 IS NOT NULL;
--Testcase 450:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 451:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 452:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 453:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 454:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 500:
DROP FOREIGN TABLE "types_PostGIS";
--Testcase 501:
DROP EXTENSION sqlite_fdw CASCADE;
--Testcase 502:
DROP EXTENSION postgis CASCADE;
================================================
FILE: sql/14.12/with_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 47:
CREATE EXTENSION postgis;
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/without_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/without_gis_support/nogis.sql
================================================
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 10:
CREATE DOMAIN geometry AS bytea;
--Testcase 11:
CREATE DOMAIN geography AS bytea;
--Testcase 12:
CREATE DOMAIN addbandarg AS bytea;
--Testcase 13:
CREATE DOMAIN box2d AS bytea;
--Testcase 14:
CREATE DOMAIN box3d AS bytea;
--Testcase 15:
CREATE DOMAIN geometry_dump AS bytea;
--Testcase 16:
CREATE DOMAIN geomval AS bytea;
--Testcase 17:
CREATE DOMAIN getfaceedges_returntype AS bytea;
--Testcase 18:
CREATE DOMAIN rastbandarg AS bytea;
--Testcase 19:
CREATE DOMAIN raster AS bytea;
--Testcase 20:
CREATE DOMAIN reclassarg AS bytea;
--Testcase 21:
CREATE DOMAIN summarystats AS bytea;
--Testcase 22:
CREATE DOMAIN topoelement AS bytea;
--Testcase 23:
CREATE DOMAIN topoelementarray AS bytea;
--Testcase 24:
CREATE DOMAIN topogeometry AS bytea;
--Testcase 25:
CREATE DOMAIN unionarg AS bytea;
--Testcase 26:
CREATE DOMAIN validatetopology_returntype AS bytea;
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text) SERVER sqlite_svr;
--Testcase 41: ERR unable to convert to unsupported PostGIS specific data type
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, but CANNOT read PostGIS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: read the same BLOBs
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
--Testcase 50:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
-- Insert a BLOB, read SpatiaLite BLOB without any transformations
--Testcase 51: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 52:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 53:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 54: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 55:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 56:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 57:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 58:
SELECT * FROM "♂";
--Testcase 59:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 60:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 61:
INSERT INTO "♂" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
--Testcase 62:
SELECT * FROM "♂";
--Testcase 63:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL,
osm_id int OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t json
) SERVER sqlite_svr
OPTIONS (table '♁');
--Testcase 55:
INSERT INTO "♁ FDW" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 67:
SELECT * FROM "♁ FDW";
-- PostGIS specific data types, but SpatiaLite or sqlite_fdw unsupported
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box2d;
--Testcase 69: -- ERR
SELECT * FROM "♂";
--Testcase 70:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box3d;
--Testcase 71: -- ERR
SELECT * FROM "♂";
--Testcase 72:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry_dump;
--Testcase 73: -- ERR
SELECT * FROM "♂";
--Testcase 74:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geomval;
--Testcase 75: -- ERR
SELECT * FROM "♂";
--Testcase 76:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE getfaceedges_returntype;
--Testcase 77: -- ERR
SELECT * FROM "♂";
--Testcase 78:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE rastbandarg;
--Testcase 79: -- ERR
SELECT * FROM "♂";
--Testcase 80:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE raster;
--Testcase 81: -- ERR
SELECT * FROM "♂";
--Testcase 82:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE reclassarg;
--Testcase 83: -- ERR
SELECT * FROM "♂";
--Testcase 84:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE summarystats;
--Testcase 85: -- ERR
SELECT * FROM "♂";
--Testcase 86:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelement;
--Testcase 87: -- ERR
SELECT * FROM "♂";
--Testcase 88:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelementarray;
--Testcase 89: -- ERR
SELECT * FROM "♂";
--Testcase 90:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topogeometry;
--Testcase 91: -- ERR
SELECT * FROM "♂";
--Testcase 92:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE unionarg;
--Testcase 93: -- ERR
SELECT * FROM "♂";
--Testcase 94:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE validatetopology_returntype;
--Testcase 95: -- ERR
SELECT * FROM "♂";
-- PostGIS specific data types, not bytea mode, hence error
--Testcase 96:
ALTER DOMAIN geometry RENAME TO geom0;
--Testcase 97:
ALTER DOMAIN geography RENAME TO geog0;
--Testcase 98:
CREATE DOMAIN geometry AS text;
--Testcase 99:
CREATE DOMAIN geography AS text;
--Testcase 100:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 101: -- ERR
SELECT * FROM "♂";
--Testcase 102:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geography;
--Testcase 102: -- ERR
SELECT * FROM "♂";
--Testcase 103:
DROP DOMAIN geometry CASCADE;
--Testcase 104:
DROP DOMAIN geography CASCADE;
--Testcase 105:
DROP DOMAIN addbandarg;
--Testcase 106:
DROP DOMAIN box2d;
--Testcase 107:
DROP DOMAIN box3d;
--Testcase 108:
DROP DOMAIN geometry_dump;
--Testcase 109:
DROP DOMAIN geomval;
--Testcase 110:
DROP DOMAIN getfaceedges_returntype;
--Testcase 111:
DROP DOMAIN rastbandarg;
--Testcase 112:
DROP DOMAIN raster CASCADE;
--Testcase 113:
DROP DOMAIN reclassarg;
--Testcase 114:
DROP DOMAIN summarystats;
--Testcase 115:
DROP DOMAIN topoelement;
--Testcase 116:
DROP DOMAIN topoelementarray;
--Testcase 117:
DROP DOMAIN topogeometry;
--Testcase 118:
DROP DOMAIN unionarg;
--Testcase 119:
DROP DOMAIN validatetopology_returntype;
--Testcase 120:
DROP DOMAIN geom0 CASCADE;
--Testcase 121:
DROP DOMAIN geog0 CASCADE;
--Testcase 122:
DROP SERVER sqlite_svr CASCADE;
--Testcase 123:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/14.12/without_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/aggregate.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 18:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
-- test for aggregate pushdown
--Testcase 8:
DROP SERVER IF EXISTS sqlite_svr CASCADE;
--Testcase 9:
DROP EXTENSION IF EXISTS sqlite_fdw CASCADE;
--Testcase 10:
CREATE EXTENSION sqlite_fdw;
--Testcase 11:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 12:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 1:
explain (costs off, verbose) select count(distinct a) from multiprimary;
--Testcase 2:
explain (costs off, verbose) select sum(b),max(b), min(b), avg(b) from multiprimary;
--Testcase 3:
explain (costs off, verbose) select sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 4:
explain (costs off, verbose) select sum(a) from multiprimary group by b having sum(a) > 0;
--Testcase 5:
explain (costs off, verbose) select sum(a) from multiprimary group by b having avg(a^2) > 0 and sum(a) > 0;
-- stddev and variance are not pushed down
--Testcase 6:
explain (costs off, verbose) select stddev(a) from multiprimary;
--Testcase 7:
explain (costs off, verbose) select sum(a) from multiprimary group by b having variance(a) > 0;
--Testcase 13:
DROP FOREIGN TABLE multiprimary;
--Testcase 16:
CREATE FOREIGN TABLE limittest(id serial OPTIONS (key 'true'), x int, y text) SERVER sqlite_svr;
--Testcase 17:
INSERT INTO limittest(x, y) VALUES (1, 'x'), (2, 'x'), (3, 'x'), (4, 'x');
--Testcase 18:
INSERT INTO limittest(x, y) VALUES (1, 'y'), (2, 'y'), (3, 'y'), (4, 'y');
--Testcase 19:
INSERT INTO limittest(x, y) VALUES (1, 'z'), (2, 'z'), (3, 'z'), (4, 'z');
--Testcase 20:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 21:
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 22:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 23:
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 24:
EXPLAIN VERBOSE
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 25:
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 26:
EXPLAIN VERBOSE
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 27:
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 28:
DROP FOREIGN TABLE limittest;
--Testcase 14:
DROP SERVER sqlite_svr;
--Testcase 15:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/aggregates.sql
================================================
--
-- AGGREGATES
--
--Testcase 266:
CREATE EXTENSION sqlite_fdw;
--Testcase 267:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 268:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 269:
CREATE FOREIGN TABLE aggtest (
a int2,
b float4
) SERVER sqlite_svr;
--Testcase 270:
CREATE FOREIGN TABLE student (
name text,
age int4,
location point,
gpa float8
) SERVER sqlite_svr;
--Testcase 271:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 272:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 697:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 698:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 699:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 700:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 701:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 273:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 702:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 703:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 704:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 705:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 706:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 274:
CREATE FOREIGN TABLE multi_arg_agg (a int OPTIONS (key 'true'), b int, c text) SERVER sqlite_svr;
--Testcase 275:
CREATE FOREIGN TABLE VARCHAR_TBL(f1 varchar(4) OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 276:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 707:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 708:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 709:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 710:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 711:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 588:
SET extra_float_digits = 0;
--Testcase 1:
SELECT avg(four) AS avg_1 FROM onek;
--Testcase 2:
SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
--Testcase 697:
CREATE FOREIGN TABLE agg_tb(v int, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 698:
INSERT INTO agg_tb(v) VALUES(1), (2), (3);
--Testcase 699: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 700:
DELETE FROM agg_tb;
--Testcase 701:
INSERT INTO agg_tb(v) VALUES (NULL);
--Testcase 702: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 703:
DELETE FROM agg_tb;
--Testcase 704:
INSERT INTO agg_tb(v) VALUES (NULL), (1), (2);
--Testcase 705: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 706:
CREATE FOREIGN TABLE agg_tb2(v text) SERVER sqlite_svr;
--Testcase 707:
INSERT INTO agg_tb2(v) VALUES (array['hello', 'world']);
--Testcase 708: -- Pg 16+
SELECT any_value(v) FROM agg_tb2;
-- In 7.1, avg(float4) is computed using float8 arithmetic.
--Testcase 3:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 678:
SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest;
--Testcase 4:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 679:
SELECT avg(gpa)::numeric(10,3) AS avg_3_4 FROM ONLY student;
--Testcase 5:
SELECT sum(four) AS sum_1500 FROM onek;
--Testcase 6:
SELECT sum(a) AS sum_198 FROM aggtest;
--Testcase 7:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 680:
SELECT sum(b)::numeric(10,3) AS avg_431_773 FROM aggtest;
--Testcase 8:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 681:
SELECT sum(gpa)::numeric(10,3) AS avg_6_8 FROM ONLY student;
--Testcase 9:
SELECT max(four) AS max_3 FROM onek;
--Testcase 10:
SELECT max(a) AS max_100 FROM aggtest;
--Testcase 11:
SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
--Testcase 12:
SELECT max(student.gpa) AS max_3_7 FROM student;
--Testcase 13:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 682:
SELECT stddev_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 14:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 683:
SELECT stddev_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 15:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 684:
SELECT var_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 16:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 685:
SELECT var_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 17:
SELECT stddev_pop(b::numeric) FROM aggtest;
--Testcase 18:
SELECT stddev_samp(b::numeric) FROM aggtest;
--Testcase 19:
SELECT var_pop(b::numeric) FROM aggtest;
--Testcase 20:
SELECT var_samp(b::numeric) FROM aggtest;
-- population variance is defined for a single tuple, sample variance
-- is not
--Testcase 277:
CREATE FOREIGN TABLE agg_t3(a float8, b float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 278:
DELETE FROM agg_t3;
--Testcase 279:
INSERT INTO agg_t3 values (1.0::float8, 2.0::float8);
--Testcase 280:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 281:
DELETE FROM agg_t3;
--Testcase 282:
INSERT INTO agg_t3 values (3.0::float8, 4.0::float8);
--Testcase 283:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 284:
DELETE FROM agg_t3;
--Testcase 285:
INSERT INTO agg_t3 values ('inf'::float8, 'inf'::float8);
--Testcase 286:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 287:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 288:
DELETE FROM agg_t3;
--Testcase 289:
INSERT INTO agg_t3 values ('nan'::float8, 'nan'::float8);
--Testcase 290:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 291:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 292:
CREATE FOREIGN TABLE agg_t4(a float4, b float4, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 293:
DELETE FROM agg_t4;
--Testcase 294:
INSERT INTO agg_t4 values (1.0::float4, 2.0::float4);
--Testcase 295:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 296:
DELETE FROM agg_t4;
--Testcase 297:
INSERT INTO agg_t4 values (3.0::float4, 4.0::float4);
--Testcase 298:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 299:
DELETE FROM agg_t4;
--Testcase 300:
INSERT INTO agg_t4 values ('inf'::float4, 'inf'::float4);
--Testcase 301:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 302:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 303:
DELETE FROM agg_t4;
--Testcase 304:
INSERT INTO agg_t4 values ('nan'::float4, 'nan'::float4);
--Testcase 305:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 306:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 307:
CREATE FOREIGN TABLE agg_t5(a numeric, b numeric, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 308:
DELETE FROM agg_t5;
--Testcase 309:
INSERT INTO agg_t5 values (1.0::numeric, 2.0::numeric);
--Testcase 310:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 311:
DELETE FROM agg_t5;
--Testcase 312:
INSERT INTO agg_t5 values (3.0::numeric, 4.0::numeric);
--Testcase 313:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 597:
DELETE FROM agg_t5;
--Testcase 598:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 599:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 600:
DELETE FROM agg_t5;
--Testcase 601:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 602:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 314:
DELETE FROM agg_t5;
--Testcase 315:
INSERT INTO agg_t5 values ('nan'::numeric, 'nan'::numeric);
--Testcase 316:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 317:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
-- verify correct results for null and NaN inputs
--Testcase 318:
CREATE FOREIGN TABLE agg_t8(a text OPTIONS (key 'true'), b text) SERVER sqlite_svr;
--Testcase 319:
DELETE FROM agg_t8;
--Testcase 320:
INSERT INTO agg_t8 select * from generate_series(1,3);
--Testcase 321:
select sum(null::int4) from agg_t8;
--Testcase 322:
select sum(null::int8) from agg_t8;
--Testcase 323:
select sum(null::numeric) from agg_t8;
--Testcase 324:
select sum(null::float8) from agg_t8;
--Testcase 325:
select avg(null::int4) from agg_t8;
--Testcase 326:
select avg(null::int8) from agg_t8;
--Testcase 327:
select avg(null::numeric) from agg_t8;
--Testcase 328:
select avg(null::float8) from agg_t8;
--Testcase 329:
select sum('NaN'::numeric) from agg_t8;
--Testcase 330:
select avg('NaN'::numeric) from agg_t8;
-- verify correct results for infinite inputs
--Testcase 331:
DELETE FROM agg_t3;
--Testcase 332:
INSERT INTO agg_t3 VALUES ('1'::float8), ('infinity'::float8);
--Testcase 333:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 334:
DELETE FROM agg_t3;
--Testcase 335:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('1'::float8);
--Testcase 336:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 337:
DELETE FROM agg_t3;
--Testcase 338:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('infinity'::float8);
--Testcase 339:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 340:
DELETE FROM agg_t3;
--Testcase 341:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('infinity'::float8);
--Testcase 342:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 603:
DELETE FROM agg_t3;
--Testcase 604:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('-infinity'::float8);
--Testcase 605:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 606:
DELETE FROM agg_t3;
--Testcase 607:
INSERT INTO agg_t3 VALUES ('1'::numeric), ('infinity'::numeric);
--Testcase 608:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 609:
DELETE FROM agg_t3;
--Testcase 610:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('1'::numeric);
--Testcase 611:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 612:
DELETE FROM agg_t3;
--Testcase 613:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('infinity'::numeric);
--Testcase 614:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 615:
DELETE FROM agg_t3;
--Testcase 616:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('infinity'::numeric);
--Testcase 617:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 618:
DELETE FROM agg_t3;
--Testcase 619:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('-infinity'::numeric);
--Testcase 620:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
-- test accuracy with a large input offset
--Testcase 343:
CREATE FOREIGN TABLE agg_t6(a float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 344:
DELETE FROM agg_t6;
--Testcase 345:
INSERT INTO agg_t6 VALUES (100000003), (100000004), (100000006), (100000007);
--Testcase 346:
SELECT avg(a), var_pop(a) FROM agg_t6;
--Testcase 347:
DELETE FROM agg_t6;
--Testcase 348:
INSERT INTO agg_t6 VALUES (7000000000005), (7000000000007);
--Testcase 349:
SELECT avg(a), var_pop(a) FROM agg_t6;
-- SQL2003 binary aggregates
--Testcase 21:
SELECT regr_count(b, a) FROM aggtest;
--Testcase 22:
SELECT regr_sxx(b, a) FROM aggtest;
--Testcase 23:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 686:
SELECT regr_syy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 24:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 687:
SELECT regr_sxy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 25:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 688:
SELECT regr_avgx(b, a), regr_avgy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 26:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 689:
SELECT regr_r2(b, a)::numeric(20,10) FROM aggtest;
--Testcase 27:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 690:
SELECT regr_slope(b, a)::numeric(20,10), regr_intercept(b, a)::numeric(20,10) FROM aggtest;
--Testcase 28:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 691:
SELECT covar_pop(b, a)::numeric(20,10), covar_samp(b, a)::numeric(20,10) FROM aggtest;
--Testcase 29:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 692:
SELECT corr(b, a)::numeric(20,10) FROM aggtest;
-- check single-tuple behavior
--Testcase 350:
CREATE FOREIGN TABLE agg_t7(a float8, b float8, c float8, d float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 351:
DELETE FROM agg_t7;
--Testcase 352:
INSERT INTO agg_t7 VALUES (1, 2, 3, 4);
--Testcase 353:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 354:
DELETE FROM agg_t7;
--Testcase 355:
INSERT INTO agg_t7 VALUES (1, 'inf', 3, 'inf');
--Testcase 356:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 357:
DELETE FROM agg_t7;
--Testcase 358:
INSERT INTO agg_t7 VALUES (1, 'nan', 3, 'nan');
--Testcase 359:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
-- test accum and combine functions directly
--Testcase 360:
CREATE FOREIGN TABLE regr_test (x float8, y float8, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 361:
DELETE FROM regr_test;
--Testcase 362:
INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
--Testcase 363:
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);
--Testcase 364:
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 590:
EXPLAIN (VERBOSE, COSTS OFF)
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);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 365:
CREATE FOREIGN TABLE agg_t15 (a text, b int, c int, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 366:
delete from agg_t15;
--Testcase 367:
insert into agg_t15 values ('{4,140,2900}', 100);
--Testcase 368:
SELECT float8_accum(a::float8[], b) from agg_t15;
--Testcase 369:
delete from agg_t15;
--Testcase 370:
insert into agg_t15 values ('{4,140,2900,1290,83075,15050}', 200, 100);
--Testcase 371:
SELECT float8_regr_accum(a::float8[], b, c) from agg_t15;
--Testcase 372:
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);
--Testcase 373:
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);
--Testcase 374:
CREATE FOREIGN TABLE agg_t16 (a text, b text, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 375:
delete from agg_t16;
--Testcase 376:
insert into agg_t16 values ('{3,60,200}', '{0,0,0}');
--Testcase 377:
insert into agg_t16 values ('{0,0,0}', '{2,180,200}');
--Testcase 378:
insert into agg_t16 values ('{3,60,200}', '{2,180,200}');
--Testcase 379:
SELECT float8_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 380:
delete from agg_t16;
--Testcase 381:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{0,0,0,0,0,0}');
--Testcase 382:
insert into agg_t16 values ('{0,0,0,0,0,0}', '{2,180,200,740,57800,-3400}');
--Testcase 383:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{2,180,200,740,57800,-3400}');
--Testcase 384:
SELECT float8_regr_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 385:
DROP FOREIGN TABLE regr_test;
-- test count, distinct
--Testcase 30:
SELECT count(four) AS cnt_1000 FROM onek;
--Testcase 31:
SELECT count(DISTINCT four) AS cnt_4 FROM onek;
--Testcase 32:
select ten, count(*), sum(four) from onek
group by ten order by ten;
--Testcase 33:
select ten, count(four), sum(DISTINCT four) from onek
group by ten order by ten;
-- user-defined aggregates
--Testcase 386:
CREATE AGGREGATE newavg (
sfunc = int4_avg_accum, basetype = int4, stype = _int8,
finalfunc = int8_avg,
initcond1 = '{0,0}'
);
--Testcase 387:
CREATE AGGREGATE newsum (
sfunc1 = int4pl, basetype = int4, stype1 = int4,
initcond1 = '0'
);
--Testcase 388:
CREATE AGGREGATE newcnt (*) (
sfunc = int8inc, stype = int8,
initcond = '0', parallel = safe
);
--Testcase 389:
CREATE AGGREGATE newcnt ("any") (
sfunc = int8inc_any, stype = int8,
initcond = '0'
);
--Testcase 390:
CREATE AGGREGATE oldcnt (
sfunc = int8inc, basetype = 'ANY', stype = int8,
initcond = '0'
);
--Testcase 391:
create function sum3(int8,int8,int8) returns int8 as
'select $1 + $2 + $3' language sql strict immutable;
--Testcase 392:
create aggregate sum2(int8,int8) (
sfunc = sum3, stype = int8,
initcond = '0'
);
--Testcase 34:
SELECT newavg(four) AS avg_1 FROM onek;
--Testcase 35:
SELECT newsum(four) AS sum_1500 FROM onek;
--Testcase 36:
SELECT newcnt(four) AS cnt_1000 FROM onek;
--Testcase 37:
SELECT newcnt(*) AS cnt_1000 FROM onek;
--Testcase 38:
SELECT oldcnt(*) AS cnt_1000 FROM onek;
--Testcase 39:
SELECT sum2(q1,q2) FROM int8_tbl;
-- test for outer-level aggregates
-- this should work
--Testcase 40:
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
--Testcase 41:
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.
--Testcase 42:
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.
--Testcase 393:
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;
--Testcase 394:
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;
--Testcase 395:
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;
--Testcase 396:
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
--
--Testcase 397:
CREATE FOREIGN TABLE bitwise_test(
i2 INT2,
i4 INT4,
i8 INT8,
i INTEGER,
x INT2
) SERVER sqlite_svr;
-- empty case
--Testcase 43:
SELECT
BIT_AND(i2) AS "?",
BIT_OR(i4) AS "?",
BIT_XOR(i8) AS "?"
FROM bitwise_test;
--Testcase 44:
INSERT INTO bitwise_test VALUES
(1, 1, 1, 1, 1),
(3, 3, 3, null, 2),
(7, 7, 7, 3, 4);
--Testcase 45:
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_OR(i2) AS "7",
BIT_OR(i4) AS "7",
BIT_OR(i8) AS "7",
BIT_OR(i) AS "?",
BIT_OR(x) AS "7",
BIT_XOR(i2) AS "5",
BIT_XOR(i4) AS "5",
BIT_XOR(i8) AS "5",
BIT_XOR(i) AS "?",
BIT_XOR(x) AS "7"
FROM bitwise_test;
--
-- test boolean aggregates
--
-- first test all possible transition and final states
--Testcase 398:
CREATE FOREIGN TABLE bool_test_tmp(
b1 BOOL OPTIONS (key 'true'),
b2 BOOL OPTIONS (key 'true')
) SERVER sqlite_svr;
-- boolean and transitions
-- null because strict
BEGIN;
--Testcase 399:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 400:
SELECT booland_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- and actual computations
BEGIN;
--Testcase 401:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE);
--Testcase 402:
SELECT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 403:
INSERT INTO bool_test_tmp VALUES
(TRUE, FALSE),
(FALSE, TRUE),
(FALSE, FALSE);
--Testcase 404:
SELECT NOT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
-- boolean or transitions
-- null because strict
BEGIN;
--Testcase 405:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 406:
SELECT boolor_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- actual computations
BEGIN;
--Testcase 407:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE),
(TRUE, FALSE),
(FALSE, TRUE);
--Testcase 408:
SELECT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 409:
INSERT INTO bool_test_tmp VALUES
(FALSE, FALSE);
--Testcase 410:
SELECT NOT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
--Testcase 411:
CREATE FOREIGN TABLE bool_test(
b1 BOOL,
b2 BOOL,
b3 BOOL,
b4 BOOL
) SERVER sqlite_svr;
-- empty case
--Testcase 46:
SELECT
BOOL_AND(b1) AS "n",
BOOL_OR(b3) AS "n"
FROM bool_test;
--Testcase 47:
INSERT INTO bool_test VALUES
(TRUE, null, FALSE, null),
(FALSE, TRUE, null, null),
(null, TRUE, FALSE, null);
--Testcase 48:
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;
--Testcase 49:
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;
--Testcase 50:
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
--Testcase 51:
explain (costs off)
select min(unique1) from tenk1;
--Testcase 52:
select min(unique1) from tenk1;
--Testcase 53:
explain (costs off)
select max(unique1) from tenk1;
--Testcase 54:
select max(unique1) from tenk1;
--Testcase 55:
explain (costs off)
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 56:
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 57:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42;
--Testcase 58:
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;
--Testcase 628:
set local max_parallel_workers_per_gather = 0;
--Testcase 59:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42000;
--Testcase 60:
select max(unique1) from tenk1 where unique1 > 42000;
rollback;
-- multi-column index (uses tenk1_thous_tenthous)
--Testcase 61:
explain (costs off)
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 62:
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 63:
explain (costs off)
select min(tenthous) from tenk1 where thousand = 33;
--Testcase 64:
select min(tenthous) from tenk1 where thousand = 33;
-- check parameter propagation into an indexscan subquery
--Testcase 65:
explain (costs off)
select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
from int4_tbl;
--Testcase 66:
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
--Testcase 67:
explain (costs off)
select distinct max(unique2) from tenk1;
--Testcase 68:
select distinct max(unique2) from tenk1;
--Testcase 69:
explain (costs off)
select max(unique2) from tenk1 order by 1;
--Testcase 70:
select max(unique2) from tenk1 order by 1;
--Testcase 71:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2);
--Testcase 72:
select max(unique2) from tenk1 order by max(unique2);
--Testcase 73:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 74:
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 75:
explain (costs off)
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
--Testcase 76:
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
-- interesting corner case: constant gets optimized into a seqscan
--Testcase 77:
explain (costs off)
select max(100) from tenk1;
--Testcase 78:
select max(100) from tenk1;
-- try it on an inheritance tree
--Testcase 412:
create foreign table minmaxtest(f1 int) server sqlite_svr;
--Testcase 413:
create table minmaxtest1() inherits (minmaxtest);
--Testcase 414:
create table minmaxtest2() inherits (minmaxtest);
--Testcase 415:
create table minmaxtest3() inherits (minmaxtest);
--Testcase 416:
create index minmaxtest1i on minmaxtest1(f1);
--Testcase 417:
create index minmaxtest2i on minmaxtest2(f1 desc);
--Testcase 418:
create index minmaxtest3i on minmaxtest3(f1) where f1 is not null;
--Testcase 79:
insert into minmaxtest values(11), (12);
--Testcase 80:
insert into minmaxtest1 values(13), (14);
--Testcase 81:
insert into minmaxtest2 values(15), (16);
--Testcase 82:
insert into minmaxtest3 values(17), (18);
--Testcase 83:
explain (costs off)
select min(f1), max(f1) from minmaxtest;
--Testcase 84:
select min(f1), max(f1) from minmaxtest;
-- DISTINCT doesn't do anything useful here, but it shouldn't fail
--Testcase 85:
explain (costs off)
select distinct min(f1), max(f1) from minmaxtest;
--Testcase 86:
select distinct min(f1), max(f1) from minmaxtest;
-- check for correct detection of nested-aggregate errors
--Testcase 87:
select max(min(unique1)) from tenk1;
--Testcase 88:
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
--
--Testcase 419:
create foreign table agg_t1 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int, d int) server sqlite_svr;
--Testcase 420:
create foreign table agg_t2 (x int OPTIONS (key 'true'), y int OPTIONS (key 'true'), z int) server sqlite_svr;
--Testcase 421:
create foreign table agg_t9 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int) server sqlite_svr;
-- Non-primary-key columns can be removed from GROUP BY
--Testcase 89:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- No removal can happen if the complete PK is not present in GROUP BY
--Testcase 90:
explain (costs off) select a,c from agg_t1 group by a,c,d;
-- Test removal across multiple relations
--Testcase 91:
explain (costs off) select *
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.y,agg_t2.z;
-- Test case where agg_t1 can be optimized but not agg_t2
--Testcase 92:
explain (costs off) select agg_t1.*,agg_t2.x,agg_t2.z
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.z;
-- Cannot optimize when PK is deferrable
--Testcase 422:
explain (costs off) select * from agg_t9 group by a,b,c;
--Testcase 423:
create temp table t1c () inherits (agg_t1);
-- Ensure we don't remove any columns when t1 has a child table
--Testcase 424:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- Okay to remove columns if we're only querying the parent.
--Testcase 425:
explain (costs off) select * from only agg_t1 group by a,b,c,d;
-- Skip this test, sqlite_fdw does not support partition table
--create foreign table p_t1 (
-- a int options (key 'true'),
-- b int options (key 'true'),
-- c int,
-- d int,
--) partition by list(a) server sqlite_svr;
--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
--
--Testcase 426:
create foreign table t1(f1 int, f2 int) server sqlite_svr;
--Testcase 427:
create foreign table t2(f1 bigint, f2 oid) server sqlite_svr;
--Testcase 428:
select f1 from t1 left join t2 using (f1) group by f1;
--Testcase 429:
select f1 from t1 left join t2 using (f1) group by t1.f1;
--Testcase 430:
select t1.f1 from t1 left join t2 using (f1) group by t1.f1;
-- only this one should fail:
--Testcase 431:
select t1.f1 from t1 left join t2 using (f1) group by f1;
-- check case where we have to inject nullingrels into coerced join alias
select f1, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f1)) on (x0 = 0)
group by f1;
-- same, for a RelabelType coercion
select f2, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f2)) on (x0 = 0)
group by f2;
--Testcase 432:
drop foreign table t1, t2;
--
-- Test planner's selection of pathkeys for ORDER BY aggregates
--
-- Ensure we order by four. This suits the most aggregate functions.
explain (costs off)
select sum(two order by two),max(four order by four), min(four order by four)
from tenk1;
-- Ensure we order by two. It's a tie between ordering by two and four but
-- we tiebreak on the aggregate's position.
explain (costs off)
select
sum(two order by two), max(four order by four),
min(four order by four), max(two order by two)
from tenk1;
-- Similar to above, but tiebreak on ordering by four
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two)
from tenk1;
-- Ensure this one orders by ten since there are 3 aggregates that require ten
-- vs two that suit two and four.
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two),
sum(ten order by ten), min(ten order by ten), max(ten order by ten)
from tenk1;
-- Try a case involving a GROUP BY clause where the GROUP BY column is also
-- part of an aggregate's ORDER BY clause. We want a sort order that works
-- for the GROUP BY along with the first and the last aggregate.
explain (costs off)
select
sum(unique1 order by ten, two), sum(unique1 order by four),
sum(unique1 order by two, four)
from tenk1
group by ten;
-- Ensure that we never choose to provide presorted input to an Aggref with
-- a volatile function in the ORDER BY / DISTINCT clause. We want to ensure
-- these sorts are performed individually rather than at the query level.
explain (costs off)
select
sum(unique1 order by two), sum(unique1 order by four),
sum(unique1 order by four, two), sum(unique1 order by two, random()),
sum(unique1 order by two, random(), random() + 1)
from tenk1
group by ten;
-- Ensure consecutive NULLs are properly treated as distinct from each other
select array_agg(distinct val)
from (select null as val from generate_series(1, 2)) g;
-- Ensure no ordering is requested when enable_presorted_aggregate is off
set enable_presorted_aggregate to off;
explain (costs off)
select sum(two order by two) from tenk1;
reset enable_presorted_aggregate;
--
-- Test combinations of DISTINCT and/or ORDER BY
--
begin;
--Testcase 93:
delete from INT8_TBL;
--Testcase 94:
insert into INT8_TBL values (1,4),(2,3),(3,1),(4,2);
--Testcase 95:
select array_agg(q1 order by q2)
from INT8_TBL;
--Testcase 96:
select array_agg(q1 order by q1)
from INT8_TBL;
--Testcase 97:
select array_agg(q1 order by q1 desc)
from INT8_TBL;
--Testcase 98:
select array_agg(q2 order by q1 desc)
from INT8_TBL;
--Testcase 99:
delete from INT4_TBL;
--Testcase 100:
insert into INT4_TBL values (1),(2),(1),(3),(null),(2);
--Testcase 101:
select array_agg(distinct f1)
from INT4_TBL;
--Testcase 102:
select array_agg(distinct f1 order by f1)
from INT4_TBL;
--Testcase 103:
select array_agg(distinct f1 order by f1 desc)
from INT4_TBL;
--Testcase 104:
select array_agg(distinct f1 order by f1 desc nulls last)
from INT4_TBL;
rollback;
-- multi-arg aggs, strict/nonstrict, distinct/order by
--Testcase 433:
create type aggtype as (a integer, b integer, c text);
--Testcase 434:
create function aggf_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql strict immutable;
--Testcase 435:
create function aggfns_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql immutable;
--Testcase 436:
create aggregate aggfstr(integer,integer,text) (
sfunc = aggf_trans, stype = aggtype[],
initcond = '{}'
);
--Testcase 437:
create aggregate aggfns(integer,integer,text) (
sfunc = aggfns_trans, stype = aggtype[], sspace = 10000,
initcond = '{}'
);
begin;
--Testcase 105:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 106:
select aggfstr(a,b,c) from multi_arg_agg;
--Testcase 107:
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 108:
select aggfstr(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 109:
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 110:
select aggfstr(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 111:
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
-- test specific code paths
--Testcase 112:
select aggfns(distinct a,a,c order by c using ~<~,a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 113:
select aggfns(distinct a,a,c order by c using ~<~) from multi_arg_agg, generate_series(1,2) i;
--Testcase 114:
select aggfns(distinct a,a,c order by a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 115:
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
-- check node I/O via view creation and usage, also deparsing logic
--Testcase 438:
create view agg_view1 as
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 116:
select * from agg_view1;
--Testcase 117:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 439:
create or replace view agg_view1 as
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 118:
select * from agg_view1;
--Testcase 119:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 440:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 120:
select * from agg_view1;
--Testcase 121:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 441:
create or replace view agg_view1 as
select aggfns(a,b,c order by b+1) from multi_arg_agg;
--Testcase 122:
select * from agg_view1;
--Testcase 123:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 442:
create or replace view agg_view1 as
select aggfns(a,a,c order by b) from multi_arg_agg;
--Testcase 124:
select * from agg_view1;
--Testcase 125:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 443:
create or replace view agg_view1 as
select aggfns(a,b,c order by c using ~<~) from multi_arg_agg;
--Testcase 126:
select * from agg_view1;
--Testcase 127:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 444:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
--Testcase 128:
select * from agg_view1;
--Testcase 129:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 445:
drop view agg_view1;
rollback;
-- incorrect DISTINCT usage errors
--Testcase 130:
insert into multi_arg_agg values (1,1,'foo');
--Testcase 131:
select aggfns(distinct a,b,c order by i) from multi_arg_agg, generate_series(1,2) i;
--Testcase 132:
select aggfns(distinct a,b,c order by a,b+1) from multi_arg_agg, generate_series(1,2) i;
--Testcase 133:
select aggfns(distinct a,b,c order by a,b,i,c) from multi_arg_agg, generate_series(1,2) i;
--Testcase 134:
select aggfns(distinct a,a,c order by a,b) from multi_arg_agg, generate_series(1,2) i;
-- string_agg tests
begin;
--Testcase 135:
delete from varchar_tbl;
--Testcase 136:
insert into varchar_tbl values ('aaaa'),('bbbb'),('cccc');
--Testcase 137:
select string_agg(f1,',') from varchar_tbl;
--Testcase 138:
delete from varchar_tbl;
--Testcase 139:
insert into varchar_tbl values ('aaaa'),(null),('bbbb'),('cccc');
--Testcase 140:
select string_agg(f1,',') from varchar_tbl;
--Testcase 141:
delete from varchar_tbl;
--Testcase 142:
insert into varchar_tbl values (null),(null),('bbbb'),('cccc');
--Testcase 143:
select string_agg(f1,'AB') from varchar_tbl;
--Testcase 144:
delete from varchar_tbl;
--Testcase 145:
insert into varchar_tbl values (null),(null);
--Testcase 146:
select string_agg(f1,',') from varchar_tbl;
rollback;
-- check some implicit casting cases, as per bug #5564
--Testcase 147:
select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok
--Testcase 148:
select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok
--Testcase 149:
select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok
--Testcase 150:
select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok
-- string_agg bytea tests
--Testcase 446:
create foreign table bytea_test_table(v bytea) server sqlite_svr;
--Testcase 151:
select string_agg(v, '') from bytea_test_table;
--Testcase 152:
insert into bytea_test_table values(decode('ff','hex'));
--Testcase 153:
select string_agg(v, '') from bytea_test_table;
--Testcase 154:
insert into bytea_test_table values(decode('aa','hex'));
--Testcase 155:
select string_agg(v, '') from bytea_test_table;
--Testcase 156:
select string_agg(v, NULL) from bytea_test_table;
--Testcase 157:
select string_agg(v, decode('ee', 'hex')) from bytea_test_table;
--Testcase 447:
drop foreign table bytea_test_table;
-- Test parallel string_agg and array_agg
create foreign table pagg_test (x int, y int) server sqlite_svr;
insert into pagg_test
select (case x % 4 when 1 then null else x end), x % 10
from generate_series(1,5000) x;
set parallel_setup_cost TO 0;
set parallel_tuple_cost TO 0;
set parallel_leader_participation TO 0;
set min_parallel_table_scan_size = 0;
set bytea_output = 'escape';
set max_parallel_workers_per_gather = 2;
-- create a view as we otherwise have to repeat this query a few times.
create view v_pagg_test AS
select
y,
min(t) AS tmin,max(t) AS tmax,count(distinct t) AS tndistinct,
min(b) AS bmin,max(b) AS bmax,count(distinct b) AS bndistinct,
min(a) AS amin,max(a) AS amax,count(distinct a) AS andistinct,
min(aa) AS aamin,max(aa) AS aamax,count(distinct aa) AS aandistinct
from (
select
y,
unnest(regexp_split_to_array(a1.t, ','))::int AS t,
unnest(regexp_split_to_array(a1.b::text, ',')) AS b,
unnest(a1.a) AS a,
unnest(a1.aa) AS aa
from (
select
y,
string_agg(x::text, ',') AS t,
string_agg(x::text::bytea, ',') AS b,
array_agg(x) AS a,
array_agg(ARRAY[x]) AS aa
from pagg_test
group by y
) a1
) a2
group by y;
-- Ensure results are correct.
select * from v_pagg_test order by y;
-- Ensure parallel aggregation is actually being used.
explain (costs off) select * from v_pagg_test order by y;
set max_parallel_workers_per_gather = 0;
-- Ensure results are the same without parallel aggregation.
select * from v_pagg_test order by y;
-- Clean up
reset max_parallel_workers_per_gather;
reset bytea_output;
reset min_parallel_table_scan_size;
reset parallel_leader_participation;
reset parallel_tuple_cost;
reset parallel_setup_cost;
drop view v_pagg_test;
drop foreign table pagg_test;
-- FILTER tests
--Testcase 158:
select min(unique1) filter (where unique1 > 100) from tenk1;
--Testcase 159:
select sum(1/ten) filter (where ten > 0) from tenk1;
--Testcase 160:
select ten, sum(distinct four) filter (where four::text ~ '123') from onek a
group by ten;
--Testcase 161:
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);
--Testcase 448:
create foreign table agg_t17(foo text, bar text) server sqlite_svr;
--Testcase 449:
insert into agg_t17 values ('a', 'b');
--Testcase 450:
select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0')
from agg_t17;
create foreign table agg_t170(v int) server sqlite_svr;
insert into agg_t170(v) values (1), (2), (3);
select any_value(v) filter (where v > 2) from agg_t170;
-- outer reference in FILTER (PostgreSQL extension)
--Testcase 451:
create foreign table agg_t18 (inner_c int) server sqlite_svr;
--Testcase 452:
create foreign table agg_t19 (outer_c int) server sqlite_svr;
--Testcase 453:
insert into agg_t18 values (1);
--Testcase 454:
insert into agg_t19 values (2), (3);
--Testcase 455:
select (select count(*)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 456:
select (select count(*) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- outer query is aggregation query
--Testcase 457:
select (select count(inner_c) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 162:
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)
--Testcase 163:
select sum(unique1) FILTER (WHERE
unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1;
-- exercise lots of aggregate parts with FILTER
begin;
--Testcase 164:
delete from multi_arg_agg;
--Testcase 165:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 166:
select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) from multi_arg_agg, generate_series(1,2) i;
rollback;
-- check handling of bare boolean Var in FILTER
--Testcase 672:
select max(0) filter (where b1) from bool_test;
--Testcase 673:
select (select max(0) filter (where b1)) from bool_test;
-- check for correct detection of nested-aggregate errors in FILTER
--Testcase 674:
select max(unique1) filter (where sum(ten) > 0) from tenk1;
--Testcase 675:
select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1;
--Testcase 676:
select max(unique1) filter (where bool_or(ten > 0)) from tenk1;
--Testcase 677:
select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1;
-- ordered-set aggregates
begin;
--Testcase 167:
delete from FLOAT8_TBL;
--Testcase 168:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 169:
select f1, percentile_cont(f1) within group (order by x::float8)
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 170:
delete from FLOAT8_TBL;
--Testcase 171:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 172:
select f1, percentile_cont(f1 order by f1) within group (order by x) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 173:
delete from FLOAT8_TBL;
--Testcase 174:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 175:
select f1, sum() within group (order by x::float8) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 176:
delete from FLOAT8_TBL;
--Testcase 177:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 178:
select f1, percentile_cont(f1,f1) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
--Testcase 179:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 693:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10) from aggtest;
--Testcase 180:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 694:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10), sum(b)::numeric(10,3) from aggtest;
--Testcase 181:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 695:
select percentile_cont(0.5) within group (order by thousand) from tenk1;
--Testcase 182:
select percentile_disc(0.5) within group (order by thousand) from tenk1;
begin;
--Testcase 183:
delete from INT4_TBL;
--Testcase 184:
insert into INT4_TBL values (1),(1),(2),(2),(3),(3),(4);
--Testcase 185:
select rank(3) within group (order by f1) from INT4_TBL;
--Testcase 186:
select cume_dist(3) within group (order by f1) from INT4_TBL;
--Testcase 187:
insert into INT4_TBL values (5);
--Testcase 458:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 696:
select (percent_rank(3) within group (order by f1))::numeric(20,10) from INT4_TBL;
--Testcase 459:
delete from INT4_TBL where f1 = 5;
--Testcase 188:
select dense_rank(3) within group (order by f1) from INT4_TBL;
rollback;
--Testcase 189:
select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand)
from tenk1;
--Testcase 190:
select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand)
from tenk1;
--Testcase 191:
select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand)
from tenk1;
--Testcase 460:
create foreign table agg_t21 (x int) server sqlite_svr;
begin;
--Testcase 248:
insert into agg_t21 select * from generate_series(1,6);
--Testcase 249:
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 agg_t21;
rollback;
--Testcase 192:
select ten, mode() within group (order by string4) from tenk1 group by ten;
--Testcase 461:
create foreign table agg_t20 (x text) server sqlite_svr;
begin;
--Testcase 462:
insert into agg_t20 values (unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]));
--Testcase 463:
select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) from agg_t20;
rollback;
-- check collation propagates up in suitable cases:
begin;
--Testcase 464:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 465:
select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) from agg_t20;
rollback;
-- ordered-set aggs created with CREATE AGGREGATE
--Testcase 466:
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
);
--Testcase 467:
create aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") (
stype = internal,
sfunc = ordered_set_transition_multi,
finalfunc = rank_final,
finalfunc_extra = true,
hypothetical
);
--Testcase 633:
alter aggregate my_percentile_disc(float8 ORDER BY anyelement)
rename to test_percentile_disc;
--Testcase 634:
alter aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any")
rename to test_rank;
begin;
--Testcase 468:
insert into agg_t21 values (1),(1),(2),(2),(3),(3),(4);
--Testcase 469:
select test_rank(3) within group (order by x) from agg_t21;
rollback;
--Testcase 193:
select test_percentile_disc(0.5) within group (order by thousand) from tenk1;
-- ordered-set aggs can't use ungrouped vars in direct args:
begin;
--Testcase 470:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 471:
select rank(x) within group (order by x) from agg_t21;
rollback;
-- outer-level agg can't use a grouped arg of a lower level, either:
begin;
--Testcase 472:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 473:
select array(select percentile_disc(a) within group (order by x)
from (values (0.3),(0.7)) v(a) group by a)
from agg_t21;
rollback;
-- agg in the direct args is a grouping violation, too:
begin;
--Testcase 474:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 475:
select rank(sum(x)) within group (order by x) from agg_t21;
rollback;
-- hypothetical-set type unification and argument-count failures:
begin;
--Testcase 264:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 265:
select rank(3) within group (order by x) from agg_t20;
rollback;
--Testcase 194:
select rank(3) within group (order by stringu1,stringu2) from tenk1;
begin;
--Testcase 476:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 477:
select rank('fred') within group (order by x) from agg_t21;
rollback;
begin;
--Testcase 478:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 479:
select rank('adam'::text collate "C") within group (order by x collate "POSIX")
from agg_t20;
rollback;
-- hypothetical-set type unification successes:
begin;
--Testcase 480:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 481:
select rank('adam'::varchar) within group (order by x) from agg_t20;
rollback;
begin;
--Testcase 482:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 483:
select rank('3') within group (order by x) from agg_t21;
rollback;
-- divide by zero check
begin;
--Testcase 484:
insert into agg_t21 select * from generate_series(1,0);
--Testcase 485:
select percent_rank(0) within group (order by x) from agg_t21;
rollback;
-- deparse and multiple features:
--Testcase 486:
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;
--Testcase 196:
select pg_get_viewdef('aggordview1');
--Testcase 197:
select * from aggordview1 order by ten;
--Testcase 487:
drop view aggordview1;
-- variadic aggregates
--Testcase 488:
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)';
--Testcase 489:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
--Testcase 490:
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)';
--Testcase 491:
create aggregate cleast_agg(variadic items anycompatiblearray) (
stype = anycompatible, sfunc = cleast_accum);
--Testcase 198:
select least_agg(q1,q2) from int8_tbl;
--Testcase 199:
select least_agg(variadic array[q1,q2]) from int8_tbl;
--Testcase 492:
select cleast_agg(q1,q2) from int8_tbl;
--Testcase 493:
select cleast_agg(4.5,f1) from int4_tbl;
--Testcase 494:
select cleast_agg(variadic array[4.5,f1]) from int4_tbl;
--Testcase 495:
select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl;
-- test aggregates with common transition functions share the same states
--Testcase 496:
create foreign table agg_t10(one int, id int options (key 'true')) server sqlite_svr;
--Testcase 497:
create foreign table agg_t11(one int, two int, id int options (key 'true')) server sqlite_svr;
--Testcase 498:
create foreign table agg_t12(a int, id int options (key 'true')) server sqlite_svr;
begin work;
--Testcase 499:
create type avg_state as (total bigint, count bigint);
--Testcase 500:
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;
--Testcase 501:
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;
--Testcase 502:
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;
--Testcase 503:
create aggregate my_avg(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn
);
--Testcase 504:
create aggregate my_sum(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn
);
-- aggregate state should be shared as aggs are the same.
--Testcase 505:
delete from agg_t10;
--Testcase 506:
insert into agg_t10 values (1), (3);
--Testcase 507:
select my_avg(one),my_avg(one) from agg_t10;
-- aggregate state should be shared as transfn is the same for both aggs.
--Testcase 508:
select my_avg(one),my_sum(one) from agg_t10;
-- same as previous one, but with DISTINCT, which requires sorting the input.
--Testcase 509:
delete from agg_t10;
--Testcase 510:
insert into agg_t10 values (1), (3), (1);
--Testcase 511:
select my_avg(distinct one),my_sum(distinct one) from agg_t10;
-- shouldn't share states due to the distinctness not matching.
--Testcase 512:
delete from agg_t10;
--Testcase 513:
insert into agg_t10 values (1), (3);
--Testcase 514:
select my_avg(distinct one),my_sum(one) from agg_t10;
-- shouldn't share states due to the filter clause not matching.
--Testcase 515:
select my_avg(one) filter (where one > 1),my_sum(one) from agg_t10;
-- this should not share the state due to different input columns.
--Testcase 516:
delete from agg_t11;
--Testcase 517:
insert into agg_t11 values (1,2),(3,4);
--Testcase 518:
select my_avg(one),my_sum(two) from agg_t11;
-- exercise cases where OSAs share state
--Testcase 519:
delete from agg_t12;
--Testcase 520:
insert into agg_t12 values (1), (3), (5), (7);
--Testcase 521:
select
percentile_cont(0.5) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
--Testcase 522:
select
percentile_cont(0.25) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
-- these can't share state currently
--Testcase 523:
select
rank(4) within group (order by a),
dense_rank(4) within group (order by a)
from agg_t12;
-- test that aggs with the same sfunc and initcond share the same agg state
--Testcase 524:
create aggregate my_sum_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn,
initcond = '(10,0)'
);
--Testcase 525:
create aggregate my_avg_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn,
initcond = '(10,0)'
);
--Testcase 526:
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
--Testcase 527:
delete from agg_t10;
--Testcase 528:
insert into agg_t10 values (1), (3);
--Testcase 529:
select my_sum_init(one),my_avg_init(one) from agg_t10;
-- Varying INITCONDs should cause the states not to be shared.
--Testcase 530:
select my_sum_init(one),my_avg_init2(one) from agg_t10;
rollback;
-- test aggregate state sharing to ensure it works if one aggregate has a
-- finalfn and the other one has none.
begin work;
--Testcase 531:
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;
--Testcase 532:
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;
--Testcase 533:
create aggregate my_sum(int4)
(
stype = int4,
sfunc = sum_transfn
);
--Testcase 534:
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
--Testcase 535:
delete from agg_t10;
--Testcase 536:
insert into agg_t10 values (1), (2), (3), (4);
--Testcase 537:
select my_sum(one),my_half_sum(one) from agg_t10;
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;
--Testcase 538:
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$$;
--Testcase 539:
CREATE AGGREGATE balk(int4)
(
SFUNC = balkifnull(int8, int4),
STYPE = int8,
PARALLEL = SAFE,
INITCOND = '0'
);
--Testcase 200:
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;
--Testcase 540:
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$$;
--Testcase 541:
CREATE AGGREGATE balk(int4)
(
SFUNC = int4_sum(int8, int4),
STYPE = int8,
COMBINEFUNC = balkifnull(int8, int8),
PARALLEL = SAFE,
INITCOND = '0'
);
-- force use of parallelism
-- Skip this test, cannot alter foreign table tenk1
-- ALTER FOREIGN 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 multiple usage of an aggregate whose finalfn returns a R/W datum
BEGIN;
CREATE FUNCTION rwagg_sfunc(x anyarray, y anyarray) RETURNS anyarray
LANGUAGE plpgsql IMMUTABLE AS $$
BEGIN
RETURN array_fill(y[1], ARRAY[4]);
END;
$$;
CREATE FUNCTION rwagg_finalfunc(x anyarray) RETURNS anyarray
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
DECLARE
res x%TYPE;
BEGIN
-- assignment is essential for this test, it expands the array to R/W
res := array_fill(x[1], ARRAY[4]);
RETURN res;
END;
$$;
CREATE AGGREGATE rwagg(anyarray) (
STYPE = anyarray,
SFUNC = rwagg_sfunc,
FINALFUNC = rwagg_finalfunc
);
CREATE FUNCTION eatarray(x real[]) RETURNS real[]
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
BEGIN
x[1] := x[1] + 1;
RETURN x;
END;
$$;
CREATE FOREIGN TABLE float_tb(f real) SERVER sqlite_svr;
INSERT INTO float_tb(f) VALUES (1.0);
SELECT eatarray(rwagg(ARRAY[f::real])), eatarray(rwagg(ARRAY[f::real])) FROM float_tb;
ROLLBACK;
-- test coverage for aggregate combine/serial/deserial functions
BEGIN;
--Testcase 635:
SET parallel_setup_cost = 0;
--Testcase 636:
SET parallel_tuple_cost = 0;
--Testcase 637:
SET min_parallel_table_scan_size = 0;
--Testcase 638:
SET max_parallel_workers_per_gather = 4;
--Testcase 639:
SET parallel_leader_participation = off;
--Testcase 640:
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
--Testcase 542:
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;
--Testcase 543:
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
--Testcase 544:
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;
--Testcase 545:
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
--Testcase 546:
create foreign table agg_t13(x int, id int options (key 'true')) server sqlite_svr;
--Testcase 547:
insert into agg_t13 values (1),(1),(2),(2),(3),(3);
--Testcase 548:
SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM agg_t13 GROUP BY (x) ORDER BY 1;
--Testcase 549:
delete from agg_t13;
-- 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
--Testcase 550:
create foreign table agg_t14(x int, y int, id int options (key 'true')) server sqlite_svr;
--Testcase 551:
insert into agg_t14 values (1, NULL), (1, 2);
--Testcase 552:
SELECT min(x ORDER BY y) FROM agg_t14;
--Testcase 553:
SELECT min(x ORDER BY y) FROM agg_t14;
-- check collation-sensitive matching between grouping expressions
begin;
--Testcase 554:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 555:
select x||'a', case x||'a' when 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
begin;
--Testcase 556:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 557:
select x||'a', case when x||'a' = 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
-- 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
--Testcase 641:
set enable_memoize to off;
--Testcase 558:
explain (costs off)
select 1 from tenk1
where (hundred, thousand) in (select twothousand, twothousand from onek);
--Testcase 642:
reset enable_memoize;
--
-- Hash Aggregation Spill tests
--
--Testcase 643:
set enable_sort=false;
--Testcase 644:
set work_mem='64kB';
--Testcase 559:
select unique1, count(*), sum(twothousand) from tenk1
group by unique1
having sum(fivethous) > 4975
order by sum(twothousand);
--Testcase 645:
set work_mem to default;
--Testcase 646:
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.
--
--Testcase 647:
set work_mem='64kB';
--Testcase 560:
create foreign table agg_data_2k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 561:
create foreign table agg_data_20k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 562:
create foreign table agg_group_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 563:
create foreign table agg_group_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 564:
create foreign table agg_group_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 565:
create foreign table agg_group_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 566:
create foreign table agg_hash_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 567:
create foreign table agg_hash_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 568:
create foreign table agg_hash_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 569:
create foreign table agg_hash_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 570:
insert into agg_data_2k select g from generate_series(0, 1999) g;
--analyze agg_data_2k;
--Testcase 571:
insert into agg_data_20k select g from generate_series(0, 19999) g;
--analyze agg_data_20k;
-- Produce results with sorting.
--Testcase 648:
set enable_hashagg = false;
--Testcase 649:
set jit_above_cost = 0;
--Testcase 572:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 573:
insert into agg_group_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 574:
insert into agg_group_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 650:
set jit_above_cost to default;
--Testcase 575:
insert into agg_group_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 576:
insert into agg_group_4
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
--Testcase 651:
set enable_hashagg = true;
--Testcase 652:
set enable_sort = false;
--Testcase 653:
set jit_above_cost = 0;
--Testcase 577:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 578:
insert into agg_hash_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 579:
insert into agg_hash_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 654:
set jit_above_cost to default;
--Testcase 580:
insert into agg_hash_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 581:
insert into agg_hash_4
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 655:
set enable_sort = true;
--Testcase 656:
set work_mem to default;
-- Compare group aggregation results to hash aggregation results
--Testcase 582:
(select * from agg_hash_1 except select * from agg_group_1)
union all
(select * from agg_group_1 except select * from agg_hash_1);
--Testcase 583:
(select * from agg_hash_2 except select * from agg_group_2)
union all
(select * from agg_group_2 except select * from agg_hash_2);
--Testcase 584:
(select * from agg_hash_3 except select * from agg_group_3)
union all
(select * from agg_group_3 except select * from agg_hash_3);
--Testcase 585:
(select * from agg_hash_4 except select * from agg_group_4)
union all
(select * from agg_group_4 except select * from agg_hash_4);
--Testcase 712:
DELETE FROM INT4_TBL;
--Testcase 713:
DELETE FROM INT8_TBL;
--Testcase 714:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 586:
DROP SERVER sqlite_svr CASCADE;
--Testcase 587:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/encodings.sql
================================================
-- tests for PR #76 github
-- see https://www.postgresql.org/docs/current/multibyte.html
-- EUC_CN, not tested
-- EUC_JP
-- EUC_JIS_2004, not tested
-- EUC_KR
-- EUC_TW, not tested
-- ISO_8859_5
-- ISO_8859_6
-- ISO_8859_7
-- ISO_8859_8
-- KOI8R, not tested
-- KOI8U, not tested
-- LATIN1
-- LATIN2
-- LATIN3
-- LATIN4
-- LATIN5
-- LATIN6
-- LATIN7
-- LATIN8
-- LATIN9
-- LATIN10
-- MULE_INTERNAL, not tested
-- SQL_ASCII
-- WIN866, not tested
-- WIN874, not tested
-- WIN1250
-- WIN1251
-- WIN1252
-- WIN1253
-- WIN1254
-- WIN1255
-- WIN1256
-- WIN1257
-- WIN1258, not tested
-- ================
-- check all data in UTF8
-- ================
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
SELECT * FROM "Unicode data";
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
-- euc_jp
CREATE DATABASE "contrib_regression_EUC_JP" ENCODING EUC_JP LC_CTYPE='ja_JP.eucjp' LC_COLLATE='ja_JP.eucjp' template template0;
\connect "contrib_regression_EUC_JP"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_JP";
-- ko_KR.euckr
CREATE DATABASE "contrib_regression_EUC_KR" ENCODING EUC_KR LC_CTYPE='ko_KR.euckr' LC_COLLATE='ko_KR.euckr' template template0;
\connect "contrib_regression_EUC_KR"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_KR";
-- ISO_8859_5
CREATE DATABASE "contrib_regression_ISO_8859_5" ENCODING ISO_8859_5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_5";
-- ISO_8859_6
CREATE DATABASE "contrib_regression_ISO_8859_6" ENCODING ISO_8859_6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_6";
-- ISO_8859_7
CREATE DATABASE "contrib_regression_ISO_8859_7" ENCODING ISO_8859_7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_7";
-- ISO_8859_8
CREATE DATABASE "contrib_regression_ISO_8859_8" ENCODING ISO_8859_8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_8";
-- ISO_8859_9
CREATE DATABASE "contrib_regression_ISO_8859_9" ENCODING ISO_8859_9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_9";
-- LATIN1
CREATE DATABASE "contrib_regression_LATIN1" ENCODING LATIN1 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN1"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN1";
-- LATIN2
CREATE DATABASE "contrib_regression_LATIN2" ENCODING LATIN2 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN2"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN2";
-- LATIN3
CREATE DATABASE "contrib_regression_LATIN3" ENCODING LATIN3 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN3"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN3";
-- LATIN4
CREATE DATABASE "contrib_regression_LATIN4" ENCODING LATIN4 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN4"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN4";
-- LATIN5
CREATE DATABASE "contrib_regression_LATIN5" ENCODING LATIN5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN5";
-- LATIN6
CREATE DATABASE "contrib_regression_LATIN6" ENCODING LATIN6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN6";
-- LATIN7
CREATE DATABASE "contrib_regression_LATIN7" ENCODING LATIN7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN7";
-- LATIN8
CREATE DATABASE "contrib_regression_LATIN8" ENCODING LATIN8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN8";
-- LATIN9
CREATE DATABASE "contrib_regression_LATIN9" ENCODING LATIN9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN9";
-- LATIN10
CREATE DATABASE "contrib_regression_LATIN10" ENCODING LATIN10 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN10"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN10";
-- cp1250
CREATE DATABASE "contrib_regression_WIN1250" ENCODING WIN1250 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1250"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1250";
-- cp1251
CREATE DATABASE "contrib_regression_WIN1251" ENCODING WIN1251 LC_CTYPE='bg_BG' LC_COLLATE='bg_BG' template template0;
\connect "contrib_regression_WIN1251"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1251";
-- cp1252
CREATE DATABASE "contrib_regression_WIN1252" ENCODING WIN1252 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1252"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1252";
-- cp1253
CREATE DATABASE "contrib_regression_WIN1253" ENCODING WIN1253 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1253"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1253";
-- cp1254
CREATE DATABASE "contrib_regression_WIN1254" ENCODING WIN1254 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1254"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1254";
-- cp1255
CREATE DATABASE "contrib_regression_WIN1255" ENCODING WIN1255 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1255"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1255";
-- cp1256
CREATE DATABASE "contrib_regression_WIN1256" ENCODING WIN1256 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1256"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1256";
-- cp1257
CREATE DATABASE "contrib_regression_WIN1257" ENCODING WIN1257 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1257"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1257";
-- SQL_ASCII
CREATE DATABASE "contrib_regression_SQL_ASCII" ENCODING SQL_ASCII LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_SQL_ASCII"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_SQL_ASCII";
================================================
FILE: sql/15.7/extra/insert.sql
================================================
--
-- insert with DEFAULT in the target_list
--
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 18:
CREATE FOREIGN TABLE inserttest01 (col1 int4, col2 int4 NOT NULL, col3 text default 'testing') SERVER sqlite_svr;
--Testcase 1:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT);
--Testcase 2:
insert into inserttest01 (col2, col3) values (3, DEFAULT);
--Testcase 3:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, 5, DEFAULT);
--Testcase 4:
insert into inserttest01 values (DEFAULT, 5, 'test');
--Testcase 5:
insert into inserttest01 values (DEFAULT, 7);
--Testcase 6:
select * from inserttest01;
--
-- insert with similar expression / target_list values (all fail)
--
--Testcase 7:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT);
--Testcase 8:
insert into inserttest01 (col1, col2, col3) values (1, 2);
--Testcase 9:
insert into inserttest01 (col1) values (1, 2);
--Testcase 10:
insert into inserttest01 (col1) values (DEFAULT, DEFAULT);
--Testcase 11:
select * from inserttest01;
--
-- VALUES test
--
--Testcase 12:
insert into inserttest01 values(10, 20, '40'), (-1, 2, DEFAULT),
((select 2), (select i from (values(3)) as foo (i)), 'values are fun!');
--Testcase 13:
select * from inserttest01;
--
-- TOASTed value test
--
--Testcase 14:
insert into inserttest01 values(30, 50, repeat('x', 10000));
--Testcase 15:
select col1, col2, char_length(col3) from inserttest01;
--
-- tuple larger than fillfactor
-- foreign table does not support 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;
-- skip, sqlite fdw does not support customized type
/*
-- 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
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;
*/
-- drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 19:
DROP SERVER sqlite_svr;
--Testcase 20:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/join.sql
================================================
--
-- JOIN
-- Test JOIN clauses
--
--Testcase 360:
CREATE EXTENSION sqlite_fdw;
--Testcase 361:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 362:
CREATE FOREIGN TABLE J1_TBL (
i integer,
j integer,
t text
) SERVER sqlite_svr;
--Testcase 363:
CREATE FOREIGN TABLE J2_TBL (
i integer,
k integer
) SERVER sqlite_svr;
--Testcase 364:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 365:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 366:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 545:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 546:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 547:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 548:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 549:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 367:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 550:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 551:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 552:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 553:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 554:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
--Testcase 368:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 555:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 556:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 557:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 558:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 559:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 369:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO J1_TBL VALUES (1, 4, 'one');
--Testcase 2:
INSERT INTO J1_TBL VALUES (2, 3, 'two');
--Testcase 3:
INSERT INTO J1_TBL VALUES (3, 2, 'three');
--Testcase 4:
INSERT INTO J1_TBL VALUES (4, 1, 'four');
--Testcase 5:
INSERT INTO J1_TBL VALUES (5, 0, 'five');
--Testcase 6:
INSERT INTO J1_TBL VALUES (6, 6, 'six');
--Testcase 7:
INSERT INTO J1_TBL VALUES (7, 7, 'seven');
--Testcase 8:
INSERT INTO J1_TBL VALUES (8, 8, 'eight');
--Testcase 9:
INSERT INTO J1_TBL VALUES (0, NULL, 'zero');
--Testcase 10:
INSERT INTO J1_TBL VALUES (NULL, NULL, 'null');
--Testcase 11:
INSERT INTO J1_TBL VALUES (NULL, 0, 'zero');
--Testcase 12:
INSERT INTO J2_TBL VALUES (1, -1);
--Testcase 13:
INSERT INTO J2_TBL VALUES (2, 2);
--Testcase 14:
INSERT INTO J2_TBL VALUES (3, -3);
--Testcase 15:
INSERT INTO J2_TBL VALUES (2, 4);
--Testcase 16:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 17:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 18:
INSERT INTO J2_TBL VALUES (0, NULL);
--Testcase 19:
INSERT INTO J2_TBL VALUES (NULL, NULL);
--Testcase 20:
INSERT INTO J2_TBL VALUES (NULL, 0);
-- useful in some tests below
--Testcase 370:
create temp table onerow();
--Testcase 371:
insert into onerow default values;
analyze onerow;
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
--Testcase 21:
SELECT *
FROM J1_TBL AS tx;
--Testcase 22:
SELECT *
FROM J1_TBL tx;
--Testcase 23:
SELECT *
FROM J1_TBL AS t1 (a, b, c);
--Testcase 24:
SELECT *
FROM J1_TBL t1 (a, b, c);
--Testcase 25:
SELECT *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
--Testcase 26:
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.
--
--Testcase 27:
SELECT *
FROM J1_TBL CROSS JOIN J2_TBL;
-- ambiguous column
--Testcase 28:
SELECT i, k, t
FROM J1_TBL CROSS JOIN J2_TBL;
-- resolve previous ambiguity by specifying the table name
--Testcase 29:
SELECT t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
--Testcase 30:
SELECT ii, tt, kk
FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
--Testcase 31:
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);
--Testcase 32:
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
--Testcase 33:
SELECT *
FROM J1_TBL INNER JOIN J2_TBL USING (i);
-- Same as above, slightly different syntax
--Testcase 34:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i);
--Testcase 35:
SELECT *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a)
ORDER BY a, d;
--Testcase 36:
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
--Testcase 489:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) WHERE J1_TBL.t = 'one'; -- ok
--Testcase 490:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok
--Testcase 491:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error
--Testcase 492:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok
--Testcase 493:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error
--Testcase 494:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint)
--Testcase 495:
SELECT *
FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error
--Testcase 496:
SELECT x.*
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 497:
SELECT ROW(x.*)
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 498:
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
--
--Testcase 37:
SELECT *
FROM J1_TBL NATURAL JOIN J2_TBL;
--Testcase 38:
SELECT *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
--Testcase 39:
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
--Testcase 40:
SELECT *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
--
-- Inner joins (equi-joins)
--
--Testcase 41:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
--Testcase 42:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
--
-- Non-equi-joins
--
--Testcase 43:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
--
-- Outer joins
-- Note that OUTER is a noise word
--
--Testcase 44:
SELECT *
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 45:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 46:
SELECT *
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
--Testcase 47:
SELECT *
FROM J1_TBL RIGHT JOIN J2_TBL USING (i);
--Testcase 48:
SELECT *
FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 49:
SELECT *
FROM J1_TBL FULL JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 50:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1);
--Testcase 51:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1);
--
-- semijoin selectivity for <>
--
--Testcase 52:
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
--
--Testcase 372:
CREATE FOREIGN TABLE t11 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 373:
CREATE FOREIGN TABLE t21 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 374:
CREATE FOREIGN TABLE t31 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 53:
INSERT INTO t11 VALUES ( 'bb', 11 );
--Testcase 54:
INSERT INTO t21 VALUES ( 'bb', 12 );
--Testcase 55:
INSERT INTO t21 VALUES ( 'cc', 22 );
--Testcase 56:
INSERT INTO t21 VALUES ( 'ee', 42 );
--Testcase 57:
INSERT INTO t31 VALUES ( 'bb', 13 );
--Testcase 58:
INSERT INTO t31 VALUES ( 'cc', 23 );
--Testcase 59:
INSERT INTO t31 VALUES ( 'dd', 33 );
--Testcase 60:
SELECT * FROM t11 FULL JOIN t21 USING (name) FULL JOIN t31 USING (name);
--
-- Test interactions of join syntax and subqueries
--
-- Basic cases (we expect planner to pull up the subquery here)
--Testcase 61:
SELECT * FROM
(SELECT * FROM t21) as s2
INNER JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 62:
SELECT * FROM
(SELECT * FROM t21) as s2
LEFT JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 63:
SELECT * FROM
(SELECT * FROM t21) as s2
FULL JOIN
(SELECT * FROM t31) s3
USING (name);
-- Cases with non-nullable expressions in subquery results;
-- make sure these go to null as expected
--Testcase 64:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 65:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL LEFT JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 66:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 67:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL INNER JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 68:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL FULL JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 69:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
--Testcase 70:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
-- Constants as join keys can also be problematic
--Testcase 375:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
FULL JOIN
(SELECT name, 2 as s2_n FROM t21) as s2
ON (s1_n = s2_n);
-- Test for propagation of nullability constraints into sub-joins
--Testcase 376:
create foreign table x (x1 int, x2 int) server sqlite_svr;
--Testcase 71:
insert into x values (1,11);
--Testcase 72:
insert into x values (2,22);
--Testcase 73:
insert into x values (3,null);
--Testcase 74:
insert into x values (4,44);
--Testcase 75:
insert into x values (5,null);
--Testcase 377:
create foreign table y (y1 int, y2 int) server sqlite_svr;
--Testcase 76:
insert into y values (1,111);
--Testcase 77:
insert into y values (2,222);
--Testcase 78:
insert into y values (3,333);
--Testcase 79:
insert into y values (4,null);
--Testcase 80:
select * from x;
--Testcase 81:
select * from y;
--Testcase 82:
select * from x left join y on (x1 = y1 and x2 is not null);
--Testcase 83:
select * from x left join y on (x1 = y1 and y2 is not null);
--Testcase 84:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1);
--Testcase 85:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and x2 is not null);
--Testcase 86:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and y2 is not null);
--Testcase 87:
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
--Testcase 88:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (x2 is not null);
--Testcase 89:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (y2 is not null);
--Testcase 90:
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
--
--Testcase 91:
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
--
--Testcase 92:
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;
--Testcase 499:
set geqo = on;
--Testcase 500:
set geqo_threshold = 2;
--Testcase 93:
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
--
--Testcase 378:
create table b (aa int, bb int);
--Testcase 379:
explain (costs off)
select aa, bb, unique1, unique1
from tenk1 right join b on aa = unique1
where bb < bb and bb is null;
--Testcase 380:
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
--
--Testcase 94:
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;
--Testcase 95:
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
--
--Testcase 96:
select count(*)
from
(select t31.tenthous as x1, coalesce(t11.stringu1, t21.stringu1) as x2
from tenk1 t11
left join tenk1 t21 on t11.unique1 = t21.unique1
join tenk1 t31 on t11.unique2 = t31.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
--
--Testcase 97:
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;
--Testcase 98:
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
-- PS: Used ORDER BY to force SQLite and PG12 always order in the same way (NULLS FIRST/LAST default value for PG and Sqlite are different)
--
--Testcase 99:
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 ORDER BY j1_tbl.i, j2_tbl.k;
--Testcase 100:
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 BY j1_tbl.i, j2_tbl.k;
--
-- a different check for handling of redundant sort keys in merge joins
--
--Testcase 101:
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;
--Testcase 102:
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
--
--Testcase 381:
DROP FOREIGN TABLE t11;
--Testcase 382:
DROP FOREIGN TABLE t21;
--Testcase 383:
DROP FOREIGN TABLE t31;
--Testcase 384:
DROP FOREIGN TABLE J1_TBL;
--Testcase 385:
DROP FOREIGN TABLE J2_TBL;
-- Both DELETE and UPDATE allow the specification of additional tables
-- to "join" against to determine which rows should be modified.
--Testcase 386:
CREATE FOREIGN TABLE t12 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 387:
CREATE FOREIGN TABLE t22 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 388:
CREATE FOREIGN TABLE t32 (x int OPTIONS (key 'true'), y int) SERVER sqlite_svr;
--Testcase 103:
INSERT INTO t12 VALUES (5, 10);
--Testcase 104:
INSERT INTO t12 VALUES (15, 20);
--Testcase 105:
INSERT INTO t12 VALUES (100, 100);
--Testcase 106:
INSERT INTO t12 VALUES (200, 1000);
--Testcase 107:
INSERT INTO t22 VALUES (200, 2000);
--Testcase 108:
INSERT INTO t32 VALUES (5, 20);
--Testcase 109:
INSERT INTO t32 VALUES (6, 7);
--Testcase 110:
INSERT INTO t32 VALUES (7, 8);
--Testcase 111:
INSERT INTO t32 VALUES (500, 100);
--Testcase 112:
DELETE FROM t32 USING t12 table1 WHERE t32.x = table1.a;
--Testcase 113:
SELECT * FROM t32;
--Testcase 114:
DELETE FROM t32 USING t12 JOIN t22 USING (a) WHERE t32.x > t12.a;
--Testcase 115:
SELECT * FROM t32;
--Testcase 116:
DELETE FROM t32 USING t32 t3_other WHERE t32.x = t3_other.x AND t32.y = t3_other.y;
--Testcase 117:
SELECT * FROM t32;
-- Test join against inheritance tree
--Testcase 389:
create temp table t2a () inherits (t22);
--Testcase 118:
insert into t2a values (200, 2001);
--Testcase 119:
select * from t12 left join t22 on (t12.a = t22.a);
-- Test matching of column name with wrong alias
--Testcase 120:
select t12.x from t12 join t32 on (t12.a = t32.x);
-- Test matching of locking clause with wrong alias
--Testcase 540:
select t12.*, t22.*, unnamed_join.* from
t12 join t22 on (t12.a = t22.a), t32 as unnamed_join
for update of unnamed_join;
--Testcase 541:
select foo.*, unnamed_join.* from
t12 join t22 using (a) as foo, t32 as unnamed_join
for update of unnamed_join;
--Testcase 542:
select foo.*, unnamed_join.* from
t12 join t22 using (a) as foo, t32 as unnamed_join
for update of foo;
--Testcase 543:
select bar.*, unnamed_join.* from
(t12 join t22 using (a) as foo) as bar, t32 as unnamed_join
for update of foo;
--Testcase 544:
select bar.*, unnamed_join.* from
(t12 join t22 using (a) as foo) as bar, t32 as unnamed_join
for update of bar;
--Testcase 536:
drop table t2a;
--
-- regression test for 8.1 merge right join bug
--
--Testcase 390:
CREATE FOREIGN TABLE tt1 ( tt1_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO tt1 VALUES (1, 11);
--Testcase 122:
INSERT INTO tt1 VALUES (2, NULL);
--Testcase 391:
CREATE FOREIGN TABLE tt2 ( tt2_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 123:
INSERT INTO tt2 VALUES (21, 11);
--Testcase 124:
INSERT INTO tt2 VALUES (22, 11);
--Testcase 501:
set enable_hashjoin to off;
--Testcase 502:
set enable_nestloop to off;
-- these should give the same results
--Testcase 125:
select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol;
--Testcase 126:
select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol;
--Testcase 503:
reset enable_hashjoin;
--Testcase 504:
reset enable_nestloop;
--
-- regression test for bug #13908 (hash join with skew tuples & nbatch increase)
--
--Testcase 505:
set work_mem to '64kB';
--Testcase 506:
set enable_mergejoin to off;
--Testcase 507:
set enable_memoize to off;
--Testcase 127:
explain (costs off)
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 128:
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 508:
reset work_mem;
--Testcase 509:
reset enable_mergejoin;
--Testcase 510:
reset enable_memoize;
--
-- regression test for 8.2 bug with improper re-ordering of left joins
--
--Testcase 392:
create foreign table tt3(f1 int, f2 text) server sqlite_svr;
--Testcase 129:
insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x;
--Testcase 393:
create foreign table tt4(f1 int) server sqlite_svr;
--Testcase 130:
insert into tt4 values (0),(1),(9999);
--Testcase 131:
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
--
--Testcase 394:
create foreign table tt4x(c1 int, c2 int, c3 int) server sqlite_svr;
--Testcase 132:
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
--
--Testcase 395:
create foreign table tt5(f1 int, f2 int) server sqlite_svr;
--Testcase 396:
create foreign table tt6(f1 int, f2 int) server sqlite_svr;
--Testcase 133:
insert into tt5 values(1, 10);
--Testcase 134:
insert into tt5 values(1, 11);
--Testcase 135:
insert into tt6 values(1, 9);
--Testcase 136:
insert into tt6 values(1, 2);
--Testcase 137:
insert into tt6 values(2, 9);
--Testcase 138:
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
--
--Testcase 397:
create foreign table xx (pkxx int) server sqlite_svr;
--Testcase 398:
create foreign table yy (pkyy int, pkxx int) server sqlite_svr;
--Testcase 139:
insert into xx values (1);
--Testcase 140:
insert into xx values (2);
--Testcase 141:
insert into xx values (3);
--Testcase 142:
insert into yy values (101, 1);
--Testcase 143:
insert into yy values (201, 2);
--Testcase 144:
insert into yy values (301, NULL);
--Testcase 145:
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)
--
--Testcase 399:
create foreign table zt1 (f1 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 400:
create foreign table zt2 (f2 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 401:
create foreign table zt3 (f3 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 146:
insert into zt1 values(53);
--Testcase 147:
insert into zt2 values(53);
--Testcase 148:
select * from
zt2 left join zt3 on (f2 = f3)
left join zt1 on (f3 = f1)
where f2 = 53;
--Testcase 402:
create temp view zv1 as select *,'dummy'::text AS junk from zt1;
--Testcase 149:
select * from
zt2 left join zt3 on (f2 = f3)
left join zv1 on (f3 = f1)
where f2 = 53;
--Testcase 537:
drop view zv1;
--
-- regression test for improper extraction of OR indexqual conditions
-- (as seen in early 8.3.x releases)
--
--Testcase 150:
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)
--
--Testcase 151:
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));
--Testcase 152:
execute foo(true);
--Testcase 153:
execute foo(false);
--
-- test for sane behavior with noncanonical merge clauses, per bug #4926
--
begin;
--Testcase 511:
set enable_mergejoin = 1;
--Testcase 512:
set enable_hashjoin = 0;
--Testcase 513:
set enable_nestloop = 0;
--Testcase 403:
create foreign table a1 (i integer) server sqlite_svr;
--Testcase 404:
create foreign table b1 (x integer, y integer) server sqlite_svr;
--Testcase 154:
select * from a1 left join b1 on i = x and i = y and x = i;
rollback;
-- skip this test, sqlite fdw does not support customized type
-- test handling of merge clauses using record_ops
--
--begin;
--create type mycomptype as (id int, v bigint);
--create foreign table tidv (idv mycomptype) server sqlite_svr;
--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;
--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
--
--Testcase 155:
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;
--Testcase 156:
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;
--Testcase 157:
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;
--Testcase 158:
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;
--Testcase 405:
create foreign table a2 (
code char OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 406:
create foreign table b2 (
a char OPTIONS (key 'true'),
num integer OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 407:
create foreign table c2 (
name char OPTIONS (key 'true'),
a char
) server sqlite_svr;
--Testcase 159:
insert into a2 (code) values ('p');
--Testcase 160:
insert into a2 (code) values ('q');
--Testcase 161:
insert into b2 (a, num) values ('p', 1);
--Testcase 162:
insert into b2 (a, num) values ('p', 2);
--Testcase 163:
insert into c2 (name, a) values ('A', 'p');
--Testcase 164:
insert into c2 (name, a) values ('B', 'q');
--Testcase 165:
insert into c2 (name, a) values ('C', null);
--Testcase 166:
select c2.name, ss.code, ss.b_cnt, ss.const
from c2 left join
(select a2.code, coalesce(b_grp.cnt, 0) as b_cnt, -1 as const
from a2 left join
(select count(1) as cnt, b2.a from b2 group by b2.a) as b_grp
on a2.code = b_grp.a
) as ss
on (c2.a = ss.code)
order by c2.name;
rollback;
--
-- test incorrect handling of placeholders that only appear in targetlists,
-- per bug #6154
--
--Testcase 408:
create foreign table sub_tbl (key1 int, key3 int, key5 int, key6 int, value1 int, id int options (key 'true')) server sqlite_svr;
--Testcase 409:
insert into sub_tbl values (1, 1, 1, 2, 42);
--Testcase 410:
SELECT * FROM
( SELECT key1 from sub_tbl) sub1
LEFT JOIN
( SELECT sub3.key3, sub4.value2, COALESCE(sub4.value2, 66) as value3 FROM
( SELECT key3 from sub_tbl) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl ) 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
--Testcase 411:
SELECT * FROM
( SELECT key1 from sub_tbl ) sub1
LEFT JOIN
( SELECT sub3.key3, value2, COALESCE(value2, 66) as value3 FROM
( SELECT key3 from sub_tbl ) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl ) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl) 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
--
--Testcase 167:
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;
--Testcase 168:
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
--
--Testcase 412:
create foreign table nt1 (
id int OPTIONS (key 'true'),
a1 boolean,
a2 boolean
) server sqlite_svr;
--Testcase 413:
create foreign table nt2 (
id int OPTIONS (key 'true'),
nt1_id int,
b1 boolean,
b2 boolean
) server sqlite_svr;
--Testcase 414:
create foreign table nt3 (
id int OPTIONS (key 'true'),
nt2_id int,
c1 boolean
) server sqlite_svr;
--Testcase 169:
insert into nt1 values (1,true,true);
--Testcase 170:
insert into nt1 values (2,true,false);
--Testcase 171:
insert into nt1 values (3,false,false);
--Testcase 172:
insert into nt2 values (1,1,true,true);
--Testcase 173:
insert into nt2 values (2,2,true,false);
--Testcase 174:
insert into nt2 values (3,3,false,false);
--Testcase 175:
insert into nt3 values (1,1,true);
--Testcase 176:
insert into nt3 values (2,2,false);
--Testcase 177:
insert into nt3 values (3,3,true);
--Testcase 178:
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;
--Testcase 179:
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
--
--Testcase 180:
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;
--Testcase 181:
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
--
--Testcase 514:
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;
--Testcase 515:
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
--
--Testcase 182:
select * from int4_tbl a full join int4_tbl b on true;
--Testcase 183:
select * from int4_tbl a full join int4_tbl b on false;
--
-- test for ability to use a cartesian join when necessary
--
--Testcase 415:
create foreign table q1(i int) server sqlite_svr;
--Testcase 416:
insert into q1 values (1);
--Testcase 417:
create foreign table q2(i int) server sqlite_svr;
--Testcase 418:
insert into q2 values (0);
--Testcase 184:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where q1.i = thousand or q2.i = thousand;
--Testcase 185:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where thousand = (q1.i + q2.i);
--
-- test ability to generate a suitable plan for a star-schema query
--
--Testcase 186:
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
--
--Testcase 187:
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;
--Testcase 188:
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
--Testcase 189:
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
--Testcase 419:
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;
--Testcase 420:
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
--Testcase 421:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
--Testcase 422:
select * from
(select key1 as x from sub_tbl as x) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
-- Test proper handling of appendrel PHVs during useless-RTE removal
--Testcase 516:
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;
--Testcase 517:
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
--
--Testcase 423:
create function f_immutable_int4(i integer) returns integer as
$$ begin return i; end; $$ language plpgsql immutable;
-- check optimization of function scan with join
--Testcase 424:
explain (costs off)
select unique1 from tenk1, (select * from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 425:
explain (verbose, costs off)
select unique1, x.*
from tenk1, (select *, random() from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 426:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = unique1;
--Testcase 427:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
--Testcase 538:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
--Testcase 428:
explain (costs off)
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
--Testcase 429:
explain (costs off)
select unique1, x from tenk1 left join f_immutable_int4(1) x on unique1 = x;
--Testcase 430:
explain (costs off)
select unique1, x from tenk1 right join f_immutable_int4(1) x on unique1 = x;
--Testcase 431:
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
--Testcase 432:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = 42;
-- test inlining of immutable functions with PlaceHolderVars
--Testcase 433:
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;
--Testcase 434:
drop function f_immutable_int4(int);
-- test inlining when function returns composite
--Testcase 435:
create function mki8(bigint, bigint) returns int8_tbl as
$$select row($1,$2)::int8_tbl$$ language sql;
--Testcase 436:
create function mki4(int) returns int4_tbl as
$$select row($1)::int4_tbl$$ language sql;
--Testcase 437:
explain (verbose, costs off)
select * from mki8(1,2);
--Testcase 438:
select * from mki8(1,2);
--Testcase 439:
explain (verbose, costs off)
select * from mki4(42);
--Testcase 440:
select * from mki4(42);
--Testcase 441:
drop function mki8(bigint, bigint);
--Testcase 442:
drop function mki4(int);
--
-- test extraction of restriction OR clauses from join OR clause
-- (we used to only do this for indexable clauses)
--
--Testcase 190:
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);
--Testcase 191:
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);
--Testcase 192:
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
--
--Testcase 193:
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;
--Testcase 194:
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;
--Testcase 195:
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;
--Testcase 196:
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;
--Testcase 197:
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;
--Testcase 198:
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;
--Testcase 199:
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;
--Testcase 200:
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;
--Testcase 201:
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;
--Testcase 202:
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
--
--Testcase 203:
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);
--Testcase 204:
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);
--Testcase 205:
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;
--Testcase 206:
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)
--
--Testcase 207:
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;
--Testcase 208:
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
--
--Testcase 209:
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);
--Testcase 210:
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
--
--Testcase 443:
create foreign table text_tbl(f1 text) server sqlite_svr;
--Testcase 211:
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);
--Testcase 212:
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);
--Testcase 213:
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);
--Testcase 214:
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);
--Testcase 215:
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);
--Testcase 216:
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);
--Testcase 217:
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;
--Testcase 218:
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
--
--Testcase 219:
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;
--Testcase 220:
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;
--Testcase 221:
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;
--Testcase 222:
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;
--Testcase 223:
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;
--Testcase 224:
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
--
--Testcase 225:
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;
--Testcase 226:
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)
--
--Testcase 227:
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));
--Testcase 228:
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
--
--Testcase 229:
explain (costs off)
select * from int4_tbl a left join tenk1 b on f1 = unique2 where f1 = 0;
--Testcase 230:
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
--
--Testcase 518:
set enable_hashjoin to off;
--Testcase 519:
set enable_nestloop to off;
--Testcase 231:
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;
--Testcase 232:
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;
--Testcase 520:
reset enable_hashjoin;
--Testcase 521:
reset enable_nestloop;
--
-- test join removal
--
begin;
--Testcase 444:
CREATE FOREIGN TABLE a3 (id int OPTIONS (key 'true'), b_id int) SERVER sqlite_svr;
--Testcase 445:
CREATE FOREIGN TABLE b3 (id int OPTIONS (key 'true'), c_id int) SERVER sqlite_svr;
--Testcase 446:
CREATE FOREIGN TABLE c3 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 447:
CREATE FOREIGN TABLE d3 (a int, b int) SERVER sqlite_svr;
--Testcase 233:
INSERT INTO a3 VALUES (0, 0), (1, NULL);
--Testcase 234:
INSERT INTO b3 VALUES (0, 0), (1, NULL);
--Testcase 235:
INSERT INTO c3 VALUES (0), (1);
--Testcase 236:
INSERT INTO d3 VALUES (1,3), (2,2), (3,1);
-- all three cases should be optimizable into a3 simple seqscan
--Testcase 237:
explain (costs off) SELECT a3.* FROM a3 LEFT JOIN b3 ON a3.b_id = b3.id;
--Testcase 238:
explain (costs off) SELECT b3.* FROM b3 LEFT JOIN c3 ON b3.c_id = c3.id;
--Testcase 239:
explain (costs off)
SELECT a3.* FROM a3 LEFT JOIN (b3 left join c3 on b3.c_id = c3.id)
ON (a3.b_id = b3.id);
-- check optimization of outer join within another special join
--Testcase 240:
explain (costs off)
select id from a3 where id in (
select b3.id from b3 left join c3 on b3.id = c3.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
--Testcase 241:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id and d3.b = s.c_id;
-- similarly, but keying off a DISTINCT clause
--Testcase 242:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id and d3.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 b3.id is a
-- primary key and so drop b3.c_id from the GROUP BY of the resulting plan;
-- but this happens too late for join removal in the outer plan level.)
--Testcase 243:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id;
-- similarly, but keying off a DISTINCT clause
--Testcase 244:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id;
-- check join removal works when uniqueness of the join condition is enforced
-- by a UNION
--Testcase 245:
explain (costs off)
select d3.* from d3 left join (select id from a3 union select id from b3) s
on d3.a = s.id;
-- check join removal with a cross-type comparison operator
--Testcase 246:
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
--Testcase 247:
explain (costs off)
select 1 from (select a3.id FROM a3 left join b3 on a3.b_id = b3.id) q,
lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
rollback;
--Testcase 448:
create foreign table parent (k int options (key 'true'), pd int) server sqlite_svr;
--Testcase 449:
create foreign table child (k int options (key 'true'), cd int) server sqlite_svr;
--Testcase 248:
insert into parent values (1, 10), (2, 20), (3, 30);
--Testcase 249:
insert into child values (1, 100), (4, 400);
-- this case is optimizable
--Testcase 250:
select p.* from parent p left join child c on (p.k = c.k);
--Testcase 251:
explain (costs off)
select p.* from parent p left join child c on (p.k = c.k);
-- this case is not
--Testcase 252:
select p.*, linked from parent p
left join (select c.*, true as linked from child c) as ss
on (p.k = ss.k);
--Testcase 253:
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
--Testcase 254:
select p.* from
parent p left join child c on (p.k = c.k)
where p.k = 1 and p.k = 2;
--Testcase 255:
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;
--Testcase 256:
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;
--Testcase 257:
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;
--Testcase 450:
CREATE FOREIGN TABLE a4 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 451:
CREATE FOREIGN TABLE b4 (id int OPTIONS (key 'true'), a_id int) SERVER sqlite_svr;
--Testcase 258:
INSERT INTO a4 VALUES (0), (1);
--Testcase 259:
INSERT INTO b4 VALUES (0, 0), (1, NULL);
--Testcase 260:
SELECT * FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
--Testcase 261:
SELECT b4.* FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
rollback;
-- another join removal bug: this is not optimizable, either
begin;
--Testcase 452:
create foreign table innertab (id int8 options (key 'true'), dat1 int8) server sqlite_svr;
--Testcase 262:
insert into innertab values(123, 42);
--Testcase 263:
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;
--Testcase 453:
create foreign table uniquetbl (f1 text) server sqlite_svr;
--Testcase 264:
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;
--Testcase 265:
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;
--Testcase 266:
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
--Testcase 522:
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;
--Testcase 523:
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
--Testcase 267:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; -- error
--Testcase 268:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; -- error
--Testcase 269:
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
--
--Testcase 270:
select t1.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t1" suggestion
--Testcase 271:
select t2.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t2" suggestion
--Testcase 272:
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
--
--Testcase 454:
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
--
--Testcase 273:
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 274:
explain (costs off)
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 275:
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 276:
explain (costs off)
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 277:
explain (costs off)
select unique2, x.*
from int4_tbl x cross join lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 278:
select unique2, x.*
from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true;
--Testcase 279:
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
--Testcase 280:
select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl;
--Testcase 281:
select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl;
-- lateral with function in FROM
--Testcase 282:
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 283:
explain (costs off)
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 284:
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
--Testcase 285:
explain (costs off)
select count(*) from tenk1 a, generate_series(1,two) g;
-- lateral with UNION ALL subselect
--Testcase 286:
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;
--Testcase 287:
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
--Testcase 288:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x;
--Testcase 289:
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
--Testcase 290:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x;
--Testcase 291:
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
--Testcase 292:
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;
--Testcase 293:
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
--Testcase 294:
select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (select x) ss2(y);
--Testcase 295:
select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (values(x)) ss2(y);
--Testcase 296:
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
--Testcase 297:
select * from (values(1)) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 298:
select * from (select f1/1000000000 from int4_tbl) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 299:
select * from (values(1)) x(lb),
lateral (values(lb)) y(lbcopy);
--Testcase 300:
select * from (values(1)) x(lb),
lateral (select lb from int4_tbl) y(lbcopy);
--Testcase 301:
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);
--Testcase 302:
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);
--Testcase 303:
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);
--Testcase 304:
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);
--Testcase 305:
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);
--Testcase 307:
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);
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 455:
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;
--Testcase 456:
select * from
int8_tbl a left join
lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1;
--Testcase 457:
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;
--Testcase 458:
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
--Testcase 308:
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;
--Testcase 309:
select * from int4_tbl i left join
lateral (select * from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 310:
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;
--Testcase 311:
select * from int4_tbl i left join
lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 312:
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;
--Testcase 313:
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
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 459:
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;
--Testcase 460:
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
--Testcase 461:
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
--Testcase 462:
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)
--Testcase 463:
delete from sub_tbl;
--Testcase 464:
insert into sub_tbl values (1, 2, 3, 4, 5);
--Testcase 465:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl offset 0) x cross join (select key3 as y from sub_tbl offset 0) y
left join lateral (
select * from (select key5 as z from sub_tbl offset 0) z where z.z = x.x
) zz on zz.z = y.y;
-- check dummy rels with lateral references (bug #15694)
--Testcase 466:
explain (verbose, costs off)
select * from int8_tbl i8 left join lateral
(select *, i8.q2 from int4_tbl where false) ss on true;
--Testcase 467:
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
--Testcase 468:
select * from
((select key3 as v from sub_tbl) union all (select key5 as v from sub_tbl)) as q1
cross join lateral
((select * from
((select key6 as v from sub_tbl) union all (select value1 as v from sub_tbl)) as q3)
union all
(select q1.v)
) as q2;
-- check the number of columns specified
--Testcase 539:
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
--Testcase 314:
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;
--Testcase 315:
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)
--Testcase 316:
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;
--Testcase 317:
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
--Testcase 318:
select f1,g from int4_tbl a, (select f1 as g) ss;
--Testcase 319:
select f1,g from int4_tbl a, (select a.f1 as g) ss;
--Testcase 320:
select f1,g from int4_tbl a cross join (select f1 as g) ss;
--Testcase 321:
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
--Testcase 322:
select f1,g from int4_tbl a right join lateral generate_series(0, a.f1) g on true;
--Testcase 323:
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
--Testcase 324:
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
--Testcase 325:
select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss;
-- check behavior of LATERAL in UPDATE/DELETE
--Testcase 469:
create temp table xx1 as select f1 as x1, -f1 as x2 from int4_tbl;
-- error, can't do this:
--Testcase 326:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss;
--Testcase 327:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss;
-- can't do it even with LATERAL:
--Testcase 328:
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:
--Testcase 329:
update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1) ss;
-- also errors:
--Testcase 330:
delete from xx1 using (select * from int4_tbl where f1 = x1) ss;
--Testcase 331:
delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss;
--Testcase 332:
delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
-- Skip this test, sqlite fdw does not support to create partition table
-- 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;
--Testcase 524:
create table fkest (x integer, x10 integer, x10b integer, x100 integer);
--Testcase 525:
insert into fkest select x, x/10, x/10, x/100 from generate_series(1,1000) x;
--Testcase 526:
create unique index on fkest(x, x10, x100);
analyze fkest;
--Testcase 527:
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;
--Testcase 528:
alter table fkest add constraint fk
foreign key (x, x10b, x100) references fkest (x, x10, x100);
--Testcase 529:
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;
--Testcase 470:
create foreign table fkest (a int options (key 'true'), b int options (key 'true'), c int) server sqlite_svr;
--Testcase 471:
create foreign table fkest1 (a int options (key 'true'), b int options (key 'true')) server sqlite_svr;
--Testcase 333:
insert into fkest select x/10, x%10, x from generate_series(1,1000) x;
--Testcase 334:
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;
--Testcase 335:
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
--
--Testcase 472:
create foreign table j11 (id int options (key 'true')) server sqlite_svr;
--Testcase 473:
create foreign table j21 (id int options (key 'true')) server sqlite_svr;
--Testcase 474:
create foreign table j31 (id int) server sqlite_svr;
--Testcase 336:
insert into j11 values(1),(2),(3);
--Testcase 337:
insert into j21 values(1),(2),(3);
--Testcase 338:
insert into j31 values(1),(1);
-- ensure join is properly marked as unique
--Testcase 339:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id = j21.id;
-- ensure join is not unique when not an equi-join
--Testcase 340:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id > j21.id;
-- ensure non-unique rel is not chosen as inner
--Testcase 341:
explain (verbose, costs off)
select * from j11 inner join j31 on j11.id = j31.id;
-- ensure left join is marked as unique
--Testcase 342:
explain (verbose, costs off)
select * from j11 left join j21 on j11.id = j21.id;
-- ensure right join is marked as unique
--Testcase 343:
explain (verbose, costs off)
select * from j11 right join j21 on j11.id = j21.id;
-- ensure full join is marked as unique
--Testcase 344:
explain (verbose, costs off)
select * from j11 full join j21 on j11.id = j21.id;
-- a clauseless (cross) join can't be unique
--Testcase 345:
explain (verbose, costs off)
select * from j11 cross join j21;
-- ensure a natural join is marked as unique
--Testcase 346:
explain (verbose, costs off)
select * from j11 natural join j21;
-- ensure a distinct clause allows the inner to become unique
--Testcase 347:
explain (verbose, costs off)
select * from j11
inner join (select distinct id from j31) j31 on j11.id = j31.id;
-- ensure group by clause allows the inner to become unique
--Testcase 348:
explain (verbose, costs off)
select * from j11
inner join (select id from j31 group by id) j31 on j11.id = j31.id;
--drop table j1;
--drop table j2;
--drop table j3;
-- test more complex permutations of unique joins
--Testcase 475:
create foreign table j12 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 476:
create foreign table j22 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 477:
create foreign table j32 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 349:
insert into j12 values(1,1),(1,2);
--Testcase 350:
insert into j22 values(1,1);
--Testcase 351:
insert into j32 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
--Testcase 352:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1;
-- ensure proper unique detection with multiple join quals
--Testcase 353:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2;
-- ensure we don't detect the join to be unique when quals are not part of the
-- join condition
--Testcase 354:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 where j12.id2 = 1;
-- as above, but for left joins.
--Testcase 355:
explain (verbose, costs off)
select * from j12
left join j22 on j12.id1 = j22.id1 where j12.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.
--Testcase 530:
set enable_nestloop to 0;
--Testcase 531:
set enable_hashjoin to 0;
--Testcase 532:
set enable_sort to 0;
-- skip, cannot create index on foreign table
-- 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
--Testcase 478:
insert into j22 values(1,2);
--analyze j2;
--Testcase 356:
explain (costs off) select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
--Testcase 357:
select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
-- Exercise array keys mark/restore B-Tree code
--Testcase 479:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
--Testcase 480:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
-- Exercise array keys "find extreme element" B-Tree code
--Testcase 481:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 482:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 533:
reset enable_nestloop;
--Testcase 534:
reset enable_hashjoin;
--Testcase 535:
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
--Testcase 483:
CREATE FOREIGN TABLE onek (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 358:
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
--Testcase 484:
create table j3 as select unique1, tenthous from onek;
vacuum analyze j3;
--Testcase 485:
create unique index on j3(unique1, tenthous);
--Testcase 359:
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;
--Testcase 486:
drop table j3;
--Testcase 560:
DELETE FROM INT4_TBL;
--Testcase 561:
DELETE FROM INT8_TBL;
--Testcase 562:
DELETE FROM FLOAT8_TBL;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 487:
DROP SERVER sqlite_svr;
--Testcase 488:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/limit.sql
================================================
--
-- LIMIT
-- Check the LIMIT/OFFSET feature of SELECT
--
--Testcase 27:
CREATE EXTENSION sqlite_fdw;
--Testcase 28:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 29:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 30:
CREATE FOREIGN TABLE int8_tbl(q1 int8 OPTIONS (key 'true'), q2 int8) SERVER sqlite_svr;
--Testcase 105:
INSERT INTO int8_tbl VALUES(' 123 ',' 456');
--Testcase 106:
INSERT INTO int8_tbl VALUES('123 ','4567890123456789');
--Testcase 107:
INSERT INTO int8_tbl VALUES('4567890123456789','123');
--Testcase 108:
INSERT INTO int8_tbl VALUES(+4567890123456789,'4567890123456789');
--Testcase 109:
INSERT INTO int8_tbl VALUES('+4567890123456789','-4567890123456789');
--Testcase 31:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 32:
CREATE FOREIGN TABLE tenk1 (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 88:
CREATE TABLE parent_table (
unique1 int4 PRIMARY KEY,
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
);
--Testcase 89:
CREATE FOREIGN table inherited_table ()
INHERITS (parent_table)
SERVER sqlite_svr options (table 'tenk1');
--Testcase 1:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
ORDER BY unique1 LIMIT 2;
--Testcase 2:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60
ORDER BY unique1 LIMIT 5;
--Testcase 3:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60 AND unique1 < 63
ORDER BY unique1 LIMIT 5;
--Testcase 4:
SELECT ''::text AS three, unique1, unique2, stringu1
FROM onek WHERE unique1 > 100
ORDER BY unique1 LIMIT 3 OFFSET 20;
--Testcase 5:
SELECT ''::text AS zero, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 8 OFFSET 99;
--Testcase 6:
SELECT ''::text AS eleven, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 20 OFFSET 39;
--Testcase 7:
SELECT ''::text AS ten, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990;
--Testcase 8:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990 LIMIT 5;
--Testcase 9:
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:
--Testcase 10:
select * from int8_tbl limit (case when random() < 0.5 then null::bigint end);
--Testcase 11:
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
begin;
declare c1 scroll cursor for select * from int8_tbl order by q1 limit 10;
--Testcase 12:
fetch all in c1;
--Testcase 13:
fetch 1 in c1;
--Testcase 14:
fetch backward 1 in c1;
--Testcase 33:
fetch backward all in c1;
--Testcase 34:
fetch backward 1 in c1;
--Testcase 35:
fetch all in c1;
declare c2 scroll cursor for select * from int8_tbl limit 3;
--Testcase 36:
fetch all in c2;
--Testcase 37:
fetch 1 in c2;
--Testcase 38:
fetch backward 1 in c2;
--Testcase 39:
fetch backward all in c2;
--Testcase 40:
fetch backward 1 in c2;
--Testcase 41:
fetch all in c2;
declare c3 scroll cursor for select * from int8_tbl offset 3;
--Testcase 42:
fetch all in c3;
--Testcase 43:
fetch 1 in c3;
--Testcase 44:
fetch backward 1 in c3;
--Testcase 45:
fetch backward all in c3;
--Testcase 46:
fetch backward 1 in c3;
--Testcase 47:
fetch all in c3;
declare c4 scroll cursor for select * from int8_tbl offset 10;
--Testcase 48:
fetch all in c4;
--Testcase 49:
fetch 1 in c4;
--Testcase 50:
fetch backward 1 in c4;
--Testcase 51:
fetch backward all in c4;
--Testcase 52:
fetch backward 1 in c4;
--Testcase 53:
fetch all in c4;
declare c5 scroll cursor for select * from int8_tbl order by q1 fetch first 2 rows with ties;
--Testcase 54:
fetch all in c5;
--Testcase 55:
fetch 1 in c5;
--Testcase 56:
fetch backward 1 in c5;
--Testcase 57:
fetch backward 1 in c5;
--Testcase 58:
fetch all in c5;
--Testcase 59:
fetch backward all in c5;
--Testcase 60:
fetch all in c5;
--Testcase 61:
fetch backward all in c5;
rollback;
-- Stress test for variable LIMIT in conjunction with bounded-heap sorting
--Testcase 62:
DELETE FROM INT8_TMP;
--Testcase 63:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series(1,10) q1;
--Testcase 64:
SELECT
(SELECT s.q1
FROM (VALUES (1)) AS x,
(SELECT q1 FROM INT8_TMP as n
ORDER BY q1 LIMIT 1 OFFSET s.q1-1) AS y) AS z
FROM INT8_TMP AS s;
--
-- Test behavior of volatile and set-returning functions in conjunction
-- with ORDER BY and LIMIT.
--
--Testcase 65:
create temp sequence testseq;
--Testcase 15:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 16:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 90:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 91:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 17:
select currval('testseq');
--Testcase 92:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 93:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 94:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 95:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 96:
select currval('testseq');
--Testcase 18:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 19:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 97:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 98:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 20:
select currval('testseq');
-- test for limit and offset when querying table and foreign table inherited
--Testcase 99:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
--Testcase 100:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
-- when querying regular tables with inherited tables, only limit is pushed-down when no offset is specified
--Testcase 101:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 102:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 103:
select currval('testseq');
--Testcase 21:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 22:
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 23:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by tenthous limit 7;
--Testcase 24:
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
--Testcase 66:
DELETE FROM INT8_TMP;
--Testcase 67:
INSERT INTO INT8_TMP VALUES (generate_series(0,2), generate_series((random()*.1)::int,2));
--Testcase 68:
explain (verbose, costs off)
select q1, q2 from int8_tmp;
--Testcase 69:
select q1, q2 from int8_tmp;
--Testcase 70:
explain (verbose, costs off)
select q1, q2 from int8_tmp order by q2 desc;
--Testcase 71:
select q1, q2 from int8_tmp order by q2 desc;
-- test for failure to set all aggregates' aggtranstype
--Testcase 25:
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;
--Testcase 26:
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
--
--Testcase 72:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW WITH TIES;
--Testcase 73:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST ROWS WITH TIES;
--Testcase 74:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES;
--Testcase 75:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW ONLY;
-- SKIP LOCKED and WITH TIES are incompatible
--Testcase 104:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES FOR UPDATE SKIP LOCKED;
-- should fail
--Testcase 76:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
FETCH FIRST 2 ROW WITH TIES;
-- test ruleutils
--Testcase 77:
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;
--Testcase 78:
\d+ limit_thousand_v_1
--Testcase 79:
CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY;
--Testcase 80:
\d+ limit_thousand_v_2
--Testcase 81:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS WITH TIES; -- fails
--Testcase 82:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES;
--Testcase 83:
\d+ limit_thousand_v_3
--Testcase 84:
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
--Testcase 85:
\d+ limit_thousand_v_4
-- leave these views
--Testcase 110:
DELETE FROM int8_tbl;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 86:
DROP SERVER sqlite_svr;
--Testcase 87:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/prepare.sql
================================================
-- Regression tests for prepareable statements. We query the content
-- of the pg_prepared_statements view as prepared statements are
-- created and removed.
--Testcase 26:
CREATE EXTENSION sqlite_fdw;
--Testcase 27:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 28:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 29:
CREATE FOREIGN TABLE road (
name text,
thepath path
) SERVER sqlite_svr;
--Testcase 30:
create foreign table road_tmp (a int, b int, id int options (key 'true')) server sqlite_svr;
--Testcase 31:
insert into road_tmp values (1, 2);
--Testcase 1:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
--Testcase 2:
PREPARE q1 AS SELECT a FROM road_tmp;
--Testcase 3:
EXECUTE q1;
--Testcase 4:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- should fail
--Testcase 5:
PREPARE q1 AS SELECT b FROM road_tmp;
-- should succeed
DEALLOCATE q1;
--Testcase 6:
PREPARE q1 AS SELECT b FROM road_tmp;
--Testcase 7:
EXECUTE q1;
--Testcase 8:
PREPARE q2 AS SELECT b FROM road_tmp;
--Testcase 9:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- sql92 syntax
DEALLOCATE PREPARE q1;
--Testcase 10:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
DEALLOCATE PREPARE q2;
-- the view should return the empty set again
--Testcase 11:
SELECT name, statement, parameter_types FROM pg_prepared_statements;
-- parameterized queries
--Testcase 12:
PREPARE q2(text) AS
SELECT datname, datistemplate, datallowconn
FROM pg_database WHERE datname = $1;
--Testcase 13:
EXECUTE q2('postgres');
--Testcase 14:
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;
--Testcase 15:
EXECUTE q3('AAAAxx', 5::smallint, 10.5::float, false, 4::bigint);
-- too few params
--Testcase 16:
EXECUTE q3('bool');
-- too many params
--Testcase 17:
EXECUTE q3('bytea', 5::smallint, 10.5::float, false, 4::bigint, true);
-- wrong param types
--Testcase 18:
EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'bytea');
-- invalid type
--Testcase 19:
PREPARE q4(nonexistenttype) AS SELECT * FROM road WHERE name = $1;
-- create table as execute
--Testcase 20:
PREPARE q5(int, text) AS
SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
ORDER BY unique1;
--Testcase 32:
CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA');
--Testcase 21:
SELECT * FROM q5_prep_results;
--Testcase 33:
CREATE TEMPORARY TABLE q5_prep_nodata AS EXECUTE q5(200, 'DTAAAA')
WITH NO DATA;
--Testcase 34:
SELECT * FROM q5_prep_nodata;
-- unknown or unspecified parameter types: should succeed
--Testcase 22:
PREPARE q6 AS
SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
--Testcase 23:
PREPARE q7(unknown) AS
SELECT * FROM road WHERE thepath = $1;
--Testcase 24:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
-- test DEALLOCATE ALL;
DEALLOCATE ALL;
--Testcase 25:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
--Testcase 35:
DROP FOREIGN TABLE tenk1;
--Testcase 36:
DROP FOREIGN TABLE road;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/select.sql
================================================
--
-- SELECT
--
--Testcase 43:
CREATE EXTENSION sqlite_fdw;
--Testcase 44:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 45:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 46:
CREATE FOREIGN TABLE onek2 (
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
) SERVER sqlite_svr;
--Testcase 47:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 73:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 74:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 75:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 76:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 77:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 48:
CREATE FOREIGN TABLE person (
name text,
age int4,
location point
) SERVER sqlite_svr;
-- btree index
-- awk '{if($1<10){print;}else{next;}}' onek.data | sort +0n -1
--
--Testcase 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
--
--Testcase 2:
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
--
--Testcase 3:
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
--
--Testcase 4:
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
--
--Testcase 5:
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
--
--Testcase 6:
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
--
--Testcase 7:
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
--
--Testcase 8:
SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10 order by onek2.unique1;
--
-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1
--
--Testcase 9:
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
--
--Testcase 10:
SELECT onek2.unique1, onek2.stringu1 FROM onek2
WHERE onek2.unique1 > 980 ORDER BY onek2.unique1;
RESET enable_seqscan;
RESET enable_bitmapscan;
RESET enable_sort;
--
-- 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
--Testcase 12:
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
--
--Testcase 13:
SELECT p.name, p.age FROM person* p ORDER BY age using >, name;
--
-- Test some cases involving whole-row Var referencing a subquery
--
--Testcase 49:
select foo from (select 1 offset 0) as foo;
--Testcase 50:
select foo from (select null offset 0) as foo;
--Testcase 51:
select foo from (select 'xyzzy',1,null offset 0) as foo;
--
-- Test VALUES lists
--
--Testcase 14:
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 :-)
--Testcase 15:
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
--Testcase 16:
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
--Testcase 17:
VALUES (1,2), (3,4+4), (7,77.7);
--Testcase 52:
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
--
--Testcase 53:
CREATE FOREIGN TABLE foo (f1 int options (key 'true')) SERVER sqlite_svr;
--Testcase 18:
INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1);
--Testcase 19:
SELECT * FROM foo ORDER BY f1;
--Testcase 20:
SELECT * FROM foo ORDER BY f1 ASC; -- same thing
--Testcase 21:
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
--Testcase 22:
SELECT * FROM foo ORDER BY f1 DESC;
--Testcase 23:
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
-- Skip, cannot create index on foreign table
-- 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
--Testcase 24:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 25:
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- actually run the query with an analyze to use the partial index
--Testcase 54:
explain (costs off, analyze on, timing off, summary off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 27:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 28:
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- partial index predicate implies clause, so no need for retest
--Testcase 29:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 30:
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 31:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 32:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
-- but if it's an update target, must retest anyway
--Testcase 33:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
--Testcase 34:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
-- partial index is not applicable
--Testcase 35:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'C';
--Testcase 36:
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;
--Testcase 37:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 38:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
RESET enable_indexscan;
-- check multi-index cases too
--Testcase 39:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 40:
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 41:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 and stringu1 < 'B') or unique1 = 0;
--Testcase 42:
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
--Testcase 55:
SELECT 1 AS x ORDER BY x;
-- But ORDER BY on a set-valued expression does
--Testcase 56:
create function sillysrf(int) returns setof int as
'values (1),(10),(2),($1)' language sql immutable;
--Testcase 57:
select sillysrf(42);
--Testcase 58:
select sillysrf(-1) order by 1;
--Testcase 59:
drop function sillysrf(int);
-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict
-- (see bug #5084)
--Testcase 60:
select * from (values (2),(null),(1)) v(k) where k = k order by k;
--Testcase 61:
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.
--Testcase 62:
create table list_parted_tbl (a int,b int) partition by list (a);
--Testcase 63:
create table list_parted_tbl1 partition of list_parted_tbl
for values in (1) partition by list(b);
--Testcase 64:
explain (costs off) select * from list_parted_tbl;
--Testcase 65:
drop table list_parted_tbl;
--Testcase 78:
DELETE FROM INT8_TBL;
--Testcase 66:
DROP FOREIGN TABLE onek;
--Testcase 67:
DROP FOREIGN TABLE onek2;
--Testcase 68:
DROP FOREIGN TABLE int8_tbl;
--Testcase 69:
DROP FOREIGN TABLE person;
--Testcase 70:
DROP FOREIGN TABLE foo;
--Testcase 71:
DROP SERVER sqlite_svr;
--Testcase 72:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/select_having.sql
================================================
--
-- SELECT_HAVING
--
--Testcase 22:
CREATE EXTENSION sqlite_fdw;
--Testcase 23:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 24:
CREATE FOREIGN TABLE test_having(a int OPTIONS (key 'true'), b int, c char(8), d char) SERVER sqlite_svr;
-- load test data
--Testcase 1:
INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A');
--Testcase 2:
INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b');
--Testcase 3:
INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c');
--Testcase 4:
INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D');
--Testcase 5:
INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e');
--Testcase 6:
INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F');
--Testcase 7:
INSERT INTO test_having VALUES (6, 4, 'cccc', 'g');
--Testcase 8:
INSERT INTO test_having VALUES (7, 4, 'cccc', 'h');
--Testcase 9:
INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I');
--Testcase 10:
INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j');
--Testcase 11:
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
--Testcase 12:
SELECT b, c FROM test_having
GROUP BY b, c HAVING b = 3 ORDER BY b, c collate "en_US.utf8";
--Testcase 13:
SELECT lower(c), count(c) FROM test_having
GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY lower(c);
--Testcase 14:
SELECT c, max(a) FROM test_having
GROUP BY c HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY c collate "en_US.utf8";
-- test degenerate cases involving HAVING without GROUP BY
-- Per SQL spec, these should generate 0 or 1 row, even without aggregates
--Testcase 15:
SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a);
--Testcase 16:
SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a);
-- errors: ungrouped column references
--Testcase 17:
SELECT a FROM test_having HAVING min(a) < max(a);
--Testcase 18:
SELECT 1 AS one FROM test_having HAVING a > 1;
-- the really degenerate case: need not scan table at all
--Testcase 19:
SELECT 1 AS one FROM test_having HAVING 1 > 2;
--Testcase 20:
SELECT 1 AS one FROM test_having HAVING 1 < 2;
-- and just to prove that we aren't scanning the table:
--Testcase 21:
SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2;
--Testcase 25:
DROP FOREIGN TABLE test_having;
--Testcase 26:
DROP SERVER sqlite_svr;
--Testcase 27:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/sqlite_fdw_post.sql
================================================
-- ===================================================================
-- create FDW objects
-- ===================================================================
--Testcase 483:
CREATE EXTENSION sqlite_fdw;
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr2 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr3 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- SQLite FDW does not need User and User Mapping.
--Testcase 484:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 485:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 756:
-- CREATE USER MAPPING FOR public SERVER sqlite_svr3;
-- ===================================================================
-- create objects used through FDW sqlite server
-- ===================================================================
--Testcase 486:
CREATE SCHEMA "S 1";
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO "S 1";
--Testcase 1:
INSERT INTO "S 1"."T 1"
SELECT id,
id % 10,
to_char(id, 'FM00000'),
'1970-01-01'::timestamptz + ((id % 100) || ' days')::interval,
'1970-01-01'::timestamp + ((id % 100) || ' days')::interval,
id % 10,
id % 10,
'foo'
FROM generate_series(1, 1000) id;
--Testcase 2:
INSERT INTO "S 1"."T 2"
SELECT id,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 3:
INSERT INTO "S 1"."T 3"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 487:
DELETE FROM "S 1"."T 3" WHERE c1 % 2 != 0; -- delete for outer join tests
--Testcase 4:
INSERT INTO "S 1"."T 4"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 488:
DELETE FROM "S 1"."T 4" WHERE c1 % 3 != 0; -- delete for outer join tests
/*ANALYZE "S 1"."T 1";
ANALYZE "S 1"."T 2";
ANALYZE "S 1"."T 3";
ANALYZE "S 1"."T 4";*/
-- ===================================================================
-- create foreign tables
-- ===================================================================
--Testcase 489:
CREATE FOREIGN TABLE ft1 (
c0 int,
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr;
--Testcase 757:
ALTER FOREIGN TABLE ft1 DROP COLUMN c0;
--Testcase 490:
CREATE FOREIGN TABLE ft2 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
cx int,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft2',
c8 text
) SERVER sqlite_svr;
--Testcase 758:
ALTER FOREIGN TABLE ft2 DROP COLUMN cx;
--Testcase 491:
CREATE FOREIGN TABLE ft4 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 3');
--Testcase 492:
CREATE FOREIGN TABLE ft5 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 4');
--Testcase 493:
CREATE FOREIGN TABLE ft6 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr2 OPTIONS (table 'T 4');
--Testcase 759:
CREATE FOREIGN TABLE ft7 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr3 OPTIONS (table 'T 4');
--Testcase 760:
ALTER FOREIGN TABLE ft1 OPTIONS (table 'T 1');
--Testcase 761:
ALTER FOREIGN TABLE ft2 OPTIONS (table 'T 1');
--Testcase 762:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 763:
ALTER FOREIGN TABLE ft2 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 5:
\det+
-- Test that alteration of server options causes reconnection
-- Remote's errors might be non-English, so hide them to ensure stable results
\set VERBOSITY terse
--Testcase 6:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work
--Testcase 764:
ALTER SERVER sqlite_svr OPTIONS (SET database 'no such database');
--Testcase 7:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should fail
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_svr
OPTIONS (SET database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
--Testcase 8:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work again
\set VERBOSITY default
-- Now we should be able to run ANALYZE.
-- To exercise multiple code paths, we use local stats on ft1
-- and remote-estimate mode on ft2.
--ANALYZE ft1;
--ALTER FOREIGN TABLE ft2 OPTIONS (use_remote_estimate 'true');
-- ===================================================================
-- test error case for create publication on foreign table
-- ===================================================================
--Testcase 955:
CREATE PUBLICATION testpub_ftbl FOR TABLE ft1; -- should fail
-- ===================================================================
-- simple queries
-- ===================================================================
-- single table without alias
--Testcase 9:
EXPLAIN (COSTS OFF) SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
--Testcase 10:
SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
-- single table with alias - also test that tableoid sort is not pushed to remote side
--Testcase 11:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
--Testcase 12:
SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
-- whole-row reference
--Testcase 13:
EXPLAIN (VERBOSE, COSTS OFF) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 14:
SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- empty result
--Testcase 15:
SELECT * FROM ft1 WHERE false;
-- with WHERE clause
--Testcase 16:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
--Testcase 17:
SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
-- with FOR UPDATE/SHARE
--Testcase 18:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 19:
SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 20:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
--Testcase 21:
SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
-- aggregate
--Testcase 22:
SELECT COUNT(*) FROM ft1 t1;
-- subquery
--Testcase 23:
SELECT * FROM ft1 t1 WHERE t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 <= 10) ORDER BY c1;
-- subquery+MAX
--Testcase 24:
SELECT * FROM ft1 t1 WHERE t1.c3 = (SELECT MAX(c3) FROM ft2 t2) ORDER BY c1;
-- used in CTE
--Testcase 25:
WITH t1 AS (SELECT * FROM ft1 WHERE c1 <= 10) SELECT t2.c1, t2.c2, t2.c3, t2.c4 FROM t1, ft2 t2 WHERE t1.c1 = t2.c1 ORDER BY t1.c1;
-- fixed values
--Testcase 26:
SELECT 'fixed', NULL FROM ft1 t1 WHERE c1 = 1;
-- Test forcing the remote server to produce sorted data for a merge join.
--Testcase 765:
SET enable_hashjoin TO false;
--Testcase 766:
SET enable_nestloop TO false;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 27:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 28:
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 29:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 30:
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- A join between local table and foreign join. ORDER BY clause is added to the
-- foreign join so that the local table can be joined using merge join strategy.
--Testcase 31:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 32:
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above, except that the full join prevents any equivalence
-- classes from being merged. This produces single relation equivalence classes
-- included in join restrictions.
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 34:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above with all full outer joins
--Testcase 35:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 36:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 767:
RESET enable_hashjoin;
--Testcase 768:
RESET enable_nestloop;
-- Test executing assertion in estimate_path_cost_size() that makes sure that
-- retrieved_rows for foreign rel re-used to cost pre-sorted foreign paths is
-- a sensible value even when the rel has tuples=0
-- CREATE TABLE loct_empty (c1 int NOT NULL, c2 text);
--Testcase 769:
CREATE FOREIGN TABLE ft_empty (c1 int NOT NULL, c2 text)
SERVER sqlite_svr OPTIONS (table 'loct_empty');
--Testcase 770:
INSERT INTO "S 1".loct_empty
SELECT id, 'AAA' || to_char(id, 'FM000') FROM generate_series(1, 100) id;
--Testcase 771:
DELETE FROM "S 1".loct_empty;
-- ANALYZE ft_empty;
--Testcase 772:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1;
-- ===================================================================
-- WHERE with remotely-executable conditions
-- ===================================================================
--Testcase 37:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 1; -- Var, OpExpr(b), Const
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = 0; -- BoolExpr
--Testcase 39:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NULL; -- NullTest
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NOT NULL; -- NullTest
--Testcase 41:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr
--Testcase 42:
--Testcase 956:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = -c1; -- OpExpr(l)
--Testcase 44:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE (c1 IS NOT NULL) IS DISTINCT FROM (c1 IS NOT NULL); -- DistinctExpr
--Testcase 45:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = ANY(ARRAY[c2, 1, c1 + 0]); -- ScalarArrayOpExpr
--Testcase 46:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = (ARRAY[c1,c2,3])[1]; -- SubscriptingRef
--Testcase 47:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c6 = E'foo''s\\bar'; -- check special chars
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c8 = 'foo'; -- can't be sent to remote
-- parameterized remote path for foreign table
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2;
--Testcase 50:
SELECT * FROM ft2 a, ft2 b WHERE a.c1 = 47 AND b.c1 = a.c2;
-- check both safe and unsafe join conditions
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
--Testcase 52:
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
-- bug before 9.3.5 due to sloppy handling of remote-estimate parameters
--Testcase 53:
SELECT * FROM ft1 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft2 WHERE c1 < 5));
--Testcase 54:
SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5));
-- we should not push order by clause with volatile expressions or unsafe
-- collations
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, random();
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C";
-- user-defined operator/function
--Testcase 494:
CREATE FUNCTION sqlite_fdw_abs(int) RETURNS int AS $$
BEGIN
RETURN abs($1);
END
$$ LANGUAGE plpgsql IMMUTABLE;
--Testcase 495:
CREATE OPERATOR === (
LEFTARG = int,
RIGHTARG = int,
PROCEDURE = int4eq,
COMMUTATOR = ===
);
-- built-in operators and functions can be shipped for remote execution
--Testcase 57:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 58:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 59:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 60:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
-- by default, user-defined ones cannot
--Testcase 61:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 62:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 63:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 64:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- ORDER BY can be shipped, though
--Testcase 496:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 497:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- but let's put them in an extension ...
--Testcase 773:
ALTER EXTENSION sqlite_fdw ADD FUNCTION sqlite_fdw_abs(int);
--Testcase 774:
ALTER EXTENSION sqlite_fdw ADD OPERATOR === (int, int);
--ALTER SERVER sqlite_svr2 OPTIONS (ADD extensions 'sqlite_fdw');
-- ... now they can be shipped
--Testcase 498:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 499:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 500:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 501:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- and both ORDER BY and LIMIT can be shipped
--Testcase 502:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 503:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- Test CASE pushdown
--Testcase 957:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1;
--Testcase 958:
SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1;
-- Nested CASE
--Testcase 959:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1,c2,c3 FROM ft2 WHERE CASE CASE WHEN c2 > 0 THEN c2 END WHEN 100 THEN 601 WHEN c2 THEN c2 ELSE 0 END > 600 ORDER BY c1;
--Testcase 960:
SELECT c1,c2,c3 FROM ft2 WHERE CASE CASE WHEN c2 > 0 THEN c2 END WHEN 100 THEN 601 WHEN c2 THEN c2 ELSE 0 END > 600 ORDER BY c1;
-- CASE arg WHEN
--Testcase 961:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- CASE cannot be pushed down because of unshippable arg clause
--Testcase 962:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c1 > (CASE random()::integer WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 963:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 964:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 965:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
-- check schema-qualification of regconfig constant
--Testcase 984:
CREATE TEXT SEARCH CONFIGURATION public.custom_search
(COPY = pg_catalog.english);
--Testcase 985:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
--Testcase 986:
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
-- ===================================================================
-- JOIN queries
-- ===================================================================
-- Analyze ft4 and ft5 so that we have better statistics. These tables do not
-- have use_remote_estimate set.
--ANALYZE ft4;
--ANALYZE ft5;
-- join two tables
--Testcase 65:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 66:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join three tables
--Testcase 67:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 68:
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
-- left outer join
--Testcase 69:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 70:
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- left outer join three tables
--Testcase 71:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 72:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- left outer join + placement of clauses.
-- clauses within the nullable side are not pulled up, but top level clause on
-- non-nullable side is pushed into non-nullable side
--Testcase 73:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
--Testcase 74:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
-- clauses within the nullable side are not pulled up, but the top level clause
-- on nullable side is not pushed down into nullable side
--Testcase 75:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
--Testcase 76:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
-- right outer join
--Testcase 77:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 78:
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
-- right outer join three tables
--Testcase 79:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 80:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- full outer join
--Testcase 81:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
--Testcase 82:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
-- full outer join with restrictions on the joining relations
-- a. the joining relations are both base relations
--Testcase 83:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 84:
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 85:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
--Testcase 86:
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
-- b. one of the joining relations is a base relation and the other is a join
-- relation
--Testcase 87:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 88:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- c. test deparsing the remote query as nested subqueries
--Testcase 89:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 90:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- d. test deparsing rowmarked relations as subqueries
--Testcase 91:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
--Testcase 92:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
-- full outer join + inner join
--Testcase 93:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
--Testcase 94:
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
-- full outer join three tables
--Testcase 95:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 96:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + right outer join
--Testcase 97:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 98:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- right outer join + full outer join
--Testcase 99:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 100:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + left outer join
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 102:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- left outer join + full outer join
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 104:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
--Testcase 775:
SET enable_memoize TO off;
-- right outer join + left outer join
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 106:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 776:
RESET enable_memoize;
-- left outer join + right outer join
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 108:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause, only matched rows
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 110:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause with shippable extensions set
--Testcase 504:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--ALTER SERVER sqlite_svr2 OPTIONS (DROP extensions);
-- full outer join + WHERE clause with shippable extensions not set
--Testcase 505:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--Testcase 777:
-- ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- join two tables with FOR UPDATE clause
-- tests whole-row reference for row marks
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 112:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
--Testcase 114:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
-- join two tables with FOR SHARE clause
--Testcase 115:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 116:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
--Testcase 118:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
-- join in CTE
--Testcase 119:
EXPLAIN (VERBOSE, COSTS OFF)
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
--Testcase 120:
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
-- ctid with whole-row reference
--Testcase 121:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- SEMI JOIN, not pushed down
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 123:
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- ANTI JOIN, not pushed down
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 125:
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- CROSS JOIN can be pushed down
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 127:
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- different server, not pushed down. No result expected.
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 129:
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe join conditions (c8 has a UDT), not pushed down. Practically a CROSS
-- JOIN since c8 in both tables has same value.
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 131:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe conditions on one side (c8 has a UDT), not pushed down.
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 133:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join where unsafe to pushdown condition in WHERE clause has a column not
-- in the SELECT clause. In this test unsafe clause needs to have column
-- references from both joining sides so that the clause is not pushed down
-- into one of the joining sides.
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 135:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- Aggregate after UNION, for testing setrefs
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
--Testcase 137:
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
-- join with lateral reference
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
--Testcase 139:
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
-- non-Var items in targetlist of the nullable rel of a join preventing
-- push-down in some cases
-- unable to push {ft1, ft2}
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
--Testcase 141:
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
-- ok to push {ft1, ft2} but not {ft1, ft2, ft4}
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
--Testcase 143:
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
-- join with nullable side with some columns with null values
--Testcase 144:
UPDATE ft5 SET c3 = null where c1 % 9 = 0;
--Testcase 145:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
--Testcase 146:
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
-- multi-way join involving multiple merge joins
-- (this case used to have EPQ-related planning problems)
--Testcase 506:
CREATE TABLE local_tbl (c1 int NOT NULL, c2 int NOT NULL, c3 text, CONSTRAINT local_tbl_pkey PRIMARY KEY (c1));
--Testcase 507:
INSERT INTO local_tbl SELECT id, id % 10, to_char(id, 'FM0000') FROM generate_series(1, 1000) id;
ANALYZE local_tbl;
--Testcase 778:
SET enable_nestloop TO false;
--Testcase 779:
SET enable_hashjoin TO false;
--Testcase 147:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 FOR UPDATE;
--Testcase 148:
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 ORDER BY ft1.c1 FOR UPDATE;
--Testcase 780:
RESET enable_nestloop;
--Testcase 781:
RESET enable_hashjoin;
-- test that add_paths_with_pathkeys_for_rel() arranges for the epq_path to
-- return columns needed by the parent ForeignScan node
-- This does not work as SQLite FDW does not support use_remote_estimate
--Testcase 987:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM local_tbl LEFT JOIN (SELECT ft1.*, COALESCE(ft1.c3 || ft2.c3, 'foobar') FROM ft1 INNER JOIN ft2 ON (ft1.c1 = ft2.c1 AND ft1.c1 < 100)) ss ON (local_tbl.c1 = ss.c1) ORDER BY local_tbl.c1 FOR UPDATE OF local_tbl;
-- ALTER SERVER loopback OPTIONS (DROP extensions);
-- ALTER SERVER loopback OPTIONS (ADD fdw_startup_cost '10000.0');
--Testcase 988:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM local_tbl LEFT JOIN (SELECT ft1.* FROM ft1 INNER JOIN ft2 ON (ft1.c1 = ft2.c1 AND ft1.c1 < 100 AND ft1.c1 = sqlite_fdw_abs(ft2.c2))) ss ON (local_tbl.c3 = ss.c3) ORDER BY local_tbl.c1 FOR UPDATE OF local_tbl;
-- ALTER SERVER loopback OPTIONS (DROP fdw_startup_cost);
-- ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
--DROP TABLE local_tbl;
-- check join pushdown in situations where multiple userids are involved
-- Although SQLite FDW does not need User and User mapping to connect to
-- the database file, however, JOIN pushdown is decided by the core code.
-- If outer and inner relation are foreign tables (or joins) belonging to
-- the same server and assigned to the same user, join will be pushed down.
-- Otherwise, join cannot be pushed down.
-- In addition to an exact match of userid, we allow the case where one side
-- has zero userid (implying current user) and the other side has explicit
-- userid that happens to equal the current user; but in that case, pushdown of
-- the join is only valid for the current user.
--Testcase 508:
CREATE ROLE regress_view_owner SUPERUSER;
--Testcase 509:
-- CREATE USER MAPPING FOR regress_view_owner SERVER sqlite_svr;
GRANT SELECT ON ft4 TO regress_view_owner;
GRANT SELECT ON ft5 TO regress_view_owner;
--Testcase 510:
CREATE VIEW v4 AS SELECT * FROM ft4;
--Testcase 511:
CREATE VIEW v5 AS SELECT * FROM ft5;
--Testcase 782:
ALTER VIEW v5 OWNER TO regress_view_owner;
--Testcase 149:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, different view owners
--Testcase 150:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 783:
ALTER VIEW v4 OWNER TO regress_view_owner;
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 152:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, view owner not current user
--Testcase 154:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 784:
ALTER VIEW v4 OWNER TO CURRENT_USER;
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 156:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 785:
ALTER VIEW v4 OWNER TO regress_view_owner;
-- cleanup
--Testcase 512:
DROP OWNED BY regress_view_owner;
--Testcase 513:
DROP ROLE regress_view_owner;
-- ===================================================================
-- Aggregate and grouping queries
-- ===================================================================
-- Simple aggregates
--Testcase 157:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 158:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 514:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
--Testcase 515:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
-- Aggregate is not pushed down as aggregation contains random()
--Testcase 159:
explain (verbose, costs off)
select sum(c1 * (random() <= 1)::int) as sum, avg(c1) from ft1;
-- Aggregate over join query
--Testcase 160:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
--Testcase 161:
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
-- Not pushed down due to local conditions present in underneath input rel
--Testcase 162:
explain (verbose, costs off)
select sum(t1.c1), count(t2.c1) from ft1 t1 inner join ft2 t2 on (t1.c1 = t2.c1) where ((t1.c1 * t2.c1)/(t1.c1 * t2.c1)) * random() <= 1;
-- GROUP BY clause having expressions
--Testcase 163:
explain (verbose, costs off)
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
--Testcase 164:
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
-- Aggregates in subquery are pushed down.
--Testcase 165:
explain (verbose, costs off)
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
--Testcase 166:
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
-- Aggregate is still pushed down by taking unshippable expression out
--Testcase 167:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
--Testcase 168:
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
-- Aggregate with unshippable GROUP BY clause are not pushed
--Testcase 169:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as c2 from ft2 group by c2 * (random() <= 1)::int order by 1;
-- GROUP BY clause in various forms, cardinal, alias and constant expression
--Testcase 516:
explain (verbose, costs off)
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
--Testcase 517:
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
-- GROUP BY clause referring to same column multiple times
-- Also, ORDER BY contains an aggregate function
--Testcase 170:
--Testcase 966:
explain (verbose, costs off)
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
--Testcase 171:
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
-- Testing HAVING clause shippability
--Testcase 172:
explain (verbose, costs off)
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
--Testcase 173:
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
-- Unshippable HAVING clause will be evaluated locally, and other qual in HAVING clause is pushed down
--Testcase 174:
explain (verbose, costs off)
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
--Testcase 175:
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
-- Aggregate in HAVING clause is not pushable, and thus aggregation is not pushed down
--Testcase 176:
explain (verbose, costs off)
select sum(c1) from ft1 group by c2 having avg(c1 * (random() <= 1)::int) > 100 order by 1;
-- Remote aggregate in combination with a local Param (for the output
-- of an initplan) can be trouble, per bug #15781
--Testcase 518:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 519:
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 520:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
--Testcase 521:
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
-- Testing ORDER BY, DISTINCT, FILTER, Ordered-sets and VARIADIC within aggregates
-- ORDER BY within aggregate, same column used to order
--Testcase 177:
explain (verbose, costs off)
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
--Testcase 178:
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
-- ORDER BY within aggregate, different column used to order also using DESC
--Testcase 179:
explain (verbose, costs off)
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
--Testcase 180:
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
-- DISTINCT within aggregate
--Testcase 181:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 182:
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- DISTINCT combined with ORDER BY within aggregate
--Testcase 183:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 184:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 185:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 186:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- FILTER within aggregate
--Testcase 187:
explain (verbose, costs off)
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
--Testcase 188:
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
-- DISTINCT, ORDER BY and FILTER within aggregate
--Testcase 189:
explain (verbose, costs off)
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
--Testcase 190:
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
-- Outer query is aggregation query
--Testcase 191:
explain (verbose, costs off)
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 192:
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Inner query is aggregation query
--Testcase 193:
explain (verbose, costs off)
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 194:
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Aggregate not pushed down as FILTER condition is not pushable
--Testcase 195:
explain (verbose, costs off)
select sum(c1) filter (where (c1 / c1) * random() <= 1) from ft1 group by c2 order by 1;
--Testcase 196:
explain (verbose, costs off)
select sum(c2) filter (where c2 in (select c2 from ft1 where c2 < 5)) from ft1;
-- Ordered-sets within aggregate
--Testcase 197:
explain (verbose, costs off)
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
--Testcase 198:
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
-- Using multiple arguments within aggregates
--Testcase 199:
explain (verbose, costs off)
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
--Testcase 200:
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
-- User defined function for user defined aggregate, VARIADIC
--Testcase 522:
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)';
--Testcase 523:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
-- Disable hash aggregation for plan stability.
--Testcase 786:
set enable_hashagg to false;
-- Not pushed down due to user defined aggregate
--Testcase 524:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Add function and aggregate into extension
--alter extension postgres_fdw add function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw add aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now aggregate will be pushed. Aggregate will display VARIADIC argument.
--Testcase 525:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
--Testcase 526:
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
-- Remove function and aggregate from extension
--alter extension postgres_fdw drop function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw drop aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Not pushed down as we have dropped objects from extension.
--Testcase 527:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Cleanup
--Testcase 787:
reset enable_hashagg;
--Testcase 528:
drop aggregate least_agg(variadic items anyarray);
--Testcase 529:
drop function least_accum(anyelement, variadic anyarray);
-- Testing USING OPERATOR() in ORDER BY within aggregate.
-- For this, we need user defined operators along with operator family and
-- operator class. Create those and then add them in extension. Note that
-- user defined objects are considered unshippable unless they are part of
-- the extension.
--Testcase 530:
create operator public.<^ (
leftarg = int4,
rightarg = int4,
procedure = int4eq
);
--Testcase 531:
create operator public.=^ (
leftarg = int4,
rightarg = int4,
procedure = int4lt
);
--Testcase 532:
create operator public.>^ (
leftarg = int4,
rightarg = int4,
procedure = int4gt
);
--Testcase 533:
create operator family my_op_family using btree;
--Testcase 534:
create function my_op_cmp(a int, b int) returns int as
$$begin return btint4cmp(a, b); end $$ language plpgsql;
--Testcase 535:
create operator class my_op_class for type int using btree family my_op_family as
operator 1 public.<^,
operator 3 public.=^,
operator 5 public.>^,
function 1 my_op_cmp(int, int);
-- This will not be pushed as user defined sort operator is not part of the
-- extension yet.
--Testcase 536:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- This should not be pushed either.
--Testcase 967:
explain (verbose, costs off)
select * from ft2 order by c1 using operator(public.<^);
-- Update local stats on ft2
--ANALYZE ft2;
-- Add into extension
--Testcase 788:
alter extension sqlite_fdw add operator class my_op_class using btree;
--Testcase 789:
alter extension sqlite_fdw add function my_op_cmp(a int, b int);
--Testcase 790:
alter extension sqlite_fdw add operator family my_op_family using btree;
--Testcase 791:
alter extension sqlite_fdw add operator public.<^(int, int);
--Testcase 792:
alter extension sqlite_fdw add operator public.=^(int, int);
--Testcase 793:
alter extension sqlite_fdw add operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now this will be pushed as sort operator is part of the extension.
--Testcase 537:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
--Testcase 538:
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- This should be pushed too.
-- Sqlite not support pushdown user defined operators
--Testcase 968:
explain (verbose, costs off)
select * from ft2 order by c1 using operator(public.<^);
-- Remove from extension
--Testcase 794:
alter extension sqlite_fdw drop operator class my_op_class using btree;
--Testcase 795:
alter extension sqlite_fdw drop function my_op_cmp(a int, b int);
--Testcase 796:
alter extension sqlite_fdw drop operator family my_op_family using btree;
--Testcase 797:
alter extension sqlite_fdw drop operator public.<^(int, int);
--Testcase 798:
alter extension sqlite_fdw drop operator public.=^(int, int);
--Testcase 799:
alter extension sqlite_fdw drop operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- This will not be pushed as sort operator is now removed from the extension.
--Testcase 539:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Cleanup
--Testcase 540:
drop operator class my_op_class using btree;
--Testcase 541:
drop function my_op_cmp(a int, b int);
--Testcase 542:
drop operator family my_op_family using btree;
--Testcase 543:
drop operator public.>^(int, int);
--Testcase 544:
drop operator public.=^(int, int);
--Testcase 545:
drop operator public.<^(int, int);
-- Input relation to aggregate push down hook is not safe to pushdown and thus
-- the aggregate cannot be pushed down to foreign server.
--Testcase 201:
explain (verbose, costs off)
select count(t1.c3) from ft2 t1 left join ft2 t2 on (t1.c1 = random() * t2.c2);
-- Subquery in FROM clause having aggregate
--Testcase 202:
explain (verbose, costs off)
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
--Testcase 203:
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
-- FULL join with IS NULL check in HAVING
--Testcase 204:
explain (verbose, costs off)
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
--Testcase 205:
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
-- Aggregate over FULL join needing to deparse the joining relations as
-- subqueries.
--Testcase 206:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
--Testcase 207:
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
-- ORDER BY expression is part of the target list but not pushed down to
-- foreign server.
--Testcase 208:
explain (verbose, costs off)
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
--Testcase 209:
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
-- LATERAL join, with parameterization
--Testcase 800:
set enable_hashagg to false;
--Testcase 210:
explain (verbose, costs off)
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 211:
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 801:
reset enable_hashagg;
-- bug #15613: bad plan for foreign table scan with lateral reference
--Testcase 546:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
--Testcase 547:
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
-- Check with placeHolderVars
--Testcase 212:
explain (verbose, costs off)
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
--Testcase 213:
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
-- Not supported cases
-- Grouping sets
--Testcase 214:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 215:
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 216:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 217:
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 218:
explain (verbose, costs off)
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 219:
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 220:
explain (verbose, costs off)
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
--Testcase 221:
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
-- DISTINCT itself is not pushed down, whereas underneath aggregate is pushed
--Testcase 222:
explain (verbose, costs off)
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
--Testcase 223:
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
-- WindowAgg
--Testcase 224:
explain (verbose, costs off)
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 225:
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 226:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 227:
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 228:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 229:
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
-- ===================================================================
-- parameterized queries
-- ===================================================================
-- simple join
--Testcase 230:
PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $1 AND t2.c1 = $2;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2);
--Testcase 232:
EXECUTE st1(1, 1);
--Testcase 233:
EXECUTE st1(101, 101);
-- subquery using stable function (can't be sent to remote)
--Testcase 234:
PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1;
--Testcase 235:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st2(10, 20);
--Testcase 236:
EXECUTE st2(10, 20);
--Testcase 237:
EXECUTE st2(101, 121);
-- subquery using immutable function (can be sent to remote)
--Testcase 238:
PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1;
--Testcase 239:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st3(10, 20);
--Testcase 240:
EXECUTE st3(10, 20);
--Testcase 241:
EXECUTE st3(20, 30);
-- custom plan should be chosen initially
--Testcase 242:
PREPARE st4(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 = $1;
--Testcase 243:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 244:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 245:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 246:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 247:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- once we try it enough times, should switch to generic plan
--Testcase 248:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- value of $1 should not be sent to remote
--Testcase 249:
PREPARE st5(text,int) AS SELECT * FROM ft1 t1 WHERE c8 = $1 and c1 = $2;
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 254:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 255:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 256:
EXECUTE st5('foo', 1);
-- altering FDW options requires replanning
--Testcase 257:
PREPARE st6 AS SELECT * FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 258:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 259:
PREPARE st7 AS INSERT INTO ft1 (c1,c2,c3) VALUES (1001,101,'foo');
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 548:
INSERT INTO "S 1"."T 0" SELECT * FROM "S 1"."T 1";
--Testcase 802:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 0');
--Testcase 261:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 262:
EXECUTE st6;
--Testcase 263:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 803:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 1');
--Testcase 549:
PREPARE st8 AS SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 550:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 551:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--Testcase 552:
EXECUTE st8;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- cleanup
DEALLOCATE st1;
DEALLOCATE st2;
DEALLOCATE st3;
DEALLOCATE st4;
DEALLOCATE st5;
DEALLOCATE st6;
DEALLOCATE st7;
DEALLOCATE st8;
-- System columns, except ctid and oid, should not be sent to remote
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'pg_class'::regclass LIMIT 1;
--Testcase 265:
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'ft1'::regclass LIMIT 1;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 267:
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 553:
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 554:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ctid, * FROM ft1 t1 LIMIT 1;
--Testcase 271:
SELECT ctid, * FROM ft1 t1 LIMIT 1;
-- ===================================================================
-- used in PL/pgSQL function
-- ===================================================================
--Testcase 555:
CREATE OR REPLACE FUNCTION f_test(p_c1 int) RETURNS int AS $$
DECLARE
v_c1 int;
BEGIN
--Testcase 556:
SELECT c1 INTO v_c1 FROM ft1 WHERE c1 = p_c1 LIMIT 1;
PERFORM c1 FROM ft1 WHERE c1 = p_c1 AND p_c1 = v_c1 LIMIT 1;
RETURN v_c1;
END;
$$ LANGUAGE plpgsql;
--Testcase 272:
SELECT f_test(100);
--Testcase 557:
DROP FUNCTION f_test(int);
-- ===================================================================
-- REINDEX
-- ===================================================================
-- remote table is not created here
--Testcase 804:
CREATE FOREIGN TABLE reindex_foreign (c1 int, c2 int)
SERVER sqlite_svr2 OPTIONS (table 'reindex_local');
REINDEX TABLE reindex_foreign; -- error
REINDEX TABLE CONCURRENTLY reindex_foreign; -- error
--Testcase 805:
DROP FOREIGN TABLE reindex_foreign;
-- partitions and foreign tables
--Testcase 806:
CREATE TABLE reind_fdw_parent (c1 int) PARTITION BY RANGE (c1);
--Testcase 807:
CREATE TABLE reind_fdw_0_10 PARTITION OF reind_fdw_parent
FOR VALUES FROM (0) TO (10);
--Testcase 808:
CREATE FOREIGN TABLE reind_fdw_10_20 PARTITION OF reind_fdw_parent
FOR VALUES FROM (10) TO (20)
SERVER sqlite_svr OPTIONS (table 'reind_local_10_20');
REINDEX TABLE reind_fdw_parent; -- ok
REINDEX TABLE CONCURRENTLY reind_fdw_parent; -- ok
--Testcase 809:
DROP TABLE reind_fdw_parent;
-- ===================================================================
-- conversion error
-- ===================================================================
--Testcase 810:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE int;
--Testcase 273:
SELECT * FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8) WHERE x1 = 1;
--Testcase 274:
SELECT ftx.x1, ft2.c2, ftx.x8 FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 275:
SELECT ftx.x1, ft2.c2, ftx FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 276:
SELECT sum(c2), array_agg(c8) FROM ft1 GROUP BY c8;
-- ANALYZE ft1; -- ERROR
-- ===================================================================
-- local type can be different from remote type in some cases,
-- in particular if similarly-named operators do equivalent things
-- ===================================================================
--Testcase 811:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE text;
--Testcase 969:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c8 = 'foo' LIMIT 1;
--Testcase 970:
SELECT * FROM ft1 WHERE c8 = 'foo' LIMIT 1;
--Testcase 971:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE 'foo' = c8 LIMIT 1;
--Testcase 972:
SELECT * FROM ft1 WHERE 'foo' = c8 LIMIT 1;
-- we declared c8 to be text locally, but it's still the same type on
-- the remote which will balk if we try to do anything incompatible
-- with that remote type
-- Can not create user define type in SqliteDB.
-- Type c8 of foreign table ft1 and remote table T1 are
-- match. These case below not error with sqlite_fdw.
-- with that remote type
--Testcase 973:
SELECT * FROM ft1 WHERE c8 LIKE 'foo' LIMIT 1; -- ERROR
--Testcase 974:
SELECT * FROM ft1 WHERE c8::text LIKE 'foo' LIMIT 1; -- ERROR; cast not pushed down
-- ===================================================================
-- subtransaction
-- + local/remote error doesn't break cursor
-- ===================================================================
BEGIN;
DECLARE c CURSOR FOR SELECT * FROM ft1 ORDER BY c1;
--Testcase 277:
FETCH c;
SAVEPOINT s;
ERROR OUT; -- ERROR
ROLLBACK TO s;
--Testcase 278:
FETCH c;
SAVEPOINT s;
--Testcase 279:
SELECT * FROM ft1 WHERE 1 / (c1 - 1) > 0; -- ERROR
ROLLBACK TO s;
--Testcase 280:
FETCH c;
--Testcase 281:
SELECT * FROM ft1 ORDER BY c1 LIMIT 1;
COMMIT;
-- ===================================================================
-- test handling of collations
-- ===================================================================
--Testcase 558:
create foreign table ft3 (f1 text collate "C", f2 text, f3 varchar(10)) server sqlite_svr;
-- can be sent to remote
--Testcase 559:
explain (verbose, costs off) select * from ft3 where f1 = 'foo';
--Testcase 560:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "C" = 'foo';
--Testcase 561:
explain (verbose, costs off) select * from ft3 where f2 = 'foo';
--Testcase 562:
explain (verbose, costs off) select * from ft3 where f3 = 'foo';
--Testcase 563:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 and l.f1 = 'foo';
-- can't be sent to remote
--Testcase 564:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "POSIX" = 'foo';
--Testcase 565:
explain (verbose, costs off) select * from ft3 where f1 = 'foo' COLLATE "C";
--Testcase 566:
explain (verbose, costs off) select * from ft3 where f2 COLLATE "C" = 'foo';
--Testcase 567:
explain (verbose, costs off) select * from ft3 where f2 = 'foo' COLLATE "C";
--Testcase 568:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 COLLATE "POSIX" and l.f1 = 'foo';
-- ===================================================================
-- test writable foreign table stuff
-- ===================================================================
--Testcase 282:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 283:
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 284:
INSERT INTO ft2 (c1,c2,c3) VALUES (1101,201,'aaa'), (1102,202,'bbb'), (1103,203,'ccc');
--Testcase 285:
SELECT * FROM ft2 WHERE c1 >= 1101;
--Testcase 286:
INSERT INTO ft2 (c1,c2,c3) VALUES (1104,204,'ddd'), (1105,205,'eee');
--Testcase 287:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3; -- can be pushed down
--Testcase 288:
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3;
--Testcase 289:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7; -- can be pushed down
--Testcase 290:
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7;
--Testcase 291:
SELECT * FROM ft2 WHERE c1 % 10 = 7;
--Testcase 292:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9; -- can be pushed down
--Testcase 293:
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9;
--Testcase 294:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 % 10 = 5; -- can be pushed down
--Testcase 295:
SELECT c1, c4 FROM ft2 WHERE c1 % 10 = 5;
--Testcase 569:
DELETE FROM ft2 WHERE c1 % 10 = 5;
--Testcase 297:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2; -- can be pushed down
--Testcase 298:
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
--Testcase 299:
SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1;
--Testcase 300:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 301:
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 302:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200; -- can be pushed down
--Testcase 303:
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200;
--Testcase 304:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 = 1200; -- can be pushed down
--Testcase 305:
DELETE FROM ft2 WHERE c1 = 1200;
-- Test UPDATE/DELETE on a three-table join
--Testcase 306:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id;
--Testcase 307:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 308:
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1;
--Testcase 309:
SELECT ft2, ft2.*, ft4, ft4.*
FROM ft2 INNER JOIN ft4 ON (ft2.c1 > 1200 AND ft2.c2 = ft4.c1)
INNER JOIN ft5 ON (ft4.c1 = ft5.c1);
--Testcase 310:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 311:
SELECT 100 FROM ft2, ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 570:
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 312:
DELETE FROM ft2 WHERE ft2.c1 > 1200;
-- Test UPDATE with a MULTIEXPR sub-select
-- (maybe someday this'll be remotely executable, but not today)
--Testcase 571:
EXPLAIN (verbose, costs off)
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 572:
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 573:
UPDATE ft2 AS target SET (c2) = (
SELECT c2 / 10
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
-- Test UPDATE involving a join that can be pushed down,
-- but a SET clause that can't be
--Testcase 812:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
--Testcase 813:
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
-- Test UPDATE/DELETE with WHERE or JOIN/ON conditions containing
-- user-defined operators/functions
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 574:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id % 10, to_char(id, 'FM00000') FROM generate_series(2001, 2010) id;
--Testcase 575:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000; -- can't be pushed down
--Testcase 576:
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 577:
SELECT * FROM ft2 WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 578:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1; -- can't be pushed down
--Testcase 579:
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 580:
SELECT ft2.*, ft4.*, ft5.*
FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 581:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 582:
SELECT ft2.c1, ft2.c2, ft2.c3 FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 583:
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1;
--Testcase 584:
DELETE FROM ft2 WHERE ft2.c1 > 2000;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- Test that trigger on remote table works as expected
--Testcase 585:
CREATE OR REPLACE FUNCTION "S 1".F_BRTRIG() RETURNS trigger AS $$
BEGIN
NEW.c3 = NEW.c3 || '_trig_update';
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
--Testcase 586:
CREATE TRIGGER t1_br_insert BEFORE INSERT OR UPDATE
ON ft2 FOR EACH ROW EXECUTE PROCEDURE "S 1".F_BRTRIG();
--Testcase 313:
INSERT INTO ft2 (c1,c2,c3) VALUES (1208, 818, 'fff');
--Testcase 314:
SELECT * FROM ft2 WHERE c1 = 1208;
--Testcase 315:
INSERT INTO ft2 (c1,c2,c3,c6) VALUES (1218, 818, 'ggg', '(--;');
--Testcase 316:
SELECT * FROM ft2 WHERE c1 = 1218;
--Testcase 317:
UPDATE ft2 SET c2 = c2 + 600, c3 = c3 WHERE c1 % 10 = 8 AND c1 < 1200;
--Testcase 318:
SELECT * FROM ft2 WHERE c1 % 10 = 8 AND c1 < 1200;
-- Test errors thrown on remote side during update
-- create table in the remote server with check contraint
--Testcase 738:
CREATE FOREIGN TABLE ft1_constraint (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr OPTIONS (table 't1_constraint');
--Testcase 747:
INSERT INTO ft1_constraint SELECT * FROM ft1 ON CONFLICT DO NOTHING;
-- c2 must be greater than or equal to 0, so this case is ignored.
--Testcase 754:
INSERT INTO ft1_constraint(c1, c2) VALUES (2222, -2) ON CONFLICT DO NOTHING; -- ignore, do nothing
--Testcase 755:
SELECT c1, c2 FROM ft1_constraint WHERE c1 = 2222 or c2 = -2; -- empty result
--Testcase 748:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 749:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
--Testcase 319:
INSERT INTO ft1(c1, c2) VALUES(11, 12); -- duplicate key
--Testcase 320:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO NOTHING; -- unsupported
--Testcase 321:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO UPDATE SET c3 = 'ffg'; -- unsupported
--Testcase 743:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 744:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 750:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_constraint;
--Testcase 751:
ALTER FOREIGN TABLE ft1_org RENAME TO ft1;
-- Test savepoint/rollback behavior
--Testcase 322:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 323:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
begin;
--Testcase 324:
update ft2 set c2 = 42 where c2 = 0;
--Testcase 325:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s1;
--Testcase 326:
update ft2 set c2 = 44 where c2 = 4;
--Testcase 327:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s1;
--Testcase 328:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s2;
--Testcase 329:
update ft2 set c2 = 46 where c2 = 6;
--Testcase 330:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
rollback to savepoint s2;
--Testcase 331:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s2;
--Testcase 332:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s3;
--Testcase 333:
--skip, does not support CHECK
--update ft2 set c2 = -2 where c2 = 42 and c1 = 10; -- fail on remote side
rollback to savepoint s3;
--Testcase 334:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s3;
--Testcase 335:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
-- none of the above is committed yet remotely
--Testcase 336:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
commit;
--Testcase 337:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 338:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
--VACUUM ANALYZE "S 1"."T 1";
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
-- FIRST behavior here.
-- ORDER BY DESC NULLS LAST options
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
--Testcase 340:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
-- ORDER BY DESC NULLS FIRST options
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 342:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ORDER BY ASC NULLS FIRST options
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 344:
SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ===================================================================
-- test check constraints
-- ===================================================================
--Testcase 752:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 753:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
-- Consistent check constraints provide consistent results
--Testcase 814:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2positive CHECK (c2 >= 0);
--Testcase 587:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 588:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 815:
SET constraint_exclusion = 'on';
--Testcase 589:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 590:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 816:
RESET constraint_exclusion;
-- check constraint is enforced on the remote side, not locally
--Testcase 745:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 746:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 817:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2positive;
-- But inconsistent check constraints provide inconsistent results
--Testcase 818:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2negative CHECK (c2 < 0);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 592:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 819:
SET constraint_exclusion = 'on';
--Testcase 593:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 594:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 820:
RESET constraint_exclusion;
-- local check constraint is not actually enforced
--Testcase 595:
INSERT INTO ft1(c1, c2) VALUES(1111, 2);
--Testcase 596:
UPDATE ft1 SET c2 = c2 + 1 WHERE c1 = 1;
--Testcase 821:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2negative;
-- ===================================================================
-- test WITH CHECK OPTION constraints
-- ===================================================================
--Testcase 597:
CREATE FUNCTION row_before_insupd_trigfunc() RETURNS trigger AS $$BEGIN NEW.a := NEW.a + 10; RETURN NEW; END$$ LANGUAGE plpgsql;
--Testcase 598:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 599:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 600:
CREATE VIEW rw_view AS SELECT * FROM foreign_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 601:
\d+ rw_view
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 602:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 603:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 604:
INSERT INTO rw_view VALUES (0, 15); -- error
--Testcase 605:
SELECT * FROM foreign_tbl;
--Testcase 606:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 607:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 608:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 609:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 610:
SELECT * FROM foreign_tbl;
-- We don't allow batch insert when there are any WCO constraints
ALTER SERVER sqlite_svr OPTIONS (ADD batch_size '10');
--Testcase 989:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15), (1, 5);
--Testcase 990:
INSERT INTO rw_view VALUES (0, 15), (1, 5); -- should fail
--Testcase 991:
SELECT * FROM foreign_tbl;
ALTER SERVER sqlite_svr OPTIONS (DROP batch_size);
--Testcase 611:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 612:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
-- test WCO for partitions
--Testcase 613:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 614:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 615:
CREATE TABLE parent_tbl (a int, b int) PARTITION BY RANGE(a);
--Testcase 822:
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
-- Detach and re-attach once, to stress the concurrent detach case.
--Testcase 975:
ALTER TABLE parent_tbl DETACH PARTITION foreign_tbl CONCURRENTLY;
--Testcase 976:
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
--Testcase 616:
CREATE VIEW rw_view AS SELECT * FROM parent_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 617:
\d+ rw_view
--Testcase 618:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 619:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 620:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 621:
INSERT INTO rw_view VALUES (0, 15); -- ok
--Testcase 622:
SELECT * FROM foreign_tbl;
--Testcase 623:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 624:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 625:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 626:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 627:
SELECT * FROM foreign_tbl;
-- We don't allow batch insert when there are any WCO constraints
ALTER SERVER sqlite_svr OPTIONS (ADD batch_size '10');
--Testcase 992:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15), (1, 5);
--Testcase 993:
INSERT INTO rw_view VALUES (0, 15), (1, 5); -- should fail
--Testcase 994:
SELECT * FROM foreign_tbl;
ALTER SERVER sqlite_svr OPTIONS (DROP batch_size);
--Testcase 628:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
--Testcase 629:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 630:
DROP TABLE parent_tbl CASCADE;
--Testcase 631:
DROP FUNCTION row_before_insupd_trigfunc;
-- ===================================================================
-- test serial columns (ie, sequence-based defaults)
-- ===================================================================
--Testcase 632:
create foreign table loc1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr;
--Testcase 633:
create foreign table rem1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr options(table 'loc1');
--Testcase 352:
select pg_catalog.setval('rem1_f1_seq', 10, false);
--Testcase 353:
insert into loc1(f2) values('hi');
--Testcase 634:
insert into rem1(f2) values('hi remote');
--Testcase 354:
insert into loc1(f2) values('bye');
--Testcase 635:
insert into rem1(f2) values('bye remote');
--Testcase 355:
select f1, f2 from loc1;
--Testcase 636:
select f1, f2 from rem1;
-- ===================================================================
-- test generated columns
-- ===================================================================
--Testcase 637:
create foreign table grem1 (
a int options (key 'true'),
b int generated always as (a * 2) stored)
server sqlite_svr options(table 'grem1_post14');
--Testcase 638:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 823:
insert into grem1 (a) values (1), (2);
--Testcase 639:
explain (verbose, costs off)
update grem1 set a = 22 where a = 2;
--Testcase 824:
update grem1 set a = 22 where a = 2;
--Testcase 640:
select * from grem1;
--Testcase 825:
delete from grem1;
-- -- test copy from
-- copy grem1 from stdin;
-- 1
-- 2
-- \.
-- select * from grem1;
-- delete from grem1;
-- test batch insert
--Testcase 826:
alter server sqlite_svr options (add batch_size '10');
--Testcase 827:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 828:
insert into grem1 (a) values (1), (2);
--Testcase 829:
select * from grem1;
--Testcase 830:
delete from grem1;
--Testcase 831:
alter server sqlite_svr options (drop batch_size);
-- ===================================================================
-- test local triggers
-- ===================================================================
-- Trigger functions "borrowed" from triggers regress test.
--Testcase 641:
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;$$;
--Testcase 642:
CREATE TRIGGER trig_stmt_before BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 643:
CREATE TRIGGER trig_stmt_after AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 644:
CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger
LANGUAGE plpgsql AS $$
declare
oldnew text[];
relid text;
argstr text;
begin
relid := TG_relid::regclass;
argstr := '';
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 '%(%) % % % ON %',
tg_name, argstr, TG_when, TG_level, TG_OP, relid;
oldnew := '{}'::text[];
if TG_OP != 'INSERT' then
oldnew := array_append(oldnew, format('OLD: %s', OLD));
end if;
if TG_OP != 'DELETE' then
oldnew := array_append(oldnew, format('NEW: %s', NEW));
end if;
RAISE NOTICE '%', array_to_string(oldnew, ',');
if TG_OP = 'DELETE' then
return OLD;
else
return NEW;
end if;
end;
$$;
-- Test basic functionality
--Testcase 645:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 646:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 356:
delete from rem1;
--Testcase 357:
insert into rem1 values(1,'insert');
--Testcase 358:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 359:
update rem1 set f2 = f2 || f2;
-- cleanup
--Testcase 647:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 648:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 649:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 650:
DROP TRIGGER trig_stmt_after ON rem1;
--Testcase 360:
DELETE from rem1;
-- Test multiple AFTER ROW triggers on a foreign table
--Testcase 651:
CREATE TRIGGER trig_row_after1
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 652:
CREATE TRIGGER trig_row_after2
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 653:
insert into rem1 values(1,'insert');
--Testcase 654:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 655:
update rem1 set f2 = f2 || f2;
--Testcase 656:
delete from rem1;
-- cleanup
--Testcase 657:
DROP TRIGGER trig_row_after1 ON rem1;
--Testcase 658:
DROP TRIGGER trig_row_after2 ON rem1;
-- Test WHEN conditions
--Testcase 659:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 660:
CREATE TRIGGER trig_row_after_insupd
AFTER INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Insert or update not matching: nothing happens
--Testcase 363:
INSERT INTO rem1 values(1, 'insert');
--Testcase 364:
UPDATE rem1 set f2 = 'test';
-- Insert or update matching: triggers are fired
--Testcase 365:
INSERT INTO rem1 values(2, 'update');
--Testcase 366:
UPDATE rem1 set f2 = 'update update' where f1 = '2';
--Testcase 661:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 662:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Trigger is fired for f1=2, not for f1=1
--Testcase 369:
DELETE FROM rem1;
-- cleanup
--Testcase 663:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 664:
DROP TRIGGER trig_row_after_insupd ON rem1;
--Testcase 665:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 666:
DROP TRIGGER trig_row_after_delete ON rem1;
-- Test various RETURN statements in BEFORE triggers.
--Testcase 667:
CREATE FUNCTION trig_row_before_insupdate() RETURNS TRIGGER AS $$
BEGIN
NEW.f2 := NEW.f2 || ' triggered !';
RETURN NEW;
END
$$ language plpgsql;
--Testcase 668:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
-- The new values should have 'triggered' appended
--Testcase 370:
INSERT INTO rem1 values(1, 'insert');
--Testcase 371:
SELECT f1, f2 from rem1;
--Testcase 372:
INSERT INTO rem1 values(2, 'insert');
--Testcase 373:
SELECT f1, f2 from rem1;
--Testcase 374:
UPDATE rem1 set f2 = '';
--Testcase 375:
SELECT f1, f2 from rem1;
--Testcase 376:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 377:
SELECT f1, f2 from rem1;
--Testcase 669:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f1 = 10; -- all columns should be transmitted
--Testcase 670:
UPDATE rem1 set f1 = 10;
--Testcase 671:
SELECT f1, f2 from rem1;
--Testcase 378:
DELETE FROM rem1;
-- Add a second trigger, to check that the changes are propagated correctly
-- from trigger to trigger
--Testcase 672:
CREATE TRIGGER trig_row_before_insupd2
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 379:
INSERT INTO rem1 values(1, 'insert');
--Testcase 380:
SELECT f1, f2 from rem1;
--Testcase 381:
INSERT INTO rem1 values(2, 'insert');
--Testcase 382:
SELECT f1, f2 from rem1;
--Testcase 383:
UPDATE rem1 set f2 = '';
--Testcase 384:
SELECT f1, f2 from rem1;
--Testcase 385:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 386:
SELECT f1, f2 from rem1;
--Testcase 673:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 674:
DROP TRIGGER trig_row_before_insupd2 ON rem1;
--Testcase 387:
DELETE from rem1;
--Testcase 388:
INSERT INTO rem1 VALUES (1, 'test');
-- Test with a trigger returning NULL
--Testcase 675:
CREATE FUNCTION trig_null() RETURNS TRIGGER AS $$
BEGIN
RETURN NULL;
END
$$ language plpgsql;
--Testcase 676:
CREATE TRIGGER trig_null
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_null();
-- Nothing should have changed.
--Testcase 389:
INSERT INTO rem1 VALUES (2, 'test2');
--Testcase 390:
SELECT f1, f2 from rem1;
--Testcase 391:
UPDATE rem1 SET f2 = 'test2';
--Testcase 392:
SELECT f1, f2 from rem1;
--Testcase 393:
DELETE from rem1;
--Testcase 394:
SELECT f1, f2 from rem1;
--Testcase 677:
DROP TRIGGER trig_null ON rem1;
--Testcase 395:
DELETE from rem1;
-- Test a combination of local and remote triggers
--Testcase 678:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 679:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 680:
CREATE TRIGGER trig_local_before BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 681:
INSERT INTO rem1(f2) VALUES ('test');
--Testcase 682:
UPDATE rem1 SET f2 = 'testo';
-- Test returning a system attribute
--Testcase 683:
INSERT INTO rem1(f2) VALUES ('test');
-- cleanup
--Testcase 684:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 685:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 686:
DROP TRIGGER trig_local_before ON rem1;
-- Test direct foreign table modification functionality
--Testcase 832:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 833:
EXPLAIN (verbose, costs off)
DELETE FROM rem1 WHERE false; -- currently can't be pushed down
-- Test with statement-level triggers
--Testcase 687:
CREATE TRIGGER trig_stmt_before
BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 396:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 397:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 688:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 689:
CREATE TRIGGER trig_stmt_after
AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 398:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 399:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 690:
DROP TRIGGER trig_stmt_after ON rem1;
-- Test with row-level ON INSERT triggers
--Testcase 691:
CREATE TRIGGER trig_row_before_insert
BEFORE INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 400:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 401:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 692:
DROP TRIGGER trig_row_before_insert ON rem1;
--Testcase 693:
CREATE TRIGGER trig_row_after_insert
AFTER INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 402:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 403:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 694:
DROP TRIGGER trig_row_after_insert ON rem1;
-- Test with row-level ON UPDATE triggers
--Testcase 695:
CREATE TRIGGER trig_row_before_update
BEFORE UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 404:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 405:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 696:
DROP TRIGGER trig_row_before_update ON rem1;
--Testcase 697:
CREATE TRIGGER trig_row_after_update
AFTER UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 406:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 407:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 698:
DROP TRIGGER trig_row_after_update ON rem1;
-- Test with row-level ON DELETE triggers
--Testcase 699:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 408:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 409:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 700:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 701:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 410:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 411:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 702:
DROP TRIGGER trig_row_after_delete ON rem1;
-- ===================================================================
-- test inheritance features
-- ===================================================================
--Testcase 703:
CREATE TABLE a (aa TEXT);
--Testcase 834:
ALTER TABLE a SET (autovacuum_enabled = 'false');
--Testcase 704:
CREATE FOREIGN TABLE b (aa TEXT OPTIONS (key 'true'), bb TEXT) INHERITS (a)
SERVER sqlite_svr OPTIONS (table 'loct');
--Testcase 412:
INSERT INTO a(aa) VALUES('aaa');
--Testcase 413:
INSERT INTO a(aa) VALUES('aaaa');
--Testcase 414:
INSERT INTO a(aa) VALUES('aaaaa');
--Testcase 415:
INSERT INTO b(aa) VALUES('bbb');
--Testcase 416:
INSERT INTO b(aa) VALUES('bbbb');
--Testcase 417:
INSERT INTO b(aa) VALUES('bbbbb');
--Testcase 418:
SELECT tableoid::regclass, * FROM a;
--Testcase 419:
SELECT tableoid::regclass, * FROM b;
--Testcase 420:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 421:
UPDATE a SET aa = 'zzzzzz' WHERE aa LIKE 'aaaa%';
--Testcase 422:
SELECT tableoid::regclass, * FROM a;
--Testcase 423:
SELECT tableoid::regclass, * FROM b;
--Testcase 424:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 425:
UPDATE b SET aa = 'new';
--Testcase 426:
SELECT tableoid::regclass, * FROM a;
--Testcase 427:
SELECT tableoid::regclass, * FROM b;
--Testcase 428:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 429:
UPDATE a SET aa = 'newtoo';
--Testcase 430:
SELECT tableoid::regclass, * FROM a;
--Testcase 431:
SELECT tableoid::regclass, * FROM b;
--Testcase 432:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 433:
DELETE FROM a;
--Testcase 434:
SELECT tableoid::regclass, * FROM a;
--Testcase 435:
SELECT tableoid::regclass, * FROM b;
--Testcase 436:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 705:
DROP TABLE a CASCADE;
-- Check SELECT FOR UPDATE/SHARE with an inherited source table
--Testcase 706:
create table foo (f1 int, f2 int);
--Testcase 707:
create foreign table foo2 (f3 int OPTIONS (key 'true')) inherits (foo)
server sqlite_svr options (table 'loct1');
--Testcase 708:
create table bar (f1 int, f2 int);
--Testcase 709:
create foreign table bar2 (f3 int OPTIONS (key 'true')) inherits (bar)
server sqlite_svr options (table 'loct2');
--Testcase 835:
alter table foo set (autovacuum_enabled = 'false');
--Testcase 836:
alter table bar set (autovacuum_enabled = 'false');
--Testcase 437:
insert into foo values(1,1);
--Testcase 438:
insert into foo values(3,3);
--Testcase 439:
insert into foo2 values(2,2,2);
--Testcase 440:
insert into foo2 values(4,4,4);
--Testcase 441:
insert into bar values(1,11);
--Testcase 442:
insert into bar values(2,22);
--Testcase 443:
insert into bar values(6,66);
--Testcase 444:
insert into bar2 values(3,33,33);
--Testcase 445:
insert into bar2 values(4,44,44);
--Testcase 446:
insert into bar2 values(7,77,77);
--Testcase 447:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 448:
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 449:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for share;
--Testcase 450:
select * from bar where f1 in (select f1 from foo) for share;
-- Now check SELECT FOR UPDATE/SHARE with an inherited source table,
-- where the parent is itself a foreign table
--Testcase 837:
create foreign table foo2child (f3 int) inherits (foo2)
server sqlite_svr options (table 'loct4_2');
--Testcase 838:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 839:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 840:
drop foreign table foo2child;
-- And with a local child relation of the foreign table parent
--Testcase 841:
create table foo2child (f3 int) inherits (foo2);
--Testcase 842:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 843:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 844:
drop table foo2child;
-- Check UPDATE with inherited target and an inherited source table
--Testcase 451:
explain (verbose, costs off)
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 452:
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 453:
select tableoid::regclass, * from bar order by 1,2;
-- Check UPDATE with inherited target and an appendrel subquery
--Testcase 454:
explain (verbose, costs off)
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 455:
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 456:
select tableoid::regclass, * from bar order by 1,2;
-- Test forcing the remote server to produce sorted data for a merge join,
-- but the foreign table is an inheritance child.
--truncate table loct1;
--Testcase 710:
delete from foo2;
truncate table only foo;
\set num_rows_foo 2000
--Testcase 711:
insert into foo2 select generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2);
--Testcase 712:
insert into foo select generate_series(1, :num_rows_foo, 2), generate_series(1, :num_rows_foo, 2);
--Testcase 845:
SET enable_hashjoin to false;
--Testcase 846:
SET enable_nestloop to false;
--alter foreign table foo2 options (use_remote_estimate 'true');
--create index i_loct1_f1 on loct1(f1);
--Testcase 713:
create index i_foo_f1 on foo(f1);
analyze foo;
--analyze loct1;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 714:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 715:
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 716:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 717:
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 847:
RESET enable_hashjoin;
--Testcase 848:
RESET enable_nestloop;
-- Test that WHERE CURRENT OF is not supported
begin;
declare c cursor for select * from bar where f1 = 7;
--Testcase 457:
fetch from c;
--Testcase 458:
update bar set f2 = null where current of c;
rollback;
--Testcase 459:
explain (verbose, costs off)
delete from foo where f1 < 5;
--Testcase 460:
delete from foo where f1 < 5;
--Testcase 461:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 462:
update bar set f2 = f2 + 100;
--Testcase 463:
select * from bar;
-- Test that UPDATE/DELETE with inherited target works with row-level triggers
--Testcase 718:
CREATE TRIGGER trig_row_before
BEFORE UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 719:
CREATE TRIGGER trig_row_after
AFTER UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 464:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 465:
update bar set f2 = f2 + 100;
--Testcase 466:
explain (verbose, costs off)
delete from bar where f2 < 400;
--Testcase 467:
delete from bar where f2 < 400;
-- cleanup
--Testcase 720:
drop table foo cascade;
--Testcase 721:
drop table bar cascade;
-- Test pushing down UPDATE/DELETE joins to the remote server
--Testcase 722:
create table parent (a int, b text);
--Testcase 723:
create foreign table remt1 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct3');
--Testcase 724:
create foreign table remt2 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct4');
--Testcase 849:
alter foreign table remt1 inherit parent;
--Testcase 468:
insert into remt1 values (1, 'foo');
--Testcase 469:
insert into remt1 values (2, 'bar');
--Testcase 470:
insert into remt2 values (1, 'foo');
--Testcase 471:
insert into remt2 values (2, 'bar');
--Testcase 472:
explain (verbose, costs off)
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 473:
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 474:
select * from parent inner join remt2 on (parent.a = remt2.a);
--Testcase 475:
explain (verbose, costs off)
delete from parent using remt2 where parent.a = remt2.a;
--Testcase 476:
delete from parent using remt2 where parent.a = remt2.a;
-- cleanup
--Testcase 725:
drop foreign table remt1;
--Testcase 726:
drop foreign table remt2;
--Testcase 727:
drop table parent;
/*
-- Skip these tests, sqlite fdw does not support partition table, check constraint, copy from
-- ===================================================================
-- test tuple routing for foreign-table partitions
-- ===================================================================
-- Test insert tuple routing
create table itrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table itrtest attach partition remp1 for values in (1);
alter table itrtest attach partition remp2 for values in (2);
insert into itrtest values (1, 'foo');
insert into itrtest values (1, 'bar') returning *;
insert into itrtest values (2, 'baz');
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
select tableoid::regclass, * FROM itrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
delete from itrtest;
create unique index loct1_idx on loct1 (a);
-- DO NOTHING without an inference specification is supported
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
-- But other cases are not supported
insert into itrtest values (1, 'bar') on conflict (a) do nothing;
insert into itrtest values (1, 'bar') on conflict (a) do update set b = excluded.b;
select tableoid::regclass, * FROM itrtest;
delete from itrtest;
drop index loct1_idx;
-- Test that remote triggers work with insert tuple routing
create function br_insert_trigfunc() returns trigger as $$
begin
new.b := new.b || ' triggered !';
return new;
end
$$ language plpgsql;
create trigger loct1_br_insert_trigger before insert on loct1
for each row execute procedure br_insert_trigfunc();
create trigger loct2_br_insert_trigger before insert on loct2
for each row execute procedure br_insert_trigfunc();
-- The new values are concatenated with ' triggered !'
insert into itrtest values (1, 'foo') returning *;
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
with result as (insert into itrtest values (1, 'test1'), (2, 'test2') returning *) select * from result;
drop trigger loct1_br_insert_trigger on loct1;
drop trigger loct2_br_insert_trigger on loct2;
drop table itrtest;
drop table loct1;
drop table loct2;
-- Test update tuple routing
create table utrtest (a int, b text) partition by list (a);
create table loct (a int check (a in (1)), b text);
create foreign table remp (a int check (a in (1)), b text) server loopback options (table_name 'loct');
create table locp (a int check (a in (2)), b text);
alter table utrtest attach partition remp for values in (1);
alter table utrtest attach partition locp for values in (2);
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- It's not allowed to move a row from a partition that is foreign to another
update utrtest set a = 2 where b = 'foo' returning *;
-- But the reverse is allowed
update utrtest set a = 1 where b = 'qux' returning *;
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- The executor should not let unexercised FDWs shut down
update utrtest set a = 1 where b = 'foo';
-- Test that remote triggers work with update tuple routing
create trigger loct_br_insert_trigger before insert on loct
for each row execute procedure br_insert_trigfunc();
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition is a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 1 or a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 1 or a = 2 returning *;
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition isn't a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 2 returning *;
drop trigger loct_br_insert_trigger on loct;
-- We can move rows to a foreign partition that has been updated already,
-- but can't move rows to a foreign partition that hasn't been updated yet
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- Test the former case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 returning *;
update utrtest set a = 1 returning *;
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
-- Change the definition of utrtest so that the foreign partition get updated
-- after the local partition
delete from utrtest;
alter table utrtest detach partition remp;
drop foreign table remp;
alter table loct drop constraint loct_a_check;
alter table loct add check (a in (3));
create foreign table remp (a int check (a in (3)), b text) server loopback options (table_name 'loct');
alter table utrtest attach partition remp for values in (3);
insert into utrtest values (2, 'qux');
insert into utrtest values (3, 'xyzzy');
-- Test the latter case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 returning *;
update utrtest set a = 3 returning *; -- ERROR
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *;
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *; -- ERROR
drop table utrtest;
drop table loct;
-- Test copy tuple routing
create table ctrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table ctrtest attach partition remp1 for values in (1);
alter table ctrtest attach partition remp2 for values in (2);
copy ctrtest from stdin;
1 foo
2 qux
\.
select tableoid::regclass, * FROM ctrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
-- Copying into foreign partitions directly should work as well
copy remp1 from stdin;
1 bar
\.
select tableoid::regclass, * FROM remp1;
drop table ctrtest;
drop table loct1;
drop table loct2;
-- ===================================================================
-- test COPY FROM
-- ===================================================================
create table loc2 (f1 int, f2 text);
alter table loc2 set (autovacuum_enabled = 'false');
create foreign table rem2 (f1 int, f2 text) server loopback options(table_name 'loc2');
-- Test basic functionality
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
delete from rem2;
-- Test check constraints
alter table loc2 add constraint loc2_f1positive check (f1 >= 0);
alter foreign table rem2 add constraint rem2_f1positive check (f1 >= 0);
-- check constraint is enforced on the remote side, not locally
copy rem2 from stdin;
1 foo
2 bar
\.
copy rem2 from stdin; -- ERROR
-1 xyzzy
\.
select * from rem2;
alter foreign table rem2 drop constraint rem2_f1positive;
alter table loc2 drop constraint loc2_f1positive;
delete from rem2;
-- Test local triggers
create trigger trig_stmt_before before insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_stmt_after after insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before on rem2;
drop trigger trig_row_after on rem2;
drop trigger trig_stmt_before on rem2;
drop trigger trig_stmt_after on rem2;
delete from rem2;
create trigger trig_row_before_insert before insert on rem2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on rem2;
delete from rem2;
create trigger trig_null before insert on rem2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on rem2;
delete from rem2;
-- Test remote triggers
create trigger trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on loc2;
delete from rem2;
create trigger trig_null before insert on loc2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on loc2;
delete from rem2;
-- Test a combination of local and remote triggers
create trigger rem2_trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger rem2_trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger loc2_trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger rem2_trig_row_before on rem2;
drop trigger rem2_trig_row_after on rem2;
drop trigger loc2_trig_row_before_insert on loc2;
delete from rem2;
-- test COPY FROM with foreign table created in the same transaction
create table loc3 (f1 int, f2 text);
begin;
create foreign table rem3 (f1 int, f2 text)
server loopback options(table_name 'loc3');
copy rem3 from stdin;
1 foo
2 bar
\.
commit;
select * from rem3;
drop foreign table rem3;
drop table loc3;
*/
-- ===================================================================
-- test for TRUNCATE
-- ===================================================================
--Testcase 850:
CREATE FOREIGN TABLE tru_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable0');
--Testcase 851:
INSERT INTO "S 1".tru_rtable0 (SELECT x FROM generate_series(1,10) x);
-- CREATE TABLE tru_ptable (id int) PARTITION BY HASH(id);
-- CREATE TABLE tru_ptable__p0 PARTITION OF tru_ptable
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0);
-- CREATE TABLE tru_rtable1 (id int primary key);
-- CREATE FOREIGN TABLE tru_ftable__p1 (id int)
-- SERVER sqlite_svr OPTIONS (table 'tru_ptable');
-- INSERT INTO tru_ptable (SELECT x FROM generate_series(11,20) x);
--Testcase 852:
INSERT INTO "S 1".tru_pk_table (SELECT x FROM generate_series(1,10) x);
--Testcase 853:
INSERT INTO "S 1".tru_fk_table(fkey) (SELECT x % 10 + 1 FROM generate_series(5,25) x);
--Testcase 854:
CREATE FOREIGN TABLE tru_pk_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_pk_table');
--Testcase 855:
CREATE FOREIGN TABLE tru_ftable_parent (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_parent');
--Testcase 856:
CREATE FOREIGN TABLE tru_ftable_child () INHERITS (tru_ftable_parent)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_child');
--Testcase 857:
INSERT INTO "S 1".tru_rtable_parent (SELECT x FROM generate_series(1,8) x);
--Testcase 858:
INSERT INTO "S 1".tru_rtable_child (SELECT x FROM generate_series(10, 18) x);
-- normal truncate
--Testcase 859:
SELECT sum(id) FROM tru_ftable; -- 55
TRUNCATE tru_ftable;
--Testcase 860:
SELECT count(*) FROM "S 1".tru_rtable0; -- 0
--Testcase 861:
SELECT count(*) FROM tru_ftable; -- 0
-- 'truncatable' option
--Testcase 862:
ALTER SERVER sqlite_svr OPTIONS (ADD truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 863:
ALTER FOREIGN TABLE tru_ftable OPTIONS (ADD truncatable 'true');
TRUNCATE tru_ftable; -- accepted
--Testcase 864:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 865:
ALTER SERVER sqlite_svr OPTIONS (DROP truncatable);
--Testcase 866:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 867:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'true');
TRUNCATE tru_ftable; -- accepted
-- -- partitioned table with both local and foreign tables as partitions
-- SELECT sum(id) FROM tru_ptable; -- 155
-- TRUNCATE tru_ptable;
-- SELECT count(*) FROM tru_ptable; -- 0
-- SELECT count(*) FROM tru_ptable__p0; -- 0
-- SELECT count(*) FROM tru_ftable__p1; -- 0
-- SELECT count(*) FROM tru_rtable1; -- 0
-- 'CASCADE' option
--Testcase 868:
SELECT sum(id) FROM tru_pk_ftable; -- 55
-- SQLite FDW support TRUNCATE command by executing DELETE statement without WHERE clause.
-- In order to delete records in parent and child table subsequently,
-- SQLite FDW executes "PRAGMA foreign_keys = ON" before executing DELETE statement.
TRUNCATE tru_pk_ftable; -- success
TRUNCATE tru_pk_ftable CASCADE; -- success
--Testcase 869:
SELECT count(*) FROM tru_pk_ftable; -- 0
--Testcase 870:
SELECT count(*) FROM "S 1".tru_fk_table; -- also truncated,0
-- truncate two tables at a command
--Testcase 871:
INSERT INTO tru_ftable (SELECT x FROM generate_series(1,8) x);
--Testcase 872:
INSERT INTO tru_pk_ftable (SELECT x FROM generate_series(3,10) x);
--Testcase 873:
SELECT count(*) from tru_ftable; -- 8
--Testcase 874:
SELECT count(*) from tru_pk_ftable; -- 8
TRUNCATE tru_ftable, tru_pk_ftable;
--Testcase 875:
SELECT count(*) from tru_ftable; -- 0
--Testcase 876:
SELECT count(*) from tru_pk_ftable; -- 0
-- truncate with ONLY clause
-- Since ONLY is specified, the table tru_ftable_child that inherits
-- tru_ftable_parent locally is not truncated.
TRUNCATE ONLY tru_ftable_parent;
--Testcase 877:
SELECT sum(id) FROM tru_ftable_parent; -- 126
TRUNCATE tru_ftable_parent;
--Testcase 878:
SELECT count(*) FROM tru_ftable_parent; -- 0
-- -- in case when remote table has inherited children
-- CREATE TABLE tru_rtable0_child () INHERITS (tru_rtable0);
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(5,9) x);
-- INSERT INTO "S 1".tru_rtable0_child (SELECT x FROM generate_series(10,14) x);
-- SELECT sum(id) FROM tru_ftable; -- 95
-- -- Both parent and child tables in the foreign server are truncated
-- -- even though ONLY is specified because ONLY has no effect
-- -- when truncating a foreign table.
-- TRUNCATE ONLY tru_ftable;
-- SELECT count(*) FROM tru_ftable; -- 0
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(21,25) x);
-- INSERT INTO tru_rtable0_child (SELECT x FROM generate_series(26,30) x);
-- SELECT sum(id) FROM tru_ftable; -- 255
-- TRUNCATE tru_ftable; -- truncate both of parent and child
-- SELECT count(*) FROM tru_ftable; -- 0
-- cleanup
--Testcase 879:
DROP FOREIGN TABLE tru_ftable_parent, tru_ftable_child, tru_pk_ftable,tru_ftable;
-- DROP TABLE tru_rtable0, tru_rtable1, tru_ptable, tru_ptable__p0, tru_pk_table, tru_fk_table,
-- tru_rtable_parent,tru_rtable_child, tru_rtable0_child;
-- ===================================================================
-- test IMPORT FOREIGN SCHEMA
-- ===================================================================
--Testcase 728:
CREATE SCHEMA import_dest1;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest1;
--Testcase 477:
\det+ import_dest1.*
--Testcase 478:
\d import_dest1.*
-- Options
--Testcase 729:
CREATE SCHEMA import_dest2;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest2
OPTIONS (import_default 'true');
--Testcase 479:
\det+ import_dest2.*
--Testcase 480:
\d import_dest2.*
-- Check LIMIT TO and EXCEPT
--Testcase 730:
CREATE SCHEMA import_dest3;
IMPORT FOREIGN SCHEMA public LIMIT TO ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 481:
\det+ import_dest3.*
IMPORT FOREIGN SCHEMA public EXCEPT ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 482:
\det+ import_dest3.*
-- Assorted error cases
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest3;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO notthere;
IMPORT FOREIGN SCHEMA public FROM SERVER nowhere INTO notthere;
/*
-- Skip these test, sqlite fdw does not support fetch_size option, partition table
-- Check case of a type present only on the remote server.
-- We can fake this by dropping the type locally in our transaction.
CREATE TYPE "Colors" AS ENUM ('red', 'green', 'blue');
CREATE TABLE import_source.t5 (c1 int, c2 text collate "C", "Col" "Colors");
CREATE SCHEMA import_dest5;
BEGIN;
DROP TYPE "Colors" CASCADE;
IMPORT FOREIGN SCHEMA import_source LIMIT TO (t5)
FROM SERVER loopback INTO import_dest5; -- ERROR
ROLLBACK;
BEGIN;
CREATE SERVER fetch101 FOREIGN DATA WRAPPER postgres_fdw OPTIONS( fetch_size '101' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
ALTER SERVER fetch101 OPTIONS( SET fetch_size '202' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=202'];
CREATE FOREIGN TABLE table30000 ( x int ) SERVER fetch101 OPTIONS ( fetch_size '30000' );
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '60000');
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=60000'];
ROLLBACK;
-- ===================================================================
-- test partitionwise joins
-- ===================================================================
SET enable_partitionwise_join=on;
CREATE TABLE fprt1 (a int, b int, c varchar) PARTITION BY RANGE(a);
CREATE TABLE fprt1_p1 (LIKE fprt1);
CREATE TABLE fprt1_p2 (LIKE fprt1);
ALTER TABLE fprt1_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt1_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt1_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 2) i;
INSERT INTO fprt1_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 2) i;
CREATE FOREIGN TABLE ftprt1_p1 PARTITION OF fprt1 FOR VALUES FROM (0) TO (250)
SERVER loopback OPTIONS (table_name 'fprt1_p1', use_remote_estimate 'true');
CREATE FOREIGN TABLE ftprt1_p2 PARTITION OF fprt1 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (TABLE_NAME 'fprt1_p2');
ANALYZE fprt1;
ANALYZE fprt1_p1;
ANALYZE fprt1_p2;
CREATE TABLE fprt2 (a int, b int, c varchar) PARTITION BY RANGE(b);
CREATE TABLE fprt2_p1 (LIKE fprt2);
CREATE TABLE fprt2_p2 (LIKE fprt2);
ALTER TABLE fprt2_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt2_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt2_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 3) i;
INSERT INTO fprt2_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 3) i;
CREATE FOREIGN TABLE ftprt2_p1 (b int, c varchar, a int)
SERVER loopback OPTIONS (table_name 'fprt2_p1', use_remote_estimate 'true');
ALTER TABLE fprt2 ATTACH PARTITION ftprt2_p1 FOR VALUES FROM (0) TO (250);
CREATE FOREIGN TABLE ftprt2_p2 PARTITION OF fprt2 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (table_name 'fprt2_p2', use_remote_estimate 'true');
ANALYZE fprt2;
ANALYZE fprt2_p1;
ANALYZE fprt2_p2;
-- inner join three tables
EXPLAIN (COSTS OFF)
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
-- left outer join + nullable clause
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
-- with whole-row reference; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
-- join with lateral reference
EXPLAIN (COSTS OFF)
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
-- with PHVs, partitionwise join selected but no join pushdown
EXPLAIN (COSTS OFF)
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
-- test FOR UPDATE; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
RESET enable_partitionwise_join;
-- ===================================================================
-- test partitionwise aggregates
-- ===================================================================
CREATE TABLE pagg_tab (a int, b int, c text) PARTITION BY RANGE(a);
CREATE TABLE pagg_tab_p1 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p2 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p3 (LIKE pagg_tab);
INSERT INTO pagg_tab_p1 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 10;
INSERT INTO pagg_tab_p2 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 20 and (i % 30) >= 10;
INSERT INTO pagg_tab_p3 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 30 and (i % 30) >= 20;
-- Create foreign partitions
CREATE FOREIGN TABLE fpagg_tab_p1 PARTITION OF pagg_tab FOR VALUES FROM (0) TO (10) SERVER loopback OPTIONS (table_name 'pagg_tab_p1');
CREATE FOREIGN TABLE fpagg_tab_p2 PARTITION OF pagg_tab FOR VALUES FROM (10) TO (20) SERVER loopback OPTIONS (table_name 'pagg_tab_p2');
CREATE FOREIGN TABLE fpagg_tab_p3 PARTITION OF pagg_tab FOR VALUES FROM (20) TO (30) SERVER loopback OPTIONS (table_name 'pagg_tab_p3');
ANALYZE pagg_tab;
ANALYZE fpagg_tab_p1;
ANALYZE fpagg_tab_p2;
ANALYZE fpagg_tab_p3;
-- When GROUP BY clause matches with PARTITION KEY.
-- Plan with partitionwise aggregates is disabled
SET enable_partitionwise_aggregate TO false;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Plan with partitionwise aggregates is enabled
SET enable_partitionwise_aggregate TO true;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Check with whole-row reference
-- Should have all the columns in the target list for the given relation
EXPLAIN (VERBOSE, COSTS OFF)
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- When GROUP BY clause does not match with PARTITION KEY.
EXPLAIN (COSTS OFF)
SELECT b, avg(a), max(a), count(*) FROM pagg_tab GROUP BY b HAVING sum(a) < 700 ORDER BY 1;
*/
/*
-- Skip these tests, sqlite fdw does not support nosuper user.
-- ===================================================================
-- access rights and superuser
-- ===================================================================
-- Non-superuser cannot create a FDW without a password in the connstr
CREATE ROLE regress_nosuper NOSUPERUSER;
GRANT USAGE ON FOREIGN DATA WRAPPER sqlite_fdw TO regress_nosuper;
SET ROLE regress_nosuper;
SHOW is_superuser;
-- This will be OK, we can create the FDW
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_nopw FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- But creation of user mappings for non-superusers should fail
CREATE USER MAPPING FOR public SERVER sqlite_nopw;
CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
CREATE FOREIGN TABLE ft1_nopw (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_nopw;
ALTER FOREIGN TABLE ft1_nopw OPTIONS (table 'T 1');
ALTER FOREIGN TABLE ft1_nopw ALTER COLUMN c1 OPTIONS (column_name 'C 1');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- If we add a password to the connstr it'll fail, because we don't allow passwords
-- in connstrs only in user mappings.
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw')$$;
END;
$d$;
-- If we add a password for our user mapping instead, we should get a different
-- error because the password wasn't actually *used* when we run with trust auth.
--
-- This won't work with installcheck, but neither will most of the FDW checks.
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- Unpriv user cannot make the mapping passwordless
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- But the superuser can
ALTER USER MAPPING FOR regress_nosuper SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SET ROLE regress_nosuper;
-- Should finally work now
SELECT 1 FROM ft1_nopw LIMIT 1;
-- unpriv user also cannot set sslcert / sslkey on the user mapping
-- first set password_required so we see the right error messages
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (SET password_required 'true');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslcert 'foo.crt');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslkey 'foo.key');
-- We're done with the role named after a specific user and need to check the
-- changes to the public mapping.
DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
-- This will fail again as it'll resolve the user mapping for public, which
-- lacks password_required=false
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- The user mapping for public is passwordless and lacks the password_required=false
-- mapping option, but will work because the current user is a superuser.
SELECT 1 FROM ft1_nopw LIMIT 1;
-- cleanup
DROP USER MAPPING FOR public SERVER sqlite_nopw;
DROP OWNED BY regress_nosuper;
DROP ROLE regress_nosuper;
-- Clean-up
RESET enable_partitionwise_aggregate;
*/
-- Two-phase transactions are not supported.
BEGIN;
--Testcase 731:
SELECT count(*) FROM ft1;
-- error here
--Testcase 732:
PREPARE TRANSACTION 'fdw_tpc';
ROLLBACK;
-- ===================================================================
-- reestablish new connection
-- ===================================================================
-- -- Test case relative with option application_name is not suitable for SQLite FDW.
-- -- Because this option is in libpq of postgres.
-- -- Change application_name of remote connection to special one
-- -- so that we can easily terminate the connection later.
-- ALTER SERVER sqlite_svr OPTIONS (application_name 'fdw_retry_check');
-- -- If debug_discard_caches is active, it results in
-- -- dropping remote connections after every transaction, making it
-- -- impossible to test termination meaningfully. So turn that off
-- -- for this test.
-- SET debug_discard_caches = 0;
-- -- Make sure we have a remote connection.
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- Terminate the remote connection and wait for the termination to complete.
-- SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- -- This query should detect the broken connection when starting new remote
-- -- transaction, reestablish new connection, and then succeed.
-- BEGIN;
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- If we detect the broken connection when starting a new remote
-- -- subtransaction, we should fail instead of establishing a new connection.
-- -- Terminate the remote connection and wait for the termination to complete.
-- SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- SAVEPOINT s;
-- -- The text of the error might vary across platforms, so only show SQLSTATE.
-- \set VERBOSITY sqlstate
-- SELECT 1 FROM ft1 LIMIT 1; -- should fail
-- \set VERBOSITY default
-- COMMIT;
-- RESET debug_discard_caches;
-- =============================================================================
-- test connection invalidation cases and sqlite_fdw_get_connections function
-- =============================================================================
-- Let's ensure to close all the existing cached connections.
--Testcase 880:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 881:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- This test case is for closing the connection in sqlitefdw_xact_callback
BEGIN;
-- Connection xact depth becomes 1 i.e. the connection is in midst of the xact.
--Testcase 882:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 883:
SELECT 1 FROM ft7 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3 should be
-- output.
--Testcase 884:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Connections are not closed at the end of the alter and drop statements.
-- That's because the connections are in midst of this xact,
-- they are just marked as invalid in sqlitefdw_inval_callback.
--Testcase 885:
ALTER SERVER sqlite_svr OPTIONS (ADD keep_connections 'off');
--Testcase 886:
DROP SERVER sqlite_svr3 CASCADE;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3
-- should be output as invalid connections. Also the server name for
-- sqlite_svr3 should be NULL because the server was dropped.
--Testcase 887:
SELECT * FROM sqlite_fdw_get_connections() ORDER BY 1;
-- The invalid connections get closed in sqlitefdw_xact_callback during commit.
COMMIT;
--Testcase 888:
ALTER SERVER sqlite_svr OPTIONS (DROP keep_connections);
-- All cached connections were closed while committing above xact, so no
-- records should be output.
--Testcase 889:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =======================================================================
-- test sqlite_fdw_disconnect and sqlite_fdw_disconnect_all functions
-- =======================================================================
BEGIN;
-- Ensure to cache loopback connection.
--Testcase 890:
SELECT 1 FROM ft1 LIMIT 1;
-- Ensure to cache loopback2 connection.
--Testcase 891:
SELECT 1 FROM ft6 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 892:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Issue a warning and return false as sqlite_svr connection is still in use and
-- can not be closed.
--Testcase 893:
SELECT sqlite_fdw_disconnect('sqlite_svr');
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 894:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Return false as connections are still in use, warnings are issued.
-- But disable warnings temporarily because the order of them is not stable.
--Testcase 895:
SET client_min_messages = 'ERROR';
--Testcase 896:
SELECT sqlite_fdw_disconnect_all();
--Testcase 897:
RESET client_min_messages;
COMMIT;
-- Ensure that sqlite_svr2 connection is closed.
--Testcase 898:
SELECT 1 FROM sqlite_fdw_disconnect('sqlite_svr2');
--Testcase 899:
SELECT server_name FROM sqlite_fdw_get_connections() WHERE server_name = 'sqlite_svr2';
-- Return false as sqlite_svr2 connection is closed already.
--Testcase 900:
SELECT sqlite_fdw_disconnect('sqlite_svr2');
-- Return an error as there is no foreign server with given name.
--Testcase 901:
SELECT sqlite_fdw_disconnect('unknownserver');
-- Let's ensure to close all the existing cached connections.
--Testcase 902:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 903:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =============================================================================
-- test case for having multiple cached connections for a foreign server
-- SQLite FDW does not support User Mapping, so cached connection is identified
-- by only serverid (not like other FDWs use key including serverid and userid),
-- and there is only one server for all users, so there is only one cached connection.
-- In case of using key including serverid and userid, if many users are used,
-- there will be many cached connections.
-- =============================================================================
--Testcase 904:
CREATE ROLE regress_multi_conn_user1 SUPERUSER;
--Testcase 905:
CREATE ROLE regress_multi_conn_user2 SUPERUSER;
--Testcase 906:
-- CREATE USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 907:
-- CREATE USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
BEGIN;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user1
--Testcase 908:
SET ROLE regress_multi_conn_user1;
--Testcase 909:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 910:
RESET ROLE;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user2
--Testcase 911:
SET ROLE regress_multi_conn_user2;
--Testcase 912:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 913:
RESET ROLE;
-- Should output one cached connection for sqlite_svr server
--Testcase 914:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
COMMIT;
-- Let's ensure to close all the existing cached connections.
--Testcase 915:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 916:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Clean up
--Testcase 917:
-- DROP USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 918:
-- DROP USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
--Testcase 919:
DROP ROLE regress_multi_conn_user1;
--Testcase 920:
DROP ROLE regress_multi_conn_user2;
-- ===================================================================
-- Test foreign server level option keep_connections
-- ===================================================================
-- By default, the connections associated with foreign server are cached i.e.
-- keep_connections option is on. Set it to off.
--Testcase 921:
ALTER SERVER sqlite_svr OPTIONS (keep_connections 'off');
-- connection to sqlite_svr server is closed at the end of xact
-- as keep_connections was set to off.
--Testcase 922:
SELECT 1 FROM ft1 LIMIT 1;
-- No cached connections, so no records should be output.
--Testcase 923:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
--Testcase 924:
ALTER SERVER sqlite_svr OPTIONS (SET keep_connections 'on');
-- ===================================================================
-- batch insert
-- ===================================================================
BEGIN;
--Testcase 925:
CREATE SERVER batch10 FOREIGN DATA WRAPPER sqlite_fdw OPTIONS( batch_size '10' );
--Testcase 926:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 927:
ALTER SERVER batch10 OPTIONS( SET batch_size '20' );
--Testcase 928:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 929:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=20'];
--Testcase 930:
CREATE FOREIGN TABLE table30 ( x int ) SERVER batch10 OPTIONS ( batch_size '30' );
--Testcase 931:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 932:
ALTER FOREIGN TABLE table30 OPTIONS ( SET batch_size '40');
--Testcase 933:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 934:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=40'];
ROLLBACK;
--Testcase 935:
CREATE FOREIGN TABLE ftable ( x int OPTIONS (key 'true') ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '10' );
--Testcase 936:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 937:
INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 938:
INSERT INTO ftable SELECT * FROM generate_series(11, 31) i;
--Testcase 939:
INSERT INTO ftable VALUES (32);
--Testcase 940:
INSERT INTO ftable VALUES (33), (34);
--Testcase 941:
SELECT COUNT(*) FROM ftable;
--Testcase 942:
DELETE FROM ftable;
--Testcase 943:
DROP FOREIGN TABLE ftable;
-- try if large batches exceed max number of bind parameters
--Testcase 944:
CREATE FOREIGN TABLE ftable ( x int OPTIONS (key 'true') ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '100000' );
--Testcase 945:
INSERT INTO ftable SELECT * FROM generate_series(1, 70000) i;
--Testcase 946:
SELECT COUNT(*) FROM ftable;
--Testcase 947:
DELETE FROM ftable;
--Testcase 948:
DROP FOREIGN TABLE ftable;
-- Disable batch insert
--Testcase 949:
CREATE FOREIGN TABLE ftable ( x int ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '1' );
--Testcase 950:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (1), (2);
--Testcase 951:
INSERT INTO ftable VALUES (1), (2);
--Testcase 952:
SELECT COUNT(*) FROM ftable;
-- Disable batch inserting into foreign tables with BEFORE ROW INSERT triggers
-- even if the batch_size option is enabled.
--Testcase 977:
ALTER FOREIGN TABLE ftable OPTIONS ( SET batch_size '10' );
--Testcase 978:
CREATE TRIGGER trig_row_before BEFORE INSERT ON ftable
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 980:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (3), (4);
--Testcase 981:
INSERT INTO ftable VALUES (3), (4);
--Testcase 982:
SELECT COUNT(*) FROM ftable;
-- Clean up
--Testcase 983:
DROP TRIGGER trig_row_before ON ftable;
--Testcase 953:
DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- -- Use partitioning
-- CREATE TABLE batch_table ( x int ) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 0)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p0', batch_size '10');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 1)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p1', batch_size '1');
-- CREATE TABLE batch_table_p2
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 2);
-- INSERT INTO "S 1".batch_table SELECT * FROM generate_series(1, 66) i;
-- SELECT COUNT(*) FROM "S 1".batch_table;
-- -- Check that enabling batched inserts doesn't interfere with cross-partition
-- -- updates
-- CREATE TABLE batch_cp_upd_test (a int) PARTITION BY LIST (a);
-- CREATE TABLE batch_cp_upd_test1 (LIKE batch_cp_upd_test);
-- CREATE FOREIGN TABLE batch_cp_upd_test1_f
-- PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (1)
-- SERVER sqlite_svr
-- OPTIONS (table_name 'batch_cp_upd_test1', batch_size '10');
-- CREATE TABLE batch_cp_up_test1 PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (2);
-- INSERT INTO batch_cp_upd_test VALUES (1), (2);
-- -- The following moves a row from the local partition to the foreign one
-- UPDATE batch_cp_upd_test t SET a = 1 FROM (VALUES (1), (2)) s(a) WHERE t.a = s.a;
-- SELECT tableoid::regclass, * FROM batch_cp_upd_test;
-- -- Clean up
-- DROP TABLE batch_table, batch_cp_upd_test, batch_table_p0, batch_table_p1 CASCADE;
-- -- Use partitioning
-- ALTER SERVER loopback OPTIONS (ADD batch_size '10');
-- CREATE TABLE batch_table ( x int, field1 text, field2 text) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- ALTER TABLE batch_table_p0 ADD CONSTRAINT p0_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p0');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- ALTER TABLE batch_table_p1 ADD CONSTRAINT p1_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 1)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p1');
-- INSERT INTO batch_table SELECT i, 'test'||i, 'test'|| i FROM generate_series(1, 50) i;
-- SELECT COUNT(*) FROM batch_table;
-- SELECT * FROM batch_table ORDER BY x;
-- ALTER SERVER loopback OPTIONS (DROP batch_size);
-- ===================================================================
-- test asynchronous execution
-- ===================================================================
-- ALTER SERVER loopback OPTIONS (DROP extensions);
-- ALTER SERVER loopback OPTIONS (ADD async_capable 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD async_capable 'true');
-- CREATE TABLE async_pt (a int, b int, c text) PARTITION BY RANGE (a);
-- CREATE TABLE base_tbl1 (a int, b int, c text);
-- CREATE TABLE base_tbl2 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p1 PARTITION OF async_pt FOR VALUES FROM (1000) TO (2000)
-- SERVER loopback OPTIONS (table_name 'base_tbl1');
-- CREATE FOREIGN TABLE async_p2 PARTITION OF async_pt FOR VALUES FROM (2000) TO (3000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl2');
-- INSERT INTO async_p1 SELECT 1000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- INSERT INTO async_p2 SELECT 2000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- -- simple queries
-- CREATE TABLE result_tbl (a int, b int, c text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- Check case where multiple partitions use the same connection
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl3');
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- DROP FOREIGN TABLE async_p3;
-- DROP TABLE base_tbl3;
-- -- Check case where the partitioned table has local/remote partitions
-- CREATE TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000);
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- partitionwise joins
-- SET enable_partitionwise_join TO true;
-- CREATE TABLE join_tbl (a1 int, b1 int, c1 text, a2 int, b2 int, c2 text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_partitionwise_join;
-- -- Test rescan of an async Append node with do_exec_prune=false
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_hashjoin;
-- -- Test interaction of async execution with plan-time partition pruning
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 3000;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 2000;
-- -- Test interaction of async execution with run-time partition pruning
-- SET plan_cache_mode TO force_generic_plan;
-- PREPARE async_pt_query (int, int) AS
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE a < $1 AND b === $2;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (3000, 505);
-- EXECUTE async_pt_query (3000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (2000, 505);
-- EXECUTE async_pt_query (2000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- RESET plan_cache_mode;
-- CREATE TABLE local_tbl(a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo'), (2505, 505, 'bar');
-- ANALYZE local_tbl;
-- CREATE INDEX base_tbl1_idx ON base_tbl1 (a);
-- CREATE INDEX base_tbl2_idx ON base_tbl2 (a);
-- CREATE INDEX async_p3_idx ON async_p3 (a);
-- ANALYZE base_tbl1;
-- ANALYZE base_tbl2;
-- ANALYZE async_p3;
-- ALTER FOREIGN TABLE async_p1 OPTIONS (use_remote_estimate 'true');
-- ALTER FOREIGN TABLE async_p2 OPTIONS (use_remote_estimate 'true');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- ALTER FOREIGN TABLE async_p1 OPTIONS (DROP use_remote_estimate);
-- ALTER FOREIGN TABLE async_p2 OPTIONS (DROP use_remote_estimate);
-- DROP TABLE local_tbl;
-- DROP INDEX base_tbl1_idx;
-- DROP INDEX base_tbl2_idx;
-- DROP INDEX async_p3_idx;
-- -- UNION queries
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION ALL
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION ALL
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- Disable async execution if we use gating Result nodes for pseudoconstant
-- -- quals
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE CURRENT_USER = SESSION_USER;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- (SELECT * FROM async_p1 WHERE CURRENT_USER = SESSION_USER)
-- UNION ALL
-- (SELECT * FROM async_p2 WHERE CURRENT_USER = SESSION_USER);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM ((SELECT * FROM async_p1 WHERE b < 10) UNION ALL (SELECT * FROM async_p2 WHERE b < 10)) s WHERE CURRENT_USER = SESSION_USER;
-- -- Test that pending requests are processed properly
-- SET enable_mergejoin TO false;
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- CREATE TABLE local_tbl (a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo');
-- ANALYZE local_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- -- Check with foreign modify
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE remote_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl3');
-- INSERT INTO remote_tbl VALUES (2505, 505, 'bar');
-- CREATE TABLE base_tbl4 (a int, b int, c text);
-- CREATE FOREIGN TABLE insert_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl4');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- SELECT * FROM insert_tbl ORDER BY a;
-- -- Check with direct modify
-- EXPLAIN (VERBOSE, COSTS OFF)
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- DROP TABLE local_tbl;
-- DROP FOREIGN TABLE remote_tbl;
-- DROP FOREIGN TABLE insert_tbl;
-- DROP TABLE base_tbl3;
-- DROP TABLE base_tbl4;
-- RESET enable_mergejoin;
-- RESET enable_hashjoin;
-- -- Test that UPDATE/DELETE with inherited target works with async_capable enabled
-- EXPLAIN (VERBOSE, COSTS OFF)
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- -- Check EXPLAIN ANALYZE for a query that scans empty partitions asynchronously
-- DELETE FROM async_p1;
-- DELETE FROM async_p2;
-- DELETE FROM async_p3;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt;
-- -- Clean up
-- DROP TABLE async_pt;
-- DROP TABLE base_tbl1;
-- DROP TABLE base_tbl2;
-- DROP TABLE result_tbl;
-- DROP TABLE join_tbl;
-- -- Test that an asynchronous fetch is processed before restarting the scan in
-- -- ReScanForeignScan
-- CREATE TABLE base_tbl (a int, b int);
-- INSERT INTO base_tbl VALUES (1, 11), (2, 22), (3, 33);
-- CREATE FOREIGN TABLE foreign_tbl (b int)
-- SERVER loopback OPTIONS (table_name 'base_tbl');
-- CREATE FOREIGN TABLE foreign_tbl2 () INHERITS (foreign_tbl)
-- SERVER loopback OPTIONS (table_name 'base_tbl');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl);
-- SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl);
-- -- Clean up
-- DROP FOREIGN TABLE foreign_tbl CASCADE;
-- DROP TABLE base_tbl;
-- ALTER SERVER loopback OPTIONS (DROP async_capable);
-- ALTER SERVER loopback2 OPTIONS (DROP async_capable);
-- ===================================================================
-- test invalid server and foreign table options
-- ===================================================================
-- -- Invalid fdw_startup_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_startup_cost '100$%$#$#');
-- -- Invalid fdw_tuple_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_tuple_cost '100$%$#$#');
-- -- Invalid fetch_size option
-- CREATE FOREIGN TABLE inv_fsz (c1 int )
-- SERVER loopback OPTIONS (fetch_size '100$%$#$#');
-- Invalid batch_size option
--Testcase 954:
CREATE FOREIGN TABLE inv_bsz (c1 int )
SERVER sqlite_svr OPTIONS (batch_size '100$%$#$#');
-- -- No option is allowed to be specified at foreign data wrapper level
-- ALTER FOREIGN DATA WRAPPER postgres_fdw OPTIONS (nonexistent 'fdw');
-- -- ===================================================================
-- -- test postgres_fdw.application_name GUC
-- -- ===================================================================
-- --- Turn debug_discard_caches off for this test to make sure that
-- --- the remote connection is alive when checking its application_name.
-- SET debug_discard_caches = 0;
-- -- Specify escape sequences in application_name option of a server
-- -- object so as to test that they are replaced with status information
-- -- expectedly.
-- --
-- -- Since pg_stat_activity.application_name may be truncated to less than
-- -- NAMEDATALEN characters, note that substring() needs to be used
-- -- at the condition of test query to make sure that the string consisting
-- -- of database name and process ID is also less than that.
-- ALTER SERVER loopback2 OPTIONS (application_name 'fdw_%d%p');
-- SELECT 1 FROM ft6 LIMIT 1;
-- SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name =
-- substring('fdw_' || current_database() || pg_backend_pid() for
-- current_setting('max_identifier_length')::int);
-- -- postgres_fdw.application_name overrides application_name option
-- -- of a server object if both settings are present.
-- SET postgres_fdw.application_name TO 'fdw_%a%u%%';
-- SELECT 1 FROM ft6 LIMIT 1;
-- SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name =
-- substring('fdw_' || current_setting('application_name') ||
-- CURRENT_USER || '%' for current_setting('max_identifier_length')::int);
-- -- Test %c (session ID) and %C (cluster name) escape sequences.
-- SET postgres_fdw.application_name TO 'fdw_%C%c';
-- SELECT 1 FROM ft6 LIMIT 1;
-- SELECT pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name =
-- substring('fdw_' || current_setting('cluster_name') ||
-- to_hex(trunc(EXTRACT(EPOCH FROM (SELECT backend_start FROM
-- pg_stat_get_activity(pg_backend_pid()))))::integer) || '.' ||
-- to_hex(pg_backend_pid())
-- for current_setting('max_identifier_length')::int);
-- --Clean up
-- RESET postgres_fdw.application_name;
-- RESET debug_discard_caches;
-- -- ===================================================================
-- -- test parallel commit
-- -- ===================================================================
-- ALTER SERVER loopback OPTIONS (ADD parallel_commit 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD parallel_commit 'true');
-- CREATE TABLE ploc1 (f1 int, f2 text);
-- CREATE FOREIGN TABLE prem1 (f1 int, f2 text)
-- SERVER loopback OPTIONS (table_name 'ploc1');
-- CREATE TABLE ploc2 (f1 int, f2 text);
-- CREATE FOREIGN TABLE prem2 (f1 int, f2 text)
-- SERVER loopback2 OPTIONS (table_name 'ploc2');
-- BEGIN;
-- INSERT INTO prem1 VALUES (101, 'foo');
-- INSERT INTO prem2 VALUES (201, 'bar');
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (102, 'foofoo');
-- INSERT INTO prem2 VALUES (202, 'barbar');
-- RELEASE SAVEPOINT s;
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- -- This tests executing DEALLOCATE ALL against foreign servers in parallel
-- -- during pre-commit
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (103, 'baz');
-- INSERT INTO prem2 VALUES (203, 'qux');
-- ROLLBACK TO SAVEPOINT s;
-- RELEASE SAVEPOINT s;
-- INSERT INTO prem1 VALUES (104, 'bazbaz');
-- INSERT INTO prem2 VALUES (204, 'quxqux');
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- ALTER SERVER loopback OPTIONS (DROP parallel_commit);
-- ALTER SERVER loopback2 OPTIONS (DROP parallel_commit);
-- Clean-up
--Testcase 733:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 734:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 735:
DROP SERVER sqlite_svr CASCADE;
--Testcase 736:
DROP SERVER sqlite_svr2 CASCADE;
--Testcase 737:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/extra/update.sql
================================================
--
-- UPDATE syntax tests
--
--Testcase 32:
CREATE EXTENSION sqlite_fdw;
--Testcase 33:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 34:
CREATE FOREIGN TABLE update_test (
i INT OPTIONS (key 'true'),
a INT DEFAULT 10,
b INT,
c TEXT
) SERVER sqlite_svr;
--Testcase 35:
CREATE FOREIGN TABLE upsert_test (
a INT OPTIONS (key 'true'),
b TEXT
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO update_test VALUES (1, 5, 10, 'foo');
--Testcase 2:
INSERT INTO update_test(i, b, a) VALUES (2, 15, 10);
--Testcase 3:
SELECT * FROM update_test;
--Testcase 4:
UPDATE update_test SET a = DEFAULT, b = DEFAULT;
--Testcase 5:
SELECT * FROM update_test;
-- aliases for the UPDATE target table
--Testcase 6:
UPDATE update_test AS t SET b = 10 WHERE t.a = 10;
--Testcase 7:
SELECT * FROM update_test;
--Testcase 8:
UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10;
--Testcase 9:
SELECT * FROM update_test;
--
-- Test VALUES in FROM
--
--Testcase 10:
UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j)
WHERE update_test.b = v.j;
--Testcase 11:
SELECT * FROM update_test;
-- fail, wrong data type:
--Testcase 12:
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
--
--Testcase 13:
INSERT INTO update_test SELECT i+2,a,b+1,c FROM update_test;
--Testcase 14:
SELECT * FROM update_test;
--Testcase 15:
UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo';
--Testcase 16:
SELECT * FROM update_test;
--Testcase 17:
UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10;
--Testcase 18:
SELECT * FROM update_test;
-- fail, multi assignment to same column:
--Testcase 19:
UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10;
-- uncorrelated sub-select:
--Testcase 20:
UPDATE update_test
SET (b,a) = (select a,b from update_test where b = 41 and c = 'car')
WHERE a = 100 AND b = 20;
--Testcase 21:
SELECT * FROM update_test;
-- correlated sub-select:
--Testcase 22:
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);
--Testcase 23:
SELECT * FROM update_test;
-- fail, multiple rows supplied:
--Testcase 24:
UPDATE update_test SET (b,a) = (select a+1,b from update_test);
-- set to null if no rows supplied:
--Testcase 25:
UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000)
WHERE a = 11;
--Testcase 26:
SELECT * FROM update_test;
-- *-expansion should work in this context:
--Testcase 27:
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:
--Testcase 28:
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
--Testcase 29:
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.
--Testcase 30:
UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car';
--Testcase 31:
SELECT a, b, char_length(c) FROM update_test;
-- Check multi-assignment with a Result node to handle a one-time filter.
--Testcase 36:
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;
--Testcase 37:
UPDATE update_test t
SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a)
WHERE CURRENT_USER = SESSION_USER;
--Testcase 38:
SELECT a, b, char_length(c) FROM update_test;
/* Skip, sqlite fdw does not support ON CONFLICT DO UPDATE
-- 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 FOREIGN TABLE update_test;
DROP FOREIGN TABLE upsert_test;
*/
/*Skip, sqlite fdw does not support create partition table
-- 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);
*/
--drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 39:
DROP SERVER sqlite_svr;
--Testcase 40:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/libsqlite.sql
================================================
-- Test for SQLite library code source and defaults
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
SELECT sqlite_fdw_sqlite_version();
--Testcase 3:
SELECT length(sqlite_fdw_sqlite_code_source());
--Testcase 4:
SELECT sqlite_fdw_sqlite_code_source();
--Testcase 7:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/selectfunc.sql
================================================
SET datestyle=ISO;
SET timezone='Japan';
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER server1 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/selectfunc.db');
--CREATE USER MAPPING FOR CURRENT_USER SERVER server1 OPTIONS(user 'user', password 'pass');
--IMPORT FOREIGN SCHEMA public FROM SERVER server1 INTO public OPTIONS(import_time_text 'false');
--Testcase 3:
CREATE FOREIGN TABLE s3(id text OPTIONS (key 'true'), time timestamp, tag1 text, value1 float, value2 int, value3 float, value4 int, str1 text, str2 text) SERVER server1;
-- s3 (value1 as float8, value2 as bigint)
--Testcase 4:
\d s3;
--Testcase 5:
SELECT * FROM s3;
-- select float8() (not pushdown, remove float8, explain)
-- EXPLAIN VERBOSE
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select float8() (not pushdown, remove float8, result)
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select sqrt (builtin function, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (buitin function, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function,, not pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, not pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select abs (builtin function, explain)
--Testcase 6:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (buitin function, result)
--Testcase 7:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (builtin function, not pushdown constraints, explain)
--Testcase 8:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, not pushdown constraints, result)
--Testcase 9:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, pushdown constraints, explain)
--Testcase 10:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select abs (builtin function, pushdown constraints, result)
--Testcase 11:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select log (builtin function, need to swap arguments, numeric cast, explain)
-- log_(v) : postgresql (base, v), sqlite (v, base)
-- EXPLAIN VERBOSE
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (builtin function, need to swap arguments, numeric cast, result)
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, result)
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, result)
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, result)
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log2 (stub function, explain)
-- EXPLAIN VERBOSE
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select log2 (stub function, result)
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select spread (stub agg function, explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, result)
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, raise exception if not expected type)
-- SELECT spread(value1::numeric),spread(value2::numeric),spread(value3::numeric),spread(value4::numeric) FROM s3;
-- sqlite fdw does not have spread()
-- select abs as nest function with agg (pushdown, explain)
--Testcase 12:
EXPLAIN VERBOSE
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest function with agg (pushdown, result)
--Testcase 13:
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest with log2 (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs as nest with log2 (pushdown, result)
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs with non pushdown func and explicit constant (explain)
--Testcase 14:
EXPLAIN VERBOSE
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select abs with non pushdown func and explicit constant (result)
--Testcase 15:
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select sqrt as nest function with agg and explicit constant (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant (pushdown, result)
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant and tag (error, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1, tag1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select spread (stub agg function and group by influx_time() and tag) (explain)
-- EXPLAIN VERBOSE
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by influx_time() and tag) (result)
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by tag only) (result)
-- SELECT tag1,spread("value1") FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY tag1;
-- sqlite fdw does not have spread()
-- select spread (stub agg function and other aggs) (result)
-- SELECT sum("value1"),spread("value1"),count("value1") FROM s3;
-- sqlite fdw does not have spread()
-- select abs with order by (explain)
--Testcase 16:
EXPLAIN VERBOSE
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by (result)
--Testcase 17:
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by index (result)
--Testcase 18:
SELECT value1, abs(1-value1) FROM s3 order by 2,1;
-- select abs with order by index (result)
--Testcase 19:
SELECT value1, abs(1-value1) FROM s3 order by 1,2;
-- select abs and as
--Testcase 20:
SELECT abs(value3) as abs1 FROM s3;
-- select spread over join query (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread over join query (result, stub call error)
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread with having (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select spread with having (explain, cannot pushdown, stub call error)
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select abs with arithmetic and tag in the middle (explain)
--Testcase 21:
EXPLAIN VERBOSE
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select abs with arithmetic and tag in the middle (result)
--Testcase 22:
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select with order by limit (explain)
--Testcase 23:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select with order by limit (explain)
--Testcase 24:
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select mixing with non pushdown func (all not pushdown, explain)
--Testcase 25:
EXPLAIN VERBOSE
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- select mixing with non pushdown func (result)
--Testcase 26:
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- sqlite data prep
-- sqlite pushdown supported functions (explain)
--Testcase 27:
EXPLAIN VERBOSE
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown supported functions (result)
--Testcase 28:
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown nest functions (explain)
--Testcase 32:
EXPLAIN VERBOSE
SELECT round(abs(value2), 0) FROM s3;
-- sqlite pushdown nest functions (result)
--Testcase 33:
SELECT round(abs(value2), 0) FROM s3;
-- select mod (builtin function, explain)
--Testcase 34:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, result)
--Testcase 35:
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, not pushdown constraints, explain)
--Testcase 36:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, not pushdown constraints, result)
--Testcase 37:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, pushdown constraints, explain)
--Testcase 38:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, pushdown constraints, result)
--Testcase 39:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 40:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 41:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 42:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 43:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod as nest function with agg (pushdown, explain)
--Testcase 44:
EXPLAIN VERBOSE
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest function with agg (pushdown, result)
--Testcase 45:
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, explain)
--Testcase 46:
EXPLAIN VERBOSE
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, result)
--Testcase 47:
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod with non pushdown func and explicit constant (explain)
--Testcase 48:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with non pushdown func and explicit constant (result)
--Testcase 49:
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with order by (explain)
--Testcase 50:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by (result)
--Testcase 51:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by index (result)
--Testcase 52:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 2,1;
-- select mod with order by index (result)
--Testcase 53:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 1,2;
-- select mod with group by (explain)
--Testcase 54:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by (result)
--Testcase 55:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by index (result)
--Testcase 56:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 2,1;
-- select mod with group by index (result)
--Testcase 57:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2;
-- select mod with group by having (explain)
--Testcase 58:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by having (result)
--Testcase 59:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by index having (result)
--Testcase 60:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2 HAVING value1 > 1;
-- select mod and as
--Testcase 61:
SELECT value1, mod(value2, 2) as mod1 FROM s3;
--Testcase 29:
DROP FOREIGN TABLE s3;
--Testcase 30:
DROP SERVER server1;
--Testcase 31:
DROP EXTENSION sqlite_fdw;
================================================
FILE: sql/15.7/sqlite_fdw.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 129:
CREATE EXTENSION sqlite_fdw;
--Testcase 130:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 131:
CREATE FOREIGN TABLE department(department_id int OPTIONS (key 'true'), department_name text) SERVER sqlite_svr;
--Testcase 132:
CREATE FOREIGN TABLE employee(emp_id int OPTIONS (key 'true'), emp_name text, emp_dept_id int) SERVER sqlite_svr;
--Testcase 133:
CREATE FOREIGN TABLE empdata(emp_id int OPTIONS (key 'true'), emp_dat bytea) SERVER sqlite_svr;
--Testcase 134:
CREATE FOREIGN TABLE numbers(a int OPTIONS (key 'true'), b varchar(255)) SERVER sqlite_svr;
--Testcase 135:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 136:
CREATE FOREIGN TABLE noprimary(a int, b text) SERVER sqlite_svr;
-- updatable option test (github pull 59)
CREATE FOREIGN TABLE RO_RW_test(i int OPTIONS (key 'true'), a text, b float, c int) SERVER sqlite_svr;
--Testcase 1:
SELECT * FROM department LIMIT 10;
--Testcase 2:
SELECT * FROM employee LIMIT 10;
--Testcase 3:
SELECT * FROM empdata LIMIT 10;
--Testcase 4:
INSERT INTO department VALUES(generate_series(1,100), 'dept - ' || generate_series(1,100));
--Testcase 5:
INSERT INTO employee VALUES(generate_series(1,100), 'emp - ' || generate_series(1,100), generate_series(1,100));
--Testcase 6:
INSERT INTO empdata VALUES(1, decode ('01234567', 'hex'));
--Testcase 7:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 8:
INSERT INTO numbers VALUES(2, 'Two');
--Testcase 9:
INSERT INTO numbers VALUES(3, 'Three');
--Testcase 10:
INSERT INTO numbers VALUES(4, 'Four');
--Testcase 11:
INSERT INTO numbers VALUES(5, 'Five');
--Testcase 12:
INSERT INTO numbers VALUES(6, 'Six');
--Testcase 13:
INSERT INTO numbers VALUES(7, 'Seven');
--Testcase 14:
INSERT INTO numbers VALUES(8, 'Eight');
--Testcase 15:
INSERT INTO numbers VALUES(9, 'Nine');
--Testcase 16:
SELECT count(*) FROM department;
--Testcase 17:
SELECT count(*) FROM employee;
--Testcase 18:
SELECT count(*) FROM empdata;
--Testcase 19:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 20:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) LIMIT 10;
--Testcase 21:
SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 22:
SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) ORDER BY d.department_id LIMIT 10;
--Testcase 23:
SELECT * FROM empdata;
--Testcase 24:
DELETE FROM employee WHERE emp_id = 10;
--Testcase 25:
SELECT COUNT(*) FROM department LIMIT 10;
--Testcase 26:
SELECT COUNT(*) FROM employee WHERE emp_id = 10;
--Testcase 27:
UPDATE employee SET emp_name = 'UPDATEd emp' WHERE emp_id = 20;
--Testcase 28:
SELECT emp_id, emp_name FROM employee WHERE emp_name like 'UPDATEd emp';
--Testcase 29:
UPDATE empdata SET emp_dat = decode ('0123', 'hex');
--Testcase 30:
SELECT * FROM empdata;
--Testcase 31:
SELECT * FROM employee LIMIT 10;
--Testcase 32:
SELECT * FROM employee WHERE emp_id IN (1);
--Testcase 33:
SELECT * FROM employee WHERE emp_id IN (1,3,4,5);
--Testcase 34:
SELECT * FROM employee WHERE emp_id IN (10000,1000);
--Testcase 35:
SELECT * FROM employee WHERE emp_id NOT IN (1) LIMIT 5;
--Testcase 36:
SELECT * FROM employee WHERE emp_id NOT IN (1,3,4,5) LIMIT 5;
--Testcase 37:
SELECT * FROM employee WHERE emp_id NOT IN (10000,1000) LIMIT 5;
--Testcase 38:
SELECT * FROM employee WHERE emp_id NOT IN (SELECT emp_id FROM employee WHERE emp_id IN (1,10));
--Testcase 39:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 1', 'emp - 2') LIMIT 5;
--Testcase 40:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 10') LIMIT 5;
--Testcase 41:
SELECT * FROM numbers WHERE (CASE WHEN a % 2 = 0 THEN 1 WHEN a % 5 = 0 THEN 1 ELSE 0 END) = 1;
--Testcase 42:
SELECT * FROM numbers WHERE (CASE b WHEN 'Two' THEN 1 WHEN 'Six' THEN 1 ELSE 0 END) = 1;
--Testcase 152:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 153:
SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 137:
create or replace function test_param_WHERE() returns void as $$
DECLARE
n varchar;
BEGIN
FOR x IN 1..9 LOOP
--Testcase 138:
SELECT b INTO n from numbers WHERE a=x;
raise notice 'Found number %', n;
end loop;
return;
END
$$ LANGUAGE plpgsql;
--Testcase 43:
SELECT test_param_WHERE();
--Testcase 44:
SELECT b from numbers WHERE a=1;
--Testcase 45:
EXPLAIN(COSTS OFF) SELECT b from numbers WHERE a=1;
--Testcase 46:
SELECT a FROM numbers WHERE b = (SELECT NULL::text);
--Testcase 47:
PREPARE stmt1 (int, int) AS
SELECT * FROM numbers WHERE a=$1 or a=$2;
--Testcase 48:
EXECUTE stmt1(1,2);
--Testcase 49:
EXECUTE stmt1(2,2);
--Testcase 50:
EXECUTE stmt1(3,2);
--Testcase 51:
EXECUTE stmt1(4,2);
-- generic plan
--Testcase 52:
EXECUTE stmt1(5,2);
--Testcase 53:
EXECUTE stmt1(6,2);
--Testcase 54:
EXECUTE stmt1(7,2);
--Testcase 55:
DELETE FROM employee;
--Testcase 56:
DELETE FROM department;
--Testcase 57:
DELETE FROM empdata;
--Testcase 58:
DELETE FROM numbers;
BEGIN;
--Testcase 59:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 60:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
--Testcase 61:
SELECT * from numbers;
BEGIN;
--Testcase 62:
INSERT INTO numbers VALUES(3, 'Three');
ROLLBACK;
--Testcase 63:
SELECT * from numbers;
BEGIN;
--Testcase 64:
INSERT INTO numbers VALUES(4, 'Four');
SAVEPOINT my_savepoint;
--Testcase 65:
INSERT INTO numbers VALUES(5, 'Five');
ROLLBACK TO SAVEPOINT my_savepoint;
--Testcase 66:
INSERT INTO numbers VALUES(6, 'Six');
COMMIT;
--Testcase 67:
SELECT * from numbers;
-- duplicate key
--Testcase 68:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 69:
DELETE from numbers;
BEGIN;
--Testcase 70:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 71:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
-- violate unique constraint
--Testcase 72:
UPDATE numbers SET b='Two' WHERE a = 1;
--Testcase 73:
SELECT * from numbers;
-- push down
--Testcase 74:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
-- (1,2,3) is pushed down
--Testcase 75:
explain (verbose, costs off) SELECT * from numbers WHERE a in (1,2,3) AND (1,2) < (a,5);
--Testcase 76:
explain (verbose, costs off) SELECT * from numbers WHERE a in (a+2*a,5);
--Testcase 77:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
--Testcase 78:
SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
--Testcase 79:
SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
-- ANY with ARRAY expression
--Testcase 154:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 155:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 156:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 157:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 158:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 159:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 160:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 161:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 162:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 163:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 164:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
--Testcase 165:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
-- ANY with ARRAY const
--Testcase 166:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 167:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 168:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 169:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 170:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 171:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 172:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 173:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 174:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 175:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 176:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 177:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 210:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 211:
SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 212:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
--Testcase 213:
SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
-- ALL with ARRAY expression
--Testcase 178:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 179:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 180:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 181:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 182:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 183:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 184:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 185:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 186:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 187:
SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 188:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
--Testcase 189:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
-- ALL with ARRAY const
--Testcase 190:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 191:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 192:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 193:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 194:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 195:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 196:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 197:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 198:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 199:
SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 200:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
--Testcase 201:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
-- ANY/ALL with TEXT ARRAY const
--Testcase 202:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 203:
SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 204:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 205:
SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 206:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 207:
SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 208:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 209:
SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 80:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 81:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 82:
UPDATE multiprimary SET b = 10 WHERE c = 3;
--Testcase 83:
SELECT * from multiprimary;
--Testcase 84:
UPDATE multiprimary SET a = 10 WHERE a = 1;
--Testcase 85:
SELECT * from multiprimary;
--Testcase 86:
UPDATE multiprimary SET a = 100, b=200, c=300 WHERE a=10 AND b=10;
--Testcase 87:
SELECT * from multiprimary;
--Testcase 88:
UPDATE multiprimary SET a = 1234;
--Testcase 89:
SELECT * from multiprimary;
--Testcase 90:
UPDATE multiprimary SET a = a+1, b=b+1 WHERE b=200 AND c=300;
--Testcase 91:
SELECT * from multiprimary;
--Testcase 92:
DELETE from multiprimary WHERE a = 1235;
--Testcase 93:
SELECT * from multiprimary;
--Testcase 94:
DELETE from multiprimary WHERE b = 2;
--Testcase 95:
SELECT * from multiprimary;
--Testcase 96:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 97:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 98:
INSERT INTO multiprimary VALUES(1,10,20);
--Testcase 99:
INSERT INTO multiprimary VALUES(2,20,40);
--Testcase 100:
SELECT count(distinct a) from multiprimary;
--Testcase 101:
SELECT sum(b),max(b), min(b) from multiprimary;
--Testcase 102:
SELECT sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 103:
SELECT sum(a) from multiprimary group by b having sum(a) > 0 order by sum(a);
--Testcase 104:
SELECT sum(a) A from multiprimary group by b having avg(abs(a)) > 0 AND sum(a) > 0 order by A;
--Testcase 105:
SELECT count(nullif(a, 1)) FROM multiprimary;
--Testcase 106:
SELECT a,a FROM multiprimary group by 1,2;
--Testcase 107:
SELECT * from multiprimary, numbers WHERE multiprimary.a=numbers.a;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 109:
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 110:
INSERT INTO numbers VALUES(4, 'Four');
-- All where clauses are pushed down
--Testcase 111:
SELECT * FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
--Testcase 112:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
-- Only "length(b) = 4" are pushed down
--Testcase 113:
SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 114:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 115:
INSERT INTO multiprimary (b,c) VALUES (99, 100);
--Testcase 116:
SELECT c FROM multiprimary WHERE COALESCE(a,b,c) = 99;
--Testcase 139:
CREATE FOREIGN TABLE multiprimary2(a int, b int, c int OPTIONS(column_name 'b')) SERVER sqlite_svr OPTIONS (table 'multiprimary');
--Testcase 117:
SELECT * FROM multiprimary2;
--Testcase 214:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN a OPTIONS(ADD column_name 'b');
--Testcase 118:
SELECT * FROM multiprimary2;
--Testcase 215:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN b OPTIONS (column_name 'nosuch column');
--Testcase 119:
SELECT * FROM multiprimary2;
--Testcase 140:
EXPLAIN (VERBOSE) SELECT * FROM multiprimary2;
--Testcase 120:
SELECT a FROM multiprimary2 WHERE b = 1;
--Testcase 141:
CREATE FOREIGN TABLE columntest(a int OPTIONS(column_name 'a a', key 'true'), "b b" int OPTIONS(key 'true'), c int OPTIONS(column_name 'c c')) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO columntest VALUES(1,2,3);
--Testcase 122:
UPDATE columntest SET c=10 WHERE a = 1;
--Testcase 123:
SELECT * FROM columntest;
--Testcase 124:
UPDATE columntest SET a=100 WHERE c = 10;
--Testcase 125:
SELECT * FROM columntest;
--Testcase 126:
INSERT INTO noprimary VALUES(1,'2');
--Testcase 127:
INSERT INTO noprimary SELECT * FROM noprimary;
--Testcase 128:
SELECT * FROM noprimary;
--get version
--Testcase 153:
\df sqlite*
--Testcase 154:
SELECT * FROM public.sqlite_fdw_version();
--Testcase 155:
SELECT sqlite_fdw_version();
-- issue #44 github
--Testcase 156:
CREATE FOREIGN TABLE fts_table (name text, description text) SERVER sqlite_svr;
--Testcase 157:
INSERT INTO fts_table VALUES ('this is name', 'this is description');
--Testcase 158:
SELECT * FROM fts_table; -- should work
--Testcase 159:
ALTER TABLE fts_table ALTER COLUMN name TYPE int;
--Testcase 160:
SELECT * FROM fts_table; -- should fail
-- issue #62 github
--Testcase 236:
INSERT INTO noprimary VALUES (4, 'Test''s');
--Testcase 237:
INSERT INTO noprimary VALUES (5, 'Test');
--Testcase 238:
SELECT * FROM noprimary;
--Testcase 239:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 240:
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 241:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b in ('Test''s', 'Test');
--Testcase 242:
SELECT * FROM noprimary where b in ('Test''s', 'Test');
-- INSERT/UPDATE whole row with generated column
--Testcase 216:
CREATE FOREIGN TABLE grem1_1 (
a int generated always as (0) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_1');
--Testcase 217:
INSERT INTO grem1_1 DEFAULT VALUES;
--Testcase 218:
SELECT * FROM grem1_1;
--Testcase 219:
CREATE FOREIGN TABLE grem1_2 (
a int generated always as (0) stored,
b int generated always as (1) stored,
c int generated always as (2) stored,
d int generated always as (3) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_2');
--Testcase 220:
INSERT INTO grem1_2 DEFAULT VALUES;
--Testcase 221:
SELECT * FROM grem1_2;
-- Executable test case for pushdown CASE expressions (results)
--Testcase 224:
CREATE FOREIGN TABLE case_exp(c1 int OPTIONS (key 'true'), c3 text, c6 varchar(10)) SERVER sqlite_svr;
--Testcase 225:
INSERT INTO case_exp
SELECT id,
to_char(id, 'FM00000'),
id % 10
FROM generate_series(1, 10) id;
--Testcase 226:
SELECT * FROM case_exp;
-- CASE arg WHEN
--Testcase 227:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
--Testcase 228:
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 229:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 230:
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 232:
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 233:
SELECT * FROM case_exp WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 234:
DELETE FROM case_exp;
-- readonly/readwrite tests
-- Full combinations
-- force_RO default SERVER default TABLE default
-- force_RO default SERVER true TABLE default
-- force_RO default SERVER false TABLE default
-- force_RO default SERVER default TABLE true
-- force_RO default SERVER default TABLE false
-- force_RO default SERVER true TABLE true
-- force_RO default SERVER false TABLE true
-- force_RO default SERVER false TABLE false
-- force_RO default SERVER true TABLE false
-- force_RO false SERVER default TABLE default
-- force_RO false SERVER true TABLE default
-- force_RO false SERVER false TABLE default
-- force_RO false SERVER default TABLE true
-- force_RO false SERVER default TABLE false
-- force_RO false SERVER true TABLE true
-- force_RO false SERVER false TABLE true
-- force_RO false SERVER false TABLE false
-- force_RO false SERVER true TABLE false
-- force_RO true SERVER default TABLE default
-- force_RO true SERVER true TABLE default
-- force_RO true SERVER false TABLE default
-- force_RO true SERVER default TABLE true
-- force_RO true SERVER default TABLE false
-- force_RO true SERVER true TABLE true
-- force_RO true SERVER false TABLE true
-- force_RO true SERVER false TABLE false
-- force_RO true SERVER true TABLE false
-- force_RO default SERVER default TABLE default
--Testcase 235:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 236:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 237:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO default SERVER true TABLE default
--Testcase 238:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 239:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 240:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 241:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 242:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO default SERVER false TABLE default
--Testcase 243:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 244:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 245:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 246:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER default TABLE true
--Testcase 247:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 248:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 249:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 250:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 251:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO default SERVER default TABLE false
--Testcase 252:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 253:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 254:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 255:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER true TABLE true
--Testcase 256:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 257:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 258:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 258:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 260:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 261:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO default SERVER false TABLE true
--Testcase 262:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 263:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 264:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 265:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO default SERVER false TABLE false
--Testcase 266:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 267:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 268:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 269:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO default SERVER true TABLE false
--Testcase 270:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 271:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 272:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 273:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 274:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 275:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 276:
SELECT * FROM RO_RW_test ORDER BY i;
--Bind error message test for some unsupported data type
--Testcase 277:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 278:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 279:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 277:
DELETE FROM RO_RW_test;
--Testcase 278:
ALTER SERVER sqlite_svr OPTIONS (ADD force_readonly 'false');
-- force_RO false SERVER default TABLE default
--Testcase 279:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 280:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 281:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO false SERVER true TABLE default
--Testcase 282:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 283:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 284:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 285:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 286:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO false SERVER false TABLE default
--Testcase 287:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 288:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 289:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 290:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER default TABLE true
--Testcase 291:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 292:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 293:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 294:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 295:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO false SERVER default TABLE false
--Testcase 296:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 297:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 298:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 299:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER true TABLE true
--Testcase 300:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 301:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 302:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 303:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 304:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 305:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO false SERVER false TABLE true
--Testcase 306:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 307:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 308:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 309:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO false SERVER false TABLE false
--Testcase 310:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 311:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 312:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 313:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO false SERVER true TABLE false
--Testcase 314:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 315:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 316:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 317:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 318:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 319:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 320:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 321:
DELETE FROM RO_RW_test;
--Testcase 322:
ALTER SERVER sqlite_svr OPTIONS (SET force_readonly 'true');
-- force_RO true SERVER default TABLE default
--Testcase 323:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- ERR
--Testcase 324:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- ERR
--Testcase 325:
DELETE FROM RO_RW_test WHERE i=2; -- ERR
-- force_RO true SERVER true TABLE default
--Testcase 326:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 327:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- ERR
--Testcase 328:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- ERR
--Testcase 329:
DELETE FROM RO_RW_test WHERE i=3; -- ERR
--Testcase 330:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- ERR
-- force_RO true SERVER false TABLE default
--Testcase 331:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 332:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 333:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 334:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER default TABLE true
--Testcase 335:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 336:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 337:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- ERR
--Testcase 338:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- ERR
--Testcase 339:
DELETE FROM RO_RW_test WHERE i=6; -- ERR
-- force_RO true SERVER default TABLE false
--Testcase 340:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 341:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 342:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 343:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER true TABLE true
--Testcase 344:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true'); -- ERR
--Testcase 345:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true'); -- ERR
--Testcase 346:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- ERR
--Testcase 347:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 348:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 349:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- ERR
-- force_RO true SERVER false TABLE true
--Testcase 350:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 351:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- ERR
--Testcase 352:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- ERR
--Testcase 353:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER false TABLE false
--Testcase 354:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 355:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 356:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 357:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER true TABLE false
--Testcase 358:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 359:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 360:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 361:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 362:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 363:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 364:
ALTER SERVER sqlite_svr OPTIONS (DROP force_readonly);
--Testcase 365:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 366:
DROP FOREIGN TABLE RO_RW_test;
-- End of RO/RW test
--Bind error message test for some unsupported data type
--Testcase 366:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 367:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 368:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 142:
DROP FUNCTION test_param_WHERE();
--Testcase 143:
DROP FOREIGN TABLE numbers;
--Testcase 144:
DROP FOREIGN TABLE department;
--Testcase 145:
DROP FOREIGN TABLE employee;
--Testcase 146:
DROP FOREIGN TABLE empdata;
--Testcase 147:
DROP FOREIGN TABLE multiprimary;
--Testcase 148:
DROP FOREIGN TABLE multiprimary2;
--Testcase 149:
DROP FOREIGN TABLE columntest;
--Testcase 150:
DROP FOREIGN TABLE noprimary;
--Testcase 161:
DROP FOREIGN TABLE fts_table;
--Testcase 222:
DROP FOREIGN TABLE grem1_1;
--Testcase 223:
DROP FOREIGN TABLE grem1_2;
--Testcase 235:
DROP FOREIGN TABLE case_exp;
--Testcase 151:
DROP SERVER sqlite_svr;
--Testcase 152:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/bitstring.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 02:
CREATE FOREIGN TABLE "type_BIT"( "i" int OPTIONS (key 'true'), "b" bit(6)) SERVER sqlite_svr OPTIONS (table 'type_BIT');
--Testcase 03:
DROP FOREIGN TABLE IF EXISTS "type_BIT+";
--Testcase 04:
CREATE FOREIGN TABLE "type_BIT+"( "i" int OPTIONS (key 'true'), "b" bit(6), "t" text, "l" smallint, "bi" bigint OPTIONS (column_name 'b')) SERVER sqlite_svr OPTIONS (table 'type_BIT+');
--Testcase 05: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (1, 1);
--Testcase 06: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (2, 2);
--Testcase 07: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (3, '1');
--Testcase 08: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (4, '10');
--Testcase 09: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (5, '101');
--Testcase 10:
INSERT INTO "type_BIT" ("i", "b") VALUES (6, '110110');
--Testcase 11:
INSERT INTO "type_BIT" ("i", "b") VALUES (7, '111001');
--Testcase 12:
INSERT INTO "type_BIT" ("i", "b") VALUES (8, '110000');
--Testcase 13:
INSERT INTO "type_BIT" ("i", "b") VALUES (9, '100001');
--Testcase 14: type mismatch with proper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (10, 53);
--Testcase 15:
SELECT * FROM "type_BIT+";
--Testcase 16:
SELECT * FROM "type_BIT" WHERE b < '110110';
--Testcase 17:
SELECT * FROM "type_BIT" WHERE b > '110110';
--Testcase 18:
SELECT * FROM "type_BIT" WHERE b = '110110';
--Testcase 20:
CREATE FOREIGN TABLE "type_VARBIT"( "i" int OPTIONS (key 'true'), "b" varbit(70)) SERVER sqlite_svr OPTIONS (table 'type_VARBIT');
--Testcase 21:
DROP FOREIGN TABLE IF EXISTS "type_VARBIT+";
--Testcase 22:
CREATE FOREIGN TABLE "type_VARBIT+"( "i" int OPTIONS (key 'true'), "b" varbit(70), "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_VARBIT+');
--Testcase 23:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (1, '1');
--Testcase 24:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (2, '10');
--Testcase 25:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (3, '11');
--Testcase 26:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (4, '100');
--Testcase 27:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (5, '101');
--Testcase 28:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (6, '110110');
--Testcase 29:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (7, '111001');
--Testcase 30:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (8, '110000');
--Testcase 31:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (9, '100001');
--Testcase 32:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (10, '0100100101011001010010101000111110110101101101111011000101010');
--Testcase 33:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (11, '01001001010110010100101010001111101101011011011110110001010101');
--Testcase 34:
SELECT * FROM "type_VARBIT+";
--Testcase 35:
SELECT * FROM "type_VARBIT+" WHERE b < '110110';
--Testcase 36:
SELECT * FROM "type_VARBIT+" WHERE b > '110110';
--Testcase 37:
SELECT * FROM "type_VARBIT+" WHERE b = '110110';
--Testcase 38:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (12, '010010010101100101001010100011111011010110110111101100010101010');
--Testcase 39:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (13, '0100100101011001010010101000111110110101101101111011000101010101');
--Testcase 40: very long bit string, expected ERROR, 65 bits
INSERT INTO "type_VARBIT" ("i", "b") VALUES (14, '01001001010110010100101010001111101101011011011110110001010101010');
--Testcase 41:
SELECT * FROM "type_VARBIT+" WHERE "i" > 10;
--Testcase 42:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 43:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 44:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 45:
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 46:
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 47:
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 48:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 49:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 50:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 51:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 52:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 53:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 54:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 55:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 56:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 57:
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 58:
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 59:
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 60:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 61:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 62:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 63:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 64:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 65:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 66:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 67:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 68:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 69:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 70:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 71:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 72:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 73:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 74:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 75:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 76:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 77:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 78:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 79:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 80:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 81:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 82:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 83:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 84:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 85:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 86:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 87:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 88:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 89:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 90:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 91:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 92:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 93:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 94:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 95:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 005:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/bool.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 000:
CREATE EXTENSION sqlite_fdw;
--Testcase 001:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 01:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int OPTIONS (key 'true'), b bool) SERVER sqlite_svr;
--Testcase 02:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (1, TRUE);
--Testcase 03:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (2, FALSE);
--Testcase 04:
CREATE FOREIGN TABLE "type_BOOLEAN+"( "i" int, "b" bool, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN+');
--Testcase 05:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE text;
--Testcase 06:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (3, TRUE);
--Testcase 07:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (4, FALSE);
--Testcase 08:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (5, true);
--Testcase 09:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (6, false);
--Testcase 10:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (7, 'Yes');
--Testcase 11:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (8, 'YeS');
--Testcase 12:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (9, 'yes');
--Testcase 13:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (10, 'no');
--Testcase 14:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (11, 'No');
--Testcase 15:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (12, 'nO');
--Testcase 16:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (13, 'off');
--Testcase 17:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (14, 'oFf');
--Testcase 18:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (15, 'on');
--Testcase 19:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (16, 'ON');
--Testcase 20:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (17, 't');
--Testcase 21:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (18, 'T');
--Testcase 22:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (19, 'Y');
--Testcase 23:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (20, 'y');
--Testcase 24:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (21, 'F');
--Testcase 25:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (22, 'f');
--Testcase 26:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (23, 'x');
--Testcase 27:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (24, '0');
--Testcase 28:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (25, '1');
--Testcase 29:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (26, NULL);
--Testcase 30:
SELECT * FROM "type_BOOLEAN";
--Testcase 31:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 32:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN";
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN+";
--Testcase 34: ERR - invalid text affinity because not ISO:SQL text input
SELECT * FROM "type_BOOLEAN+";
--Testcase 35
DELETE FROM "type_BOOLEAN" WHERE i = 23;
--Testcase 36:
SELECT * FROM "type_BOOLEAN+";
--Testcase 37:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NULL;
--Testcase 38:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NOT NULL;
--Testcase 39:
SELECT * FROM "type_BOOLEAN+" WHERE b;
--Testcase 40:
SELECT * FROM "type_BOOLEAN+" WHERE NOT b;
--Testcase 41:
CREATE FOREIGN TABLE "type_BOOLEANpk" (col bool OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 42:
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 43:
INSERT INTO "type_BOOLEANpk" VALUES (FALSE);
--Testcase 44: ERR - primary key
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 45:
DELETE FROM "type_BOOLEANpk";
--Testcase 46:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE float8;
--Testcase 47:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (27, 3.14159265358979);
--Testcase 48:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 49: ERR - invalid float for bool column
SELECT * FROM "type_BOOLEAN+";
--Testcase 50
DELETE FROM "type_BOOLEAN" WHERE i = 27;
--Testcase 51:
SELECT * FROM "type_BOOLEAN+";
--Testcase 52:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE b;
--Testcase 53:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE NOT b;
--Testcase 54:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE b;
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE NOT b;
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 57:
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 58:
CREATE FOREIGN TABLE "type_BOOLEAN_oper"( "i" int OPTIONS (key 'true'), i1 smallint, b1 boolean, i2 smallint, b2 boolean) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN_oper');
--Testcase 59: see INIT.SQL with mixed affinity boolean data
SELECT * FROM "type_BOOLEAN_oper";
--Testcase 60:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 61:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 62:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 63:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 64:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 65:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 66:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 67:
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 68:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 69:
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 70:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 71:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 72:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 73:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 74:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 75:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b2;
--Testcase 76:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 77:
DELETE FROM "type_BOOLEAN_oper" WHERE b2;
--Testcase 78:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 79:
DELETE FROM "type_BOOLEAN";
--Testcase 003:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/float4.sql
================================================
--
-- FLOAT4
--
--Testcase 46:
CREATE EXTENSION sqlite_fdw;
--Testcase 47:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 48:
CREATE FOREIGN TABLE FLOAT4_TBL(f1 float4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 49:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0');
--Testcase 2:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 ');
--Testcase 4:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20');
--Testcase 5:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20');
-- test for over and under flow
--Testcase 6:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70');
--Testcase 7:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
--Testcase 8:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
--Testcase 9:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
--Testcase 50:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8);
--Testcase 51:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8);
--Testcase 52:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8);
--Testcase 53:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8);
--Testcase 54:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
--Testcase 55:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
--Testcase 56:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
--Testcase 57:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
-- bad input
--Testcase 10:
INSERT INTO FLOAT4_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
--Testcase 17:
INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
-- special inputs
--Testcase 18:
DELETE FROM FLOAT4_TMP;
--Testcase 58:
INSERT INTO FLOAT4_TMP VALUES ('NaN'::float4);
--Testcase 59:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 20:
DELETE FROM FLOAT4_TMP;
--Testcase 60:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4);
--Testcase 61:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 21:
DELETE FROM FLOAT4_TMP;
--Testcase 62:
INSERT INTO FLOAT4_TMP VALUES (' NAN '::float4);
--Testcase 63:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 22:
DELETE FROM FLOAT4_TMP;
--Testcase 64:
INSERT INTO FLOAT4_TMP VALUES ('infinity'::float4);
--Testcase 65:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 23:
DELETE FROM FLOAT4_TMP;
--Testcase 66:
INSERT INTO FLOAT4_TMP VALUES (' -INFINiTY '::float4);
--Testcase 67:
SELECT f1 FROM FLOAT4_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT4_TMP;
--Testcase 68:
INSERT INTO FLOAT4_TMP VALUES ('N A N'::float4);
--Testcase 69:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 26:
DELETE FROM FLOAT4_TMP;
--Testcase 70:
INSERT INTO FLOAT4_TMP VALUES ('NaN x'::float4);
--Testcase 71:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 27:
DELETE FROM FLOAT4_TMP;
--Testcase 72:
INSERT INTO FLOAT4_TMP VALUES (' INFINITY x'::float4);
--Testcase 73:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 28:
DELETE FROM FLOAT4_TMP;
--Testcase 74:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 + 100.0);
--Testcase 75:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 30:
DELETE FROM FLOAT4_TMP;
--Testcase 76:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 / 'Infinity'::float4);
--Testcase 77:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 185:
DELETE FROM FLOAT4_TMP;
--Testcase 186:
INSERT INTO FLOAT4_TMP VALUES ('42'::float4 / 'Infinity'::float4);
--Testcase 187:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 31:
DELETE FROM FLOAT4_TMP;
--Testcase 78:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / 'nan'::float4);
--Testcase 79:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 188:
DELETE FROM FLOAT4_TMP;
--Testcase 189:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / '0'::float4);
--Testcase 190:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 32:
DELETE FROM FLOAT4_TMP;
--Testcase 80:
INSERT INTO FLOAT4_TMP VALUES ('nan'::numeric::float4);
--Testcase 81:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 34:
SELECT * FROM FLOAT4_TBL;
--SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3';
--SELECT '' AS one, f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3';
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1;
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3';
--Testcase 35:
SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1;
--Testcase 36:
SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3';
--Testcase 37:
SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 38:
SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 39:
SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 40:
SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
-- test divide by zero
--Testcase 41:
SELECT f.f1 / '0.0' from FLOAT4_TBL f;
--Testcase 42:
SELECT * FROM FLOAT4_TBL;
-- test the unary float4abs operator
--Testcase 43:
SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f;
--Testcase 44:
UPDATE FLOAT4_TBL
SET f1 = FLOAT4_TBL.f1 * '-1'
WHERE FLOAT4_TBL.f1 > '0.0';
--Testcase 45:
SELECT * FROM FLOAT4_TBL;
-- test edge-case coercions to integer
--Testcase 82:
DELETE FROM FLOAT4_TMP;
--Testcase 83:
INSERT INTO FLOAT4_TMP VALUES ('32767.4'::float4);
--Testcase 84:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 85:
DELETE FROM FLOAT4_TMP;
--Testcase 86:
INSERT INTO FLOAT4_TMP VALUES ('32767.6'::float4);
--Testcase 87:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 88:
DELETE FROM FLOAT4_TMP;
--Testcase 89:
INSERT INTO FLOAT4_TMP VALUES ('-32768.4'::float4);
--Testcase 90:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 91:
DELETE FROM FLOAT4_TMP;
--Testcase 92:
INSERT INTO FLOAT4_TMP VALUES ('-32768.6'::float4);
--Testcase 93:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 94:
DELETE FROM FLOAT4_TMP;
--Testcase 95:
INSERT INTO FLOAT4_TMP VALUES ('2147483520'::float4);
--Testcase 96:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 97:
DELETE FROM FLOAT4_TMP;
--Testcase 98:
INSERT INTO FLOAT4_TMP VALUES ('2147483647'::float4);
--Testcase 99:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 100:
DELETE FROM FLOAT4_TMP;
--Testcase 101:
INSERT INTO FLOAT4_TMP VALUES ('-2147483648.5'::float4);
--Testcase 102:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 103:
DELETE FROM FLOAT4_TMP;
--Testcase 104:
INSERT INTO FLOAT4_TMP VALUES ('-2147483900'::float4);
--Testcase 105:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 106:
DELETE FROM FLOAT4_TMP;
--Testcase 107:
INSERT INTO FLOAT4_TMP VALUES ('9223369837831520256'::float4);
--Testcase 108:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 109:
DELETE FROM FLOAT4_TMP;
--Testcase 110:
INSERT INTO FLOAT4_TMP VALUES ('9223372036854775807'::float4);
--Testcase 111:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 112:
DELETE FROM FLOAT4_TMP;
--Testcase 113:
INSERT INTO FLOAT4_TMP VALUES ('-9223372036854775808.5'::float4);
--Testcase 114:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 115:
DELETE FROM FLOAT4_TMP;
--Testcase 116:
INSERT INTO FLOAT4_TMP VALUES ('-9223380000000000000'::float4);
--Testcase 117:
SELECT f1::int8 FROM FLOAT4_TMP;
-- Test for correct input rounding in edge cases.
-- These lists are from Paxson 1991, excluding subnormals and
-- inputs of over 9 sig. digits.
--Testcase 118:
DELETE FROM FLOAT4_TMP;
--Testcase 119:
INSERT INTO FLOAT4_TMP VALUES ('5e-20'::float4);
--Testcase 120:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 121:
DELETE FROM FLOAT4_TMP;
--Testcase 122:
INSERT INTO FLOAT4_TMP VALUES ('67e14'::float4);
--Testcase 123:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 124:
DELETE FROM FLOAT4_TMP;
--Testcase 125:
INSERT INTO FLOAT4_TMP VALUES ('985e15'::float4);
--Testcase 126:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 127:
DELETE FROM FLOAT4_TMP;
--Testcase 128:
INSERT INTO FLOAT4_TMP VALUES ('55895e-16'::float4);
--Testcase 129:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 130:
DELETE FROM FLOAT4_TMP;
--Testcase 131:
INSERT INTO FLOAT4_TMP VALUES ('7038531e-32'::float4);
--Testcase 132:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 133:
DELETE FROM FLOAT4_TMP;
--Testcase 134:
INSERT INTO FLOAT4_TMP VALUES ('702990899e-20'::float4);
--Testcase 135:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 136:
DELETE FROM FLOAT4_TMP;
--Testcase 137:
INSERT INTO FLOAT4_TMP VALUES ('3e-23'::float4);
--Testcase 138:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 139:
DELETE FROM FLOAT4_TMP;
--Testcase 140:
INSERT INTO FLOAT4_TMP VALUES ('57e18'::float4);
--Testcase 141:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 142:
DELETE FROM FLOAT4_TMP;
--Testcase 143:
INSERT INTO FLOAT4_TMP VALUES ('789e-35'::float4);
--Testcase 144:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 145:
DELETE FROM FLOAT4_TMP;
--Testcase 146:
INSERT INTO FLOAT4_TMP VALUES ('2539e-18'::float4);
--Testcase 147:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 148:
DELETE FROM FLOAT4_TMP;
--Testcase 149:
INSERT INTO FLOAT4_TMP VALUES ('76173e28'::float4);
--Testcase 150:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 151:
DELETE FROM FLOAT4_TMP;
--Testcase 152:
INSERT INTO FLOAT4_TMP VALUES ('887745e-11'::float4);
--Testcase 153:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 154:
DELETE FROM FLOAT4_TMP;
--Testcase 155:
INSERT INTO FLOAT4_TMP VALUES ('5382571e-37'::float4);
--Testcase 156:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 157:
DELETE FROM FLOAT4_TMP;
--Testcase 158:
INSERT INTO FLOAT4_TMP VALUES ('82381273e-35'::float4);
--Testcase 159:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 160:
DELETE FROM FLOAT4_TMP;
--Testcase 161:
INSERT INTO FLOAT4_TMP VALUES ('750486563e-38'::float4);
--Testcase 162:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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...
--Testcase 163:
DELETE FROM FLOAT4_TMP;
--Testcase 164:
INSERT INTO FLOAT4_TMP VALUES ('1.17549435e-38'::float4);
--Testcase 165:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 166:
DELETE FROM FLOAT4_TMP;
--Testcase 167:
INSERT INTO FLOAT4_TMP VALUES('1.1754944e-38'::float4);
--Testcase 168:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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).
--Testcase 169:
create type xfloat4;
--Testcase 170:
create function xfloat4in(cstring) returns xfloat4 immutable strict
language internal as 'int4in';
--Testcase 171:
create function xfloat4out(xfloat4) returns cstring immutable strict
language internal as 'int4out';
--Testcase 172:
create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4);
--Testcase 173:
create cast (xfloat4 as float4) without function;
--Testcase 174:
create cast (float4 as xfloat4) without function;
--Testcase 175:
create cast (xfloat4 as integer) without function;
--Testcase 176:
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.
--Testcase 177:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 178:
insert into testdata(bits) 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');
--Testcase 179:
select float4send(flt) as ibits,
flt
from (select bits::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
begin;
--Testcase 180:
insert into testdata(bits) 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');
--Testcase 181:
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::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 182:
drop type xfloat4 cascade;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/float8.sql
================================================
--
-- FLOAT8
--
--Testcase 113:
CREATE EXTENSION sqlite_fdw;
--Testcase 114:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 115:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 116:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 2:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 4:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 5:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- test for underflow and overflow handling
--Testcase 6:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e400'::float8);
--Testcase 7:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e400'::float8);
--Testcase 8:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e-400'::float8);
--Testcase 9:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e-400'::float8);
-- test smallest normalized input
--Testcase 117:
INSERT INTO FLOAT8_TMP(f1) VALUES ('2.2250738585072014E-308'::float8);
--Testcase 118:
SELECT float8send(f1) FROM FLOAT8_TMP;
-- bad input
--Testcase 10:
INSERT INTO FLOAT8_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
--Testcase 17:
INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
-- special inputs
--Testcase 19:
DELETE FROM FLOAT8_TMP;
--Testcase 119:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8);
--Testcase 120:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 20:
DELETE FROM FLOAT8_TMP;
--Testcase 121:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8);
--Testcase 122:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 21:
DELETE FROM FLOAT8_TMP;
--Testcase 123:
INSERT INTO FLOAT8_TMP VALUES (' NAN '::float8);
--Testcase 124:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 22:
DELETE FROM FLOAT8_TMP;
--Testcase 125:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8);
--Testcase 126:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 23:
DELETE FROM FLOAT8_TMP;
--Testcase 127:
INSERT INTO FLOAT8_TMP VALUES (' -INFINiTY '::float8);
--Testcase 128:
SELECT f1 FROM FLOAT8_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT8_TMP;
--Testcase 129:
INSERT INTO FLOAT8_TMP VALUES ('N A N'::float8);
--Testcase 130:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 26:
DELETE FROM FLOAT8_TMP;
--Testcase 131:
INSERT INTO FLOAT8_TMP VALUES ('NaN x'::float8);
--Testcase 132:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 27:
DELETE FROM FLOAT8_TMP;
--Testcase 133:
INSERT INTO FLOAT8_TMP VALUES (' INFINITY x'::float8);
--Testcase 134:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 28:
DELETE FROM FLOAT8_TMP;
--Testcase 135:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 + 100.0);
--Testcase 136:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 30:
DELETE FROM FLOAT8_TMP;
--Testcase 137:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 / 'Infinity'::float8);
--Testcase 138:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 272:
DELETE FROM FLOAT8_TMP;
--Testcase 273:
INSERT INTO FLOAT8_TMP VALUES ('42'::float8 / 'Infinity'::float8);
--Testcase 274:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 31:
DELETE FROM FLOAT8_TMP;
--Testcase 139:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / 'nan'::float8);
--Testcase 140:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 275:
DELETE FROM FLOAT8_TMP;
--Testcase 276:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / '0'::float8);
--Testcase 277:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 32:
DELETE FROM FLOAT8_TMP;
--Testcase 141:
INSERT INTO FLOAT8_TMP VALUES ('nan'::numeric::float8);
--Testcase 142:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 34:
SELECT * FROM FLOAT8_TBL;
--Testcase 35:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
--Testcase 36:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
--Testcase 37:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
--Testcase 38:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
--Testcase 39:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
--Testcase 40:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
--Testcase 41:
SELECT f.f1, f.f1 * '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 42:
SELECT f.f1, f.f1 + '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 43:
SELECT f.f1, f.f1 / '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 44:
SELECT f.f1, f.f1 - '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 45:
SELECT f.f1 ^ '2.0' AS square_f1
FROM FLOAT8_TBL f where f.f1 = '1004.3';
-- absolute value
--Testcase 46:
SELECT f.f1, @f.f1 AS abs_f1
FROM FLOAT8_TBL f;
-- truncate
--Testcase 47:
SELECT f.f1, trunc(f.f1) AS trunc_f1
FROM FLOAT8_TBL f;
-- round
--Testcase 48:
SELECT f.f1, round(f.f1) AS round_f1
FROM FLOAT8_TBL f;
-- ceil / ceiling
--Testcase 49:
select ceil(f1) as ceil_f1 from float8_tbl f;
--Testcase 50:
select ceiling(f1) as ceiling_f1 from float8_tbl f;
-- floor
--Testcase 51:
select floor(f1) as floor_f1 from float8_tbl f;
-- sign
--Testcase 52:
select sign(f1) as sign_f1 from float8_tbl f;
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 278:
SET extra_float_digits = 0;
-- square root
BEGIN;
--Testcase 53:
DELETE FROM FLOAT8_TBL;
--Testcase 54:
INSERT INTO FLOAT8_TBL VALUES ('64'::float8);
--Testcase 55:
SELECT sqrt(f1) as eight FROM FLOAT8_TBL;
--Testcase 56:
SELECT |/f1 as eight FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 57:
SELECT f.f1, |/f.f1 AS sqrt_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
-- power
--Testcase 58:
DELETE FROM FLOAT8_TMP;
--Testcase 143:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, '0.5'::float8);
--Testcase 144:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 60:
DELETE FROM FLOAT8_TMP;
--Testcase 145:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, '0.5'::float8);
--Testcase 146:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 61:
DELETE FROM FLOAT8_TMP;
--Testcase 147:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, 'NaN'::float8);
--Testcase 148:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 62:
DELETE FROM FLOAT8_TMP;
--Testcase 149:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, 'NaN'::float8);
--Testcase 150:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 63:
DELETE FROM FLOAT8_TMP;
--Testcase 151:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'NaN'::float8);
--Testcase 152:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 64:
DELETE FROM FLOAT8_TMP;
--Testcase 153:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'NaN'::float8);
--Testcase 154:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 65:
DELETE FROM FLOAT8_TMP;
--Testcase 155:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8 , '0'::float8);
--Testcase 156:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 279:
DELETE FROM FLOAT8_TMP;
--Testcase 280:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '0'::float8);
--Testcase 281:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 282:
DELETE FROM FLOAT8_TMP;
--Testcase 283:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '0'::float8);
--Testcase 284:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 285:
DELETE FROM FLOAT8_TMP;
--Testcase 286:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, 'infinity'::float8);
--Testcase 287:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 288:
DELETE FROM FLOAT8_TMP;
--Testcase 289:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, '-infinity'::float8);
--Testcase 290:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 291:
DELETE FROM FLOAT8_TMP;
--Testcase 292:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'infinity'::float8);
--Testcase 293:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 294:
DELETE FROM FLOAT8_TMP;
--Testcase 295:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, '-infinity'::float8);
--Testcase 296:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 297:
DELETE FROM FLOAT8_TMP;
--Testcase 298:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'infinity'::float8);
--Testcase 299:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 300:
DELETE FROM FLOAT8_TMP;
--Testcase 301:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, '-infinity'::float8);
--Testcase 302:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 303:
DELETE FROM FLOAT8_TMP;
--Testcase 304:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, 'infinity'::float8);
--Testcase 305:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 306:
DELETE FROM FLOAT8_TMP;
--Testcase 307:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, 'infinity'::float8);
--Testcase 308:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 309:
DELETE FROM FLOAT8_TMP;
--Testcase 310:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, 'infinity'::float8);
--Testcase 311:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 312:
DELETE FROM FLOAT8_TMP;
--Testcase 313:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, 'infinity'::float8);
--Testcase 314:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 315:
DELETE FROM FLOAT8_TMP;
--Testcase 316:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, '-infinity'::float8);
--Testcase 317:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 318:
DELETE FROM FLOAT8_TMP;
--Testcase 319:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, '-infinity'::float8);
--Testcase 320:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 321:
DELETE FROM FLOAT8_TMP;
--Testcase 322:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, '-infinity'::float8);
--Testcase 323:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 324:
DELETE FROM FLOAT8_TMP;
--Testcase 325:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, '-infinity'::float8);
--Testcase 326:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 327:
DELETE FROM FLOAT8_TMP;
--Testcase 328:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-2'::float8);
--Testcase 329:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 330:
DELETE FROM FLOAT8_TMP;
--Testcase 331:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '2'::float8);
--Testcase 332:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 333:
DELETE FROM FLOAT8_TMP;
--Testcase 334:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, 'infinity'::float8);
--Testcase 335:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 336:
DELETE FROM FLOAT8_TMP;
--Testcase 337:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-infinity'::float8);
--Testcase 338:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- 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".
--Testcase 339:
DELETE FROM FLOAT8_TMP;
--Testcase 340:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-2'::float8);
--Testcase 341:
SELECT power(f1, f2) = '0' FROM FLOAT8_TMP;
--Testcase 342:
DELETE FROM FLOAT8_TMP;
--Testcase 343:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3'::float8);
--Testcase 344:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 345:
DELETE FROM FLOAT8_TMP;
--Testcase 346:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '2'::float8);
--Testcase 347:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 348:
DELETE FROM FLOAT8_TMP;
--Testcase 349:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '3'::float8);
--Testcase 350:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 351:
DELETE FROM FLOAT8_TMP;
--Testcase 352:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3.5'::float8);
--Testcase 353:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 354:
DELETE FROM FLOAT8_TMP;
--Testcase 355:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, 'infinity'::float8);
--Testcase 356:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 357:
DELETE FROM FLOAT8_TMP;
--Testcase 358:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-infinity'::float8);
--Testcase 359:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- take exp of ln(f.f1)
--Testcase 67:
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
--Testcase 360:
DELETE FROM FLOAT8_TMP;
--Testcase 361:
INSERT INTO FLOAT8_TMP VALUES ('inf'::float8), ('-inf'::float8), ('nan'::float8);
--Testcase 362:
SELECT exp(f1) FROM FLOAT8_TMP;
-- cube root
BEGIN;
--Testcase 68:
DELETE FROM FLOAT8_TBL;
--Testcase 69:
INSERT INTO FLOAT8_TBL VALUES ('27'::float8);
--Testcase 70:
SELECT ||/f1 as three FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 71:
SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
--Testcase 72:
SELECT * FROM FLOAT8_TBL;
--Testcase 73:
UPDATE FLOAT8_TBL
SET f1 = FLOAT8_TBL.f1 * '-1'
WHERE FLOAT8_TBL.f1 > '0.0';
--Testcase 74:
SELECT f.f1 * '1e200' from FLOAT8_TBL f;
--Testcase 75:
SELECT f.f1 ^ '1e200' from FLOAT8_TBL f;
BEGIN;
--Testcase 76:
DELETE FROM FLOAT8_TBL;
--Testcase 77:
INSERT INTO FLOAT8_TBL VALUES (0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5);
--Testcase 78:
SELECT * FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 79:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
--Testcase 80:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
--Testcase 81:
SELECT exp(f.f1) from FLOAT8_TBL f;
--Testcase 82:
SELECT f.f1 / '0.0' from FLOAT8_TBL f;
--Testcase 83:
SELECT * 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.
--Testcase 157:
DELETE FROM FLOAT8_TMP;
--Testcase 158:
INSERT INTO FLOAT8_TMP(f1) VALUES (1);
--Testcase 159:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 160:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 161:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 162:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 163:
DELETE FROM FLOAT8_TMP;
--Testcase 164:
INSERT INTO FLOAT8_TMP(f1) VALUES (2);
--Testcase 165:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 166:
DELETE FROM FLOAT8_TMP;
--Testcase 167:
INSERT INTO FLOAT8_TMP(f1) VALUES (0.5);
--Testcase 168:
SELECT atanh(f1) FROM FLOAT8_TMP;
-- test Inf/NaN cases for hyperbolic functions
--Testcase 169:
DELETE FROM FLOAT8_TMP;
--Testcase 170:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 171:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 172:
DELETE FROM FLOAT8_TMP;
--Testcase 173:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 174:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 175:
DELETE FROM FLOAT8_TMP;
--Testcase 176:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 177:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 178:
DELETE FROM FLOAT8_TMP;
--Testcase 179:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 180:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 181:
DELETE FROM FLOAT8_TMP;
--Testcase 182:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 183:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 184:
DELETE FROM FLOAT8_TMP;
--Testcase 185:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 186:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 187:
DELETE FROM FLOAT8_TMP;
--Testcase 188:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 189:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 190:
DELETE FROM FLOAT8_TMP;
--Testcase 191:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 192:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 193:
DELETE FROM FLOAT8_TMP;
--Testcase 194:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 195:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 196:
DELETE FROM FLOAT8_TMP;
--Testcase 197:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 198:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 199:
DELETE FROM FLOAT8_TMP;
--Testcase 200:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 201:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 202:
DELETE FROM FLOAT8_TMP;
--Testcase 203:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 204:
SELECT asinh(f1) FROM FLOAT8_TMP;
-- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test
-- SELECT acosh(float8 'infinity');
--Testcase 205:
DELETE FROM FLOAT8_TMP;
--Testcase 206:
INSERT INTO FLOAT8_TMP VALUES (float8 '-infinity');
--Testcase 207:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 208:
DELETE FROM FLOAT8_TMP;
--Testcase 209:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 210:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 211:
DELETE FROM FLOAT8_TMP;
--Testcase 212:
INSERT INTO FLOAT8_TMP VALUES ((float8 'infinity'));
--Testcase 213:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 214:
DELETE FROM FLOAT8_TMP;
--Testcase 215:
INSERT INTO FLOAT8_TMP VALUES ((float8 '-infinity'));
--Testcase 216:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 217:
DELETE FROM FLOAT8_TMP;
--Testcase 218:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 219:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 369:
RESET extra_float_digits;
-- test for over- and underflow
--Testcase 84:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
--Testcase 85:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
--Testcase 86:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
--Testcase 87:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
-- maintain external table consistency across platforms
-- delete all values and reinsert well-behaved ones
--Testcase 88:
DELETE FROM FLOAT8_TBL;
--Testcase 89:
INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
--Testcase 90:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
--Testcase 91:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
--Testcase 92:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
--Testcase 93:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
--Testcase 94:
SELECT * FROM FLOAT8_TBL;
-- test edge-case coercions to integer
--Testcase 220:
DELETE FROM FLOAT8_TMP;
--Testcase 221:
INSERT INTO FLOAT8_TMP VALUES ('32767.4'::float8);
--Testcase 222:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 223:
DELETE FROM FLOAT8_TMP;
--Testcase 224:
INSERT INTO FLOAT8_TMP VALUES ('32767.6'::float8);
--Testcase 225:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 226:
DELETE FROM FLOAT8_TMP;
--Testcase 227:
INSERT INTO FLOAT8_TMP VALUES ('-32768.4'::float8);
--Testcase 228:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 229:
DELETE FROM FLOAT8_TMP;
--Testcase 230:
INSERT INTO FLOAT8_TMP VALUES ('-32768.6'::float8);
--Testcase 231:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 232:
DELETE FROM FLOAT8_TMP;
--Testcase 233:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.4'::float8);
--Testcase 234:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 235:
DELETE FROM FLOAT8_TMP;
--Testcase 236:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.6'::float8);
--Testcase 237:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 238:
DELETE FROM FLOAT8_TMP;
--Testcase 239:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.4'::float8);
--Testcase 240:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 241:
DELETE FROM FLOAT8_TMP;
--Testcase 242:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.6'::float8);
--Testcase 243:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 244:
DELETE FROM FLOAT8_TMP;
--Testcase 245:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854773760'::float8);
--Testcase 246:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 247:
DELETE FROM FLOAT8_TMP;
--Testcase 248:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854775807'::float8);
--Testcase 249:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 250:
DELETE FROM FLOAT8_TMP;
--Testcase 251:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854775808.5'::float8);
--Testcase 252:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 253:
DELETE FROM FLOAT8_TMP;
--Testcase 254:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854780000'::float8);
--Testcase 255:
SELECT f1::int8 FROM FLOAT8_TMP;
-- test exact cases for trigonometric functions in degrees
BEGIN;
--Testcase 95:
DELETE FROM FLOAT8_TBL;
--Testcase 96:
INSERT INTO FLOAT8_TBL VALUES (0), (30), (90), (150), (180),
(210), (270), (330), (360);
--Testcase 97:
SELECT f1,
sind(f1),
sind(f1) IN (-1,-0.5,0,0.5,1) AS sind_exact
FROM FLOAT8_TBL;
--Testcase 98:
DELETE FROM FLOAT8_TBL;
--Testcase 99:
INSERT INTO FLOAT8_TBL VALUES (0), (60), (90), (120), (180),
(240), (270), (300), (360);
--Testcase 100:
SELECT f1,
cosd(f1),
cosd(f1) IN (-1,-0.5,0,0.5,1) AS cosd_exact
FROM FLOAT8_TBL;
--Testcase 101:
DELETE FROM FLOAT8_TBL;
--Testcase 102:
INSERT INTO FLOAT8_TBL VALUES (0), (45), (90), (135), (180),
(225), (270), (315), (360);
--Testcase 103:
SELECT f1,
tand(f1),
tand(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS tand_exact,
cotd(f1),
cotd(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS cotd_exact
FROM FLOAT8_TBL;
--Testcase 104:
DELETE FROM FLOAT8_TBL;
--Testcase 105:
INSERT INTO FLOAT8_TBL VALUES (-1), (-0.5), (0), (0.5), (1);
--Testcase 106:
SELECT f1,
asind(f1),
asind(f1) IN (-90,-30,0,30,90) AS asind_exact,
acosd(f1),
acosd(f1) IN (0,60,90,120,180) AS acosd_exact
FROM FLOAT8_TBL;
--Testcase 107:
DELETE FROM FLOAT8_TBL;
--Testcase 108:
INSERT INTO FLOAT8_TBL VALUES ('-Infinity'::float8), (-1), (0), (1),
('Infinity'::float8);
--Testcase 109:
SELECT f1,
atand(f1),
atand(f1) IN (-90,-45,0,45,90) AS atand_exact
FROM FLOAT8_TBL;
--Testcase 110:
DELETE FROM FLOAT8_TBL;
--Testcase 111:
INSERT INTO FLOAT8_TBL SELECT * FROM generate_series(0, 360, 90);
--Testcase 112:
SELECT x, y,
atan2d(y, x),
atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact
FROM (SELECT 10*cosd(f1), 10*sind(f1)
FROM FLOAT8_TBL) AS t(x,y);
ROLLBACK;
--
-- 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).
--Testcase 256:
create type xfloat8;
--Testcase 257:
create function xfloat8in(cstring) returns xfloat8 immutable strict
language internal as 'int8in';
--Testcase 258:
create function xfloat8out(xfloat8) returns cstring immutable strict
language internal as 'int8out';
--Testcase 259:
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
--Testcase 260:
create cast (xfloat8 as float8) without function;
--Testcase 261:
create cast (float8 as xfloat8) without function;
--Testcase 262:
create cast (xfloat8 as bigint) without function;
--Testcase 263:
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.
--Testcase 264:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 265:
insert into testdata(bits) 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');
--Testcase 266:
select float8send(flt) as ibits,
flt
from (select bits::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- round-trip tests
begin;
--Testcase 267:
insert into testdata(bits) 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');
--Testcase 268:
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::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 269:
drop type xfloat8 cascade;
--Testcase 363:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/int4.sql
================================================
--
-- INT4 Based on PostgreSQL tests, please don't add additional tests here, use other test files
--
--Testcase 61:
CREATE EXTENSION sqlite_fdw;
--Testcase 62:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 63:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 64:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 2:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 3:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 4:
INSERT INTO INT4_TBL(f1) VALUES ('34.5');
-- largest and smallest values
--Testcase 5:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 6:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
-- bad input values -- should give errors
--Testcase 7:
INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
--Testcase 8:
INSERT INTO INT4_TBL(f1) VALUES ('asdf');
--Testcase 9:
INSERT INTO INT4_TBL(f1) VALUES (' ');
--Testcase 10:
INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
--Testcase 11:
INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
--Testcase 12:
INSERT INTO INT4_TBL(f1) VALUES ('123 5');
--Testcase 13:
INSERT INTO INT4_TBL(f1) VALUES ('');
--Testcase 14:
SELECT * FROM INT4_TBL;
--Testcase 15:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0';
--Testcase 16:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0';
--Testcase 17:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int2 '0';
--Testcase 18:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int4 '0';
--Testcase 19:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int2 '0';
--Testcase 20:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int4 '0';
--Testcase 21:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0';
--Testcase 22:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0';
--Testcase 23:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int2 '0';
--Testcase 24:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int4 '0';
--Testcase 25:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0';
--Testcase 26:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0';
-- positive odds
--Testcase 27:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
-- any evens
--Testcase 28:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
--Testcase 29:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i;
--Testcase 30:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 31:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i;
--Testcase 32:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 33:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i;
--Testcase 34:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 35:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i;
--Testcase 36:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 37:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i;
--Testcase 38:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 39:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i;
--Testcase 40:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 41:
SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i;
--Testcase 42:
SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i;
--
-- more complex expressions
--
-- variations on unary minus parsing
--Testcase 65:
DELETE FROM INT4_TMP;
--Testcase 66:
INSERT INTO INT4_TMP VALUES (-2, 3);
--Testcase 67:
SELECT f1 + f2 as one FROM INT4_TMP;
--Testcase 68:
DELETE FROM INT4_TMP;
--Testcase 69:
INSERT INTO INT4_TMP VALUES (4, 2);
--Testcase 70:
SELECT f1 - f2 as two FROM INT4_TMP;
--Testcase 46:
DELETE FROM INT4_TMP;
--Testcase 71:
INSERT INTO INT4_TMP VALUES (2, 1);
--Testcase 72:
SELECT f1- -f2 as three FROM INT4_TMP;
--Testcase 47:
DELETE FROM INT4_TMP;
--Testcase 73:
INSERT INTO INT4_TMP VALUES (2, 2);
--Testcase 74:
SELECT f1 - -f2 as four FROM INT4_TMP;
--Testcase 75:
DELETE FROM INT4_TMP;
--Testcase 76:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int2, '16'::int2 / '4'::int2);
--Testcase 77:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 78:
DELETE FROM INT4_TMP;
--Testcase 79:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int4, '16'::int2 / '4'::int4);
--Testcase 80:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 81:
DELETE FROM INT4_TMP;
--Testcase 82:
INSERT INTO INT4_TMP VALUES ('2'::int4 * '2'::int2, '16'::int4 / '4'::int2);
--Testcase 83:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 84:
DELETE FROM INT4_TMP;
--Testcase 85:
INSERT INTO INT4_TMP VALUES ('1000'::int4, '999'::int4);
--Testcase 86:
SELECT f1 < f2 AS false FROM INT4_TMP;
--Testcase 50:
DELETE FROM INT4_TMP;
--Testcase 91:
INSERT INTO INT4_TMP VALUES (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1);
--Testcase 92:
SELECT f1 as ten FROM INT4_TMP;
--Testcase 51:
DELETE FROM INT4_TMP;
--Testcase 93:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 94:
SELECT f1 + f1/f2 as three FROM INT4_TMP;
--Testcase 52:
DELETE FROM INT4_TMP;
--Testcase 95:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 96:
SELECT (f1 + f2)/f2 as two FROM INT4_TMP;
-- corner case
--Testcase 54:
DELETE FROM INT4_TMP;
--Testcase 97:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 98:
SELECT (f1<<31)::text FROM INT4_TMP;
--Testcase 56:
DELETE FROM INT4_TMP;
--Testcase 99:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 100:
SELECT ((f1<<31)+1)::text FROM INT4_TMP;
-- check sane handling of INT_MIN overflow cases
--Testcase 58:
DELETE FROM INT4_TMP;
--Testcase 101:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int4);
--Testcase 102:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 103:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 104:
SELECT f1 % f2 FROM INT4_TMP;
--Testcase 60:
DELETE FROM INT4_TMP;
--Testcase 105:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int2);
--Testcase 106:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 107:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 108:
SELECT f1 % f2 FROM INT4_TMP;
-- check rounding when casting from float
--Testcase 109:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 110:
DELETE FROM FLOAT8_TMP;
--Testcase 111:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 112:
SELECT f1 as x, f1::int4 as int4_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 113:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 114:
DELETE FROM NUMERIC_TMP;
--Testcase 115:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 116:
SELECT f1 as x, f1::int4 as int4_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 117:
DELETE FROM INT4_TMP;
--Testcase 118:
INSERT INTO INT4_TMP 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);
--Testcase 119:
SELECT f1, f2, gcd(f1, f2), gcd(f1, -f2), gcd(f2, f1), gcd(-f2, f1) FROM INT4_TMP;
--Testcase 120:
DELETE FROM INT4_TMP;
--Testcase 121:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 0::int4);
--Testcase 122:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 123:
DELETE FROM INT4_TMP;
--Testcase 124:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-2147483648)::int4);
--Testcase 125:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
-- test lcm()
--Testcase 126:
DELETE FROM INT4_TMP;
--Testcase 127:
INSERT INTO INT4_TMP 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);
--Testcase 128:
SELECT f1, f2, lcm(f1, f2), lcm(f1, -f2), lcm(f2, f1), lcm(-f2, f1) FROM INT4_TMP;
--Testcase 129:
DELETE FROM INT4_TMP;
--Testcase 130:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 1::int4);
--Testcase 131:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 132:
DELETE FROM INT4_TMP;
--Testcase 133:
INSERT INTO INT4_TMP VALUES (2147483647::int4, 2147483646::int4);
--Testcase 134:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 137:
DELETE FROM INT4_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 135:
DROP SERVER sqlite_svr;
--Testcase 136:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/int8.sql
================================================
--
-- INT8
-- Test int8 64-bit integers.
--
--Testcase 140:
CREATE EXTENSION sqlite_fdw;
--Testcase 141:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 142:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 143:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 2:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 3:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 4:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 5:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
-- bad inputs
--Testcase 6:
INSERT INTO INT8_TBL(q1) VALUES (' ');
--Testcase 7:
INSERT INTO INT8_TBL(q1) VALUES ('xxx');
--Testcase 8:
INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485');
--Testcase 9:
INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934');
--Testcase 10:
INSERT INTO INT8_TBL(q1) VALUES ('- 123');
--Testcase 11:
INSERT INTO INT8_TBL(q1) VALUES (' 345 5');
--Testcase 12:
INSERT INTO INT8_TBL(q1) VALUES ('');
--Testcase 13:
SELECT * FROM INT8_TBL;
-- int8/int8 cmp
--Testcase 14:
SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
--Testcase 15:
SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
--Testcase 16:
SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
--Testcase 17:
SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
--Testcase 18:
SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
--Testcase 19:
SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
-- int8/int4 cmp
--Testcase 20:
SELECT * FROM INT8_TBL WHERE q2 = 456;
--Testcase 21:
SELECT * FROM INT8_TBL WHERE q2 <> 456;
--Testcase 22:
SELECT * FROM INT8_TBL WHERE q2 < 456;
--Testcase 23:
SELECT * FROM INT8_TBL WHERE q2 > 456;
--Testcase 24:
SELECT * FROM INT8_TBL WHERE q2 <= 456;
--Testcase 25:
SELECT * FROM INT8_TBL WHERE q2 >= 456;
-- int4/int8 cmp
--Testcase 26:
SELECT * FROM INT8_TBL WHERE 123 = q1;
--Testcase 27:
SELECT * FROM INT8_TBL WHERE 123 <> q1;
--Testcase 28:
SELECT * FROM INT8_TBL WHERE 123 < q1;
--Testcase 29:
SELECT * FROM INT8_TBL WHERE 123 > q1;
--Testcase 30:
SELECT * FROM INT8_TBL WHERE 123 <= q1;
--Testcase 31:
SELECT * FROM INT8_TBL WHERE 123 >= q1;
-- int8/int2 cmp
--Testcase 32:
SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
--Testcase 33:
SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
--Testcase 34:
SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
--Testcase 35:
SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
--Testcase 36:
SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
--Testcase 37:
SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
-- int2/int8 cmp
--Testcase 38:
SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
--Testcase 39:
SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
--Testcase 40:
SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
--Testcase 41:
SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
--Testcase 42:
SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
--Testcase 43:
SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
--Testcase 44:
SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL;
--Testcase 45:
SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL;
--Testcase 46:
SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL;
--Testcase 47:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
--Testcase 48:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL
WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
--Testcase 49:
SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
--Testcase 50:
SELECT q1, float8(q1) FROM INT8_TBL;
--Testcase 51:
SELECT q2, float8(q2) FROM INT8_TBL;
--Testcase 52:
SELECT 37 + q1 AS plus4 FROM INT8_TBL;
--Testcase 53:
SELECT 37 - q1 AS minus4 FROM INT8_TBL;
--Testcase 54:
SELECT 2 * q1 AS "twice int4" FROM INT8_TBL;
--Testcase 55:
SELECT q1 * 2 AS "twice int4" FROM INT8_TBL;
-- int8 op int4
--Testcase 56:
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
--Testcase 57:
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
--Testcase 58:
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
--Testcase 59:
SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
--Testcase 60:
SELECT q2, abs(q2) FROM INT8_TBL;
--Testcase 61:
SELECT min(q1), min(q2) FROM INT8_TBL;
--Testcase 62:
SELECT max(q1), max(q2) FROM INT8_TBL;
-- TO_CHAR()
--
--Testcase 63:
SELECT to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999')
FROM INT8_TBL;
--Testcase 64:
SELECT to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999')
FROM INT8_TBL;
--Testcase 65:
SELECT to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR')
FROM INT8_TBL;
--Testcase 66:
SELECT to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999')
FROM INT8_TBL;
--Testcase 67:
SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL;
--Testcase 68:
SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL;
--Testcase 69:
SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL;
--Testcase 70:
SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL;
--Testcase 71:
SELECT to_char(q2, '0999999999999999') FROM INT8_TBL;
--Testcase 72:
SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL;
--Testcase 73:
SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL;
--Testcase 74:
SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL;
--Testcase 75:
SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL;
--Testcase 76:
SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL;
--Testcase 77:
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;
--Testcase 78:
SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
--Testcase 79:
SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL;
-- check min/max values and overflow behavior
--Testcase 80:
DELETE FROM INT8_TMP;
--Testcase 144:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 145:
SELECT q1 FROM INT8_TMP;
--Testcase 81:
DELETE FROM INT8_TMP;
--Testcase 146:
INSERT INTO INT8_TMP VALUES ('-9223372036854775809'::int8);
--Testcase 147:
SELECT q1 FROM INT8_TMP;
--Testcase 82:
DELETE FROM INT8_TMP;
--Testcase 148:
INSERT INTO INT8_TMP VALUES ('9223372036854775807'::int8);
--Testcase 149:
SELECT q1 FROM INT8_TMP;
--Testcase 83:
DELETE FROM INT8_TMP;
--Testcase 150:
INSERT INTO INT8_TMP VALUES ('9223372036854775808'::int8);
--Testcase 151:
SELECT q1 FROM INT8_TMP;
--Testcase 84:
DELETE FROM INT8_TMP;
--Testcase 152:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775807'::int8));
--Testcase 153:
SELECT q1 FROM INT8_TMP;
--Testcase 86:
DELETE FROM INT8_TMP;
--Testcase 154:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775808'::int8));
--Testcase 155:
SELECT q1 FROM INT8_TMP;
--Testcase 87:
DELETE FROM INT8_TMP;
--Testcase 156:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 157:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 88:
DELETE FROM INT8_TMP;
--Testcase 158:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 159:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 89:
DELETE FROM INT8_TMP;
--Testcase 160:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 161:
SELECT q1-q2 FROM INT8_TMP;
--Testcase 90:
DELETE FROM INT8_TMP;
--Testcase 162:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 163:
SELECT q1 - q2 FROM INT8_TMP;
--Testcase 91:
DELETE FROM INT8_TMP;
--Testcase 164:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 165:
SELECT q1 * q2 FROM INT8_TMP;
--Testcase 92:
DELETE FROM INT8_TMP;
--Testcase 166:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 167:
SELECT q1 / q2 FROM INT8_TMP;
--Testcase 93:
DELETE FROM INT8_TMP;
--Testcase 168:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 169:
SELECT q1 % q2 FROM INT8_TMP;
--Testcase 94:
DELETE FROM INT8_TMP;
--Testcase 170:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 171:
SELECT abs(q1) FROM INT8_TMP;
--Testcase 95:
DELETE FROM INT8_TMP;
--Testcase 172:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 173:
SELECT q1 + q3 FROM INT8_TMP;
--Testcase 96:
DELETE FROM INT8_TMP;
--Testcase 174:
INSERT INTO INT8_TMP(q1, q3) VALUES ('-9223372036854775800'::int8 , '100'::int4);
--Testcase 175:
SELECT q1 - q3 FROM INT8_TMP;
--Testcase 97:
DELETE FROM INT8_TMP;
--Testcase 176:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 177:
SELECT q1 * q3 FROM INT8_TMP;
--Testcase 98:
DELETE FROM INT8_TMP;
--Testcase 178:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 179:
SELECT q3 + q1 FROM INT8_TMP;
--Testcase 99:
DELETE FROM INT8_TMP;
--Testcase 180:
INSERT INTO INT8_TMP(q3, q1) VALUES ('-100'::int4 , '9223372036854775800'::int8);
--Testcase 181:
SELECT q3 - q1 FROM INT8_TMP;
--Testcase 100:
DELETE FROM INT8_TMP;
--Testcase 182:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 183:
SELECT q3 * q1 FROM INT8_TMP;
--Testcase 101:
DELETE FROM INT8_TMP;
--Testcase 184:
INSERT INTO INT8_TMP(q1, q4) VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 185:
SELECT q1 + q4 FROM INT8_TMP;
--Testcase 102:
DELETE FROM INT8_TMP;
--Testcase 186:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775800'::int8 , '100'::int2);
--Testcase 187:
SELECT q1 - q4 FROM INT8_TMP;
--Testcase 103:
DELETE FROM INT8_TMP;
--Testcase 188:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 189:
SELECT q1 * q4 FROM INT8_TMP;
--Testcase 104:
DELETE FROM INT8_TMP;
--Testcase 190:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775808'::int8 , '0'::int2);
--Testcase 191:
SELECT q1 / q4 FROM INT8_TMP;
--Testcase 105:
DELETE FROM INT8_TMP;
--Testcase 192:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 193:
SELECT q4 + q1 FROM INT8_TMP;
--Testcase 106:
DELETE FROM INT8_TMP;
--Testcase 194:
INSERT INTO INT8_TMP(q4, q1) VALUES ('-100'::int2 , '9223372036854775800'::int8);
--Testcase 195:
SELECT q4 - q1 FROM INT8_TMP;
--Testcase 107:
DELETE FROM INT8_TMP;
--Testcase 196:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 197:
SELECT q4 * q1 FROM INT8_TMP;
--Testcase 108:
DELETE FROM INT8_TMP;
--Testcase 198:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '0'::int8);
--Testcase 199:
SELECT q4 / q1 FROM INT8_TMP;
--Testcase 110:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
--Testcase 111:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
--Testcase 112:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
--Testcase 113:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
--Testcase 200:
DELETE FROM INT8_TMP;
--Testcase 201:
INSERT INTO INT8_TMP(q5) VALUES ('42'), ('-37');
--Testcase 202:
SELECT CAST(q5::int2 as int8) FROM INT8_TMP;
--Testcase 114:
SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
--Testcase 203:
DELETE FROM INT8_TMP;
--Testcase 204:
INSERT INTO INT8_TMP(q5) VALUES ('36854775807.0');
--Testcase 205:
SELECT CAST(q5::float4 AS int8) FROM INT8_TMP;
--Testcase 206:
DELETE FROM INT8_TMP;
--Testcase 207:
INSERT INTO INT8_TMP(q5) VALUES ('922337203685477580700.0');
--Testcase 208:
SELECT CAST(q5::float8 AS int8) FROM INT8_TMP;
--Testcase 115:
SELECT CAST(q1 AS oid) FROM INT8_TBL;
--Testcase 209:
SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
-- bit operations
--Testcase 116:
SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
--Testcase 117:
SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
-- generate_series
--Testcase 118:
DELETE FROM INT8_TMP;
--Testcase 210:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8) q1;
--Testcase 211:
SELECT q1 FROM INT8_TMP;
--Testcase 120:
DELETE FROM INT8_TMP;
--Testcase 212:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0) q1; -- should error
--Testcase 213:
SELECT q1 FROM INT8_TMP;
--Testcase 122:
DELETE FROM INT8_TMP;
--Testcase 214:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2) q1;
--Testcase 215:
SELECT q1 FROM INT8_TMP;
-- corner case
--Testcase 216:
DELETE FROM INT8_TMP;
--Testcase 217:
INSERT INTO INT8_TMP VALUES (-1::int8<<63);
--Testcase 218:
SELECT q1::text FROM INT8_TMP;
--Testcase 219:
DELETE FROM INT8_TMP;
--Testcase 220:
INSERT INTO INT8_TMP VALUES ((-1::int8<<63)+1);
--Testcase 221:
SELECT q1::text FROM INT8_TMP;
-- check sane handling of INT64_MIN overflow cases
--Testcase 125:
DELETE FROM INT8_TMP;
--Testcase 222:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int8, 888);
--Testcase 126:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int8, 888);
--Testcase 127:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int8, 888);
--Testcase 128:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 129:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 130:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int4, 888);
--Testcase 131:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int4, 888);
--Testcase 132:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int4, 888);
--Testcase 133:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 134:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 135:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int2, 888);
--Testcase 136:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int2, 888);
--Testcase 137:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int2, 888);
--Testcase 138:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 139:
DELETE FROM INT8_TMP WHERE q2 = 888;
-- check rounding when casting from float
--Testcase 223:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 224:
DELETE FROM FLOAT8_TMP;
--Testcase 225:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 226:
SELECT f1 as x, f1::int8 as int8_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 227:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 228:
DELETE FROM NUMERIC_TMP;
--Testcase 229:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 230:
SELECT f1 as x, f1::int8 as int8_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 231:
DELETE FROM INT8_TMP;
--Testcase 232:
INSERT INTO INT8_TMP 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);
--Testcase 233:
SELECT q1, q2, gcd(q1, q2), gcd(q1, -q2), gcd(q2, q1), gcd(-q2, q1) FROM INT8_TMP;
--Testcase 234:
DELETE FROM INT8_TMP;
--Testcase 235:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 0::int8);
--Testcase 236:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 237:
DELETE FROM INT8_TMP;
--Testcase 238:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, (-9223372036854775808)::int8);
--Testcase 239:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
-- test lcm()
--Testcase 240:
DELETE FROM INT8_TMP;
--Testcase 241:
INSERT INTO INT8_TMP 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);
--Testcase 242:
SELECT q1, q2, lcm(q1, q2), lcm(q1, -q2), lcm(q2, q1), lcm(-q2, q1) FROM INT8_TMP;
--Testcase 243:
DELETE FROM INT8_TMP;
--Testcase 244:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 1::int8);
--Testcase 245:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 246:
DELETE FROM INT8_TMP;
--Testcase 247:
INSERT INTO INT8_TMP VALUES ((9223372036854775807)::int8, (9223372036854775806)::int8);
--Testcase 248:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 251:
DELETE FROM INT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 249:
DROP SERVER sqlite_svr;
--Testcase 250:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/json.sql
================================================
-- SET log_min_messages TO DEBUG3;
-- SET client_min_messages TO DEBUG3;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 010:
CREATE FOREIGN TABLE "type_JSON" (
"i" int OPTIONS (key 'true'),
"j" json,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" json
) SERVER sqlite_svr OPTIONS (table 'type_JSON');
--Testcase 011:
CREATE FOREIGN TABLE "type_JSONB" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB');
--Testcase 012:
CREATE FOREIGN TABLE "type_JSONB+" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
l int, t varchar(16), tx text,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB+');
--Testcase 013:
INSERT INTO "type_JSON" ("i", "j", ot, ot1, oi, oi1) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}],"a+u":47,"5":true,"cc3":["a", "b", "c"], "c3":[true, false]}',
'c', 'c3', 2, 1),
(2, '[11,22,33,44,55,66,77,88,99,10,11,12,13,14]',
'1', '29', 3, 1),
(3, '{"a":"xyz", "π":3.1415926535, "aπ":false }',
'a', 'π', 1, NULL),
(4, '{"a":null, "a22":22.0, "a2":2 }',
'a', '22', 4, NULL),
(5, '[9,null,7,6,5,4,3,2,1,0]',
'1', '5', -4, 5),
(6, '[0.0,1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,null,true]',
'1', '21', -2, 5);
--Testcase 014:
INSERT INTO "type_JSONB" SELECT * FROM "type_JSON";
--Testcase 015: check some SQLite JSONb initial bytes
SELECT i, tx FROM "type_JSONB+";
--Testcase 020:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 021: SQLite queries to type_JSON will be without normalization for j column
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN j OPTIONS (ADD column_type 'text');
--Testcase 022:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 023:
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 024:
SELECT "i", "j", j."j"->'a' res FROM "type_JSON" j;
--Testcase 025:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 026:
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 027:
SELECT "i", "j", j."j"->'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 028:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 029:
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 030:
SELECT "i", "j", j."j"->>'a' res FROM "type_JSON" j;
--Testcase 031:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 032:
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 033:
SELECT "i", "j", j."j"->>'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 034:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 035:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 036:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 037:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 038:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 039:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 040:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 041:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 042:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 044:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 045:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 046:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 047:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 048:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSON" j;
--Testcase 049:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 050:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 051:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSONB" j;
--Testcase 052:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 053:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 054:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSON" j;
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 056:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 057:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSONB" j;
--Testcase 058:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 059:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 060:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 061:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 062:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 063:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 064:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 065:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 066:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 067:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 068:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 069:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 071:
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 072:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 073:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 074:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 075:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 077:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 078:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 079:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 081:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 082:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 083:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 085:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 086:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 087:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 088:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 089:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 090:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 091:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 093:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 095:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 096:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 097:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 099:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
-- extraction with arithmetical an other expressions
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 101:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 103:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 105:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 107:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 109:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 111:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 113:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 115:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 117:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 119:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 120:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 121:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 123:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 125:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 127:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 129:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 131:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 133:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 135:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 137:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 139:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 141:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 143:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 144:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 145:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 146:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 147:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 148:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 149:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 151:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 153:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 155:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 157:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 159:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 161:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 163:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 165:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 167:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 169:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 171:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 172:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 173:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 174:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 175:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 176:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 177:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 178:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 179:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--TCs for SQLite JSON -> format, no sense in PostgreSQL itself
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 201:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 203:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 204:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 205:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 206:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 207:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 208:
DELETE FROM "type_JSON";
--Testcase 209:
DELETE FROM "type_JSONB";
--Testcase 210:
INSERT INTO "type_JSON" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 211:
INSERT INTO "type_JSONB" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 212:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 213:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 214:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 215:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 216:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 217:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 218:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 219:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 220:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 221:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 222:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 223:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 224:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 225:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 226:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
--Testcase 227:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
-- end of SQLite right -> ->> operand test
-- Operators -> ->> in SELECT context
--Testcase 230:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 231:
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 232:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 233:
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 234:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 235:
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 236:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 237:
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 238:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 239:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 240:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 241:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 250:
DELETE FROM "type_JSON";
--Testcase 251:
DELETE FROM "type_JSONB";
--Testcase 252:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text;
--Testcase 253:
INSERT INTO "type_JSON" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 254:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text[];
--Testcase 255:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text;
--Testcase 256:
INSERT INTO "type_JSONB" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 257:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text[];
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 261:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 262:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 263:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 265
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 267:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 269:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 270:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 271:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 272:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 273
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 274:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 275:
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 276:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 277: no such - even wrong JSON gives false
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 278:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 279:
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 280:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 281: no such - even wrong JSON gives false
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 282:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 283:
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 284:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 285: no such
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 286:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 287:
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 288:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 289: no such
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 290:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 291:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 292:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 293:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 294:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 295:
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 296:
SELECT * FROM "type_JSONB+";
--Testcase 297:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 298:
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 299:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Testcase 300: no such
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Multievel extraction chains
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 302:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 304:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 306:
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
--Testcase 308:
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
-- UPDATE tests
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 310:
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 311:
SELECT * FROM "type_JSON" WHERE "i" = 1;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 313:
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 314:
SELECT * FROM "type_JSONB+" WHERE "i" = 1;
-- Real GIS data test, data from https://www.wikidata.org/wiki/Q118122043
-- https://commons.wikimedia.org/wiki/Category:Private_Garden_(Pavlovsk)
-- License of testing data in json_osm_test table: ODbL, © OpenStreetMap contributors
--Testcase 400:
CREATE FOREIGN TABLE json_osm_test (
wkt text NOT NULL,
osm_type varchar(8) OPTIONS (key 'true') NOT NULL,
osm_id int8 OPTIONS (key 'true') NOT NULL,
t json OPTIONS (column_name 'tags') NULL,
way_nodes text NULL
) SERVER sqlite_svr;
--Testcase 401:
INSERT INTO json_osm_test VALUES ('SRID=4326;POINT(30.4536193 59.6847624)', 'node', 1198356775, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4522474 59.6851858)', 'node', 1198357028, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4532025 59.6850113)', 'node', 1738381537, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "description": "Ваза в дендрарии Собственного садика", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529584 59.6849417)', 'node', 3968068680, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526407 59.68497)', 'node', 4487385447, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "late C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4524943 59.6854502)', 'node', 4912270255, '{"fee": "yes", "access": "customers", "barrier": "gate", "vehicle": "no", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "barrier:personnel": "additional"}', NULL),
('SRID=4326;POINT(30.452977 59.6847621)', 'node', 7484858507, '{"name": "Неизвестный мужчина", "ref:okn": "781610399040516", "tourism": "artwork", "alt_name": "Спутник Одиссея", "heritage": "2", "historic": "yes", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6522/"}', NULL),
('SRID=4326;POINT(30.452909 59.6847573)', 'node', 7484858508, '{"name": "Антиной", "ref:okn": "781610399040526", "tourism": "artwork", "alt_name": "Дионис", "heritage": "2", "historic": "yes", "material": "stone", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6521/"}', NULL),
('SRID=4326;POINT(30.4529561 59.6848095)', 'node', 8114975053, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528946 59.6848042)', 'node', 8114975054, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528732 59.6848762)', 'node', 8114975055, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529364 59.6848802)', 'node', 8114975056, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528444 59.6851765)', 'node', 8289295956, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527798 59.6851726)', 'node', 8289295957, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528665 59.6850957)', 'node', 8289295958, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528046 59.685091)', 'node', 8289295959, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528947 59.6850172)', 'node', 8289295960, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528301 59.6850118)', 'node', 8289295961, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529101 59.6849636)', 'node', 8289295962, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528496 59.684959)', 'node', 8289295963, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528359 59.6852187)', 'node', 8331430659, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527605 59.685213)', 'node', 8331430660, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4523414 59.6851726)', 'node', 8331430663, '{"name": "Сатир", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4523561 59.685141)', 'node', 8331430664, '{"name": "Сатиресса", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4527994 59.6847007)', 'node', 8566916332, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4528945 59.6847497)', 'node', 8566916333, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529784 59.6853519)', 'node', 8895996426, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4529255 59.6853861)', 'node', 8895996427, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4525278 59.685471)', 'node', 8895996643, '{"genus": "Tilia", "height": "6", "natural": "tree", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4534153 59.6851412)', 'node', 8899249758, '{"genus": "Elaeagnus", "taxon": "Elaeagnus commutata", "natural": "shrub", "genus:ru": "Лох", "taxon:ru": "Лох серебристый", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4535524 59.6848638)', 'node', 8899249764, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4535202 59.6849613)', 'node', 8899249765, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534934 59.6850486)', 'node', 8899249766, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534679 59.685136)', 'node', 8899249767, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4528899 59.6851725)', 'node', 8899249768, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530448 59.6850046)', 'node', 8899249769, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4533465 59.6850216)', 'node', 8899249770, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4532205 59.6849417)', 'node', 8899249771, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531776 59.6850839)', 'node', 8899249772, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4534136 59.6851265)', 'node', 8899249773, '{"genus": "Malus", "taxon": "Malus niedzwetzkyana", "height": "5", "natural": "tree", "genus:ru": "Яблоня", "taxon:ru": "Яблоня Недзвецкого", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533043 59.6851928)', 'node', 8899249779, '{"height": "4", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.452916 59.6849894)', 'node', 8899249796, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4528248 59.684983)', 'node', 8899249797, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531527 59.685139)', 'node', 8899299127, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529549 59.6850382)', 'node', 8902082041, '{"genus": "Syrínga", "taxon": "Syringa vulgaris", "natural": "shrub", "genus:ru": "Сирень", "taxon:ru": "Сирень обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530139 59.6850101)', 'node', 8902082042, '{"genus": "Amelanchier", "taxon": "Amelanchier canadensis", "natural": "shrub", "genus:ru": "Ирга", "taxon:ru": "Ирга канадская", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530089 59.6850564)', 'node', 8902082048, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529982 59.685072)', 'node', 8902082055, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530213 59.6850872)', 'node', 8902082060, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529918 59.6851617)', 'node', 8902082061, '{"genus": "Berberis", "taxon": "Berberis vulgaris", "natural": "shrub", "genus:ru": "Барбарис", "taxon:ru": "Барбарис обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530615 59.685137)', 'node', 8902082071, '{"genus": "Paeonia", "taxon": "Paeonia suffruticosa", "natural": "shrub", "genus:ru": "Пион", "taxon:ru": "Пион древовидный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531031 59.6851282)', 'node', 8902082072, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530991 59.6851451)', 'node', 8902082073, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531977 59.6851532)', 'node', 8902082074, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453207 59.6851336)', 'node', 8902082075, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532426 59.6850926)', 'node', 8902082171, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532694 59.6851157)', 'node', 8902082172, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533707 59.6851035)', 'node', 8902082173, '{"genus": "Hydrangea", "taxon": "Hydrangea paniculata", "natural": "shrub", "genus:ru": "Гортензия", "taxon:ru": "Гортензия метельчатая"}', NULL),
('SRID=4326;POINT(30.4528986 59.6851502)', 'node', 8902082174, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4530486 59.6848994)', 'node', 8904992674, '{"genus": "Viburnum", "taxon": "Viburnum opulus", "natural": "shrub", "genus:ru": "Калина", "taxon:ru": "Калина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532396 59.6848373)', 'node', 8905335421, '{"genus": "Corylus", "taxon": "Corylus avellana", "natural": "shrub", "genus:ru": "Лещина", "taxon:ru": "Лещина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532946 59.684841)', 'node', 8905335422, '{"genus": "Spiraea", "taxon": "Spiraea chamaedryfolia", "natural": "shrub", "genus:ru": "Спирея", "taxon:ru": "Спирея дубравколистная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533857 59.6849271)', 'node', 8905335423, '{"genus": "Euonymus", "taxon": "Euonymus europaeus", "natural": "shrub", "genus:ru": "Бересклет", "taxon:ru": "Бересклет европейский", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534136 59.6849004)', 'node', 8905335424, '{"genus": "Prunus", "taxon": "Prunus sachalinensis", "height": "5", "natural": "tree", "genus:ru": "Вишня", "taxon:ru": "Вишня сахалинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533998 59.6848611)', 'node', 8905335425, '{"genus": "Buxus", "taxon": "Buxus sempervirens", "height": "1", "natural": "shrub", "genus:ru": "Самшит", "taxon:ru": "Самшит вечнозелёный", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4534776 59.6848679)', 'node', 8905335426, '{"genus": "Rhamnus", "taxon": "Rhamnus cathartica", "height": "4", "natural": "tree", "genus:ru": "Жостер", "taxon:ru": "Жостер слабительный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534324 59.6849515)', 'node', 8905335427, '{"genus": "Lonicera", "taxon": "Lonicera caerulea", "natural": "shrub", "genus:ru": "Жимолость", "taxon:ru": "Жимолость синяя", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453365 59.684981)', 'node', 8905335428, '{"genus": "Philadelphus", "taxon": "Philadelphus coronarius", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник венечный"}', NULL),
('SRID=4326;POINT(30.4533874 59.6849671)', 'node', 8905335429, '{"genus": "Juniperus", "taxon": "Juniperus sabina", "height": "0.5", "natural": "shrub", "genus:ru": "Можжевельник", "taxon:ru": "Можжевельник казацкий", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4531319 59.6849356)', 'node', 8905335430, '{"genus": "Picea", "taxon": "Picea abies", "height": "0.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель европейская", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532466 59.6848527)', 'node', 8905335431, '{"genus": "Ginkgo", "taxon": "Ginkgo biloba", "height": "2.5", "natural": "tree", "genus:ru": "Гингко", "taxon:ru": "Гинкго двулопастный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "label"}', NULL),
('SRID=4326;POINT(30.4532184 59.6848635)', 'node', 8905335468, '{"genus": "Daphne", "taxon": "Daphne mezereum", "natural": "shrub", "genus:ru": "Волчеягодник", "taxon:ru": "Волчеягодник обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532392 59.6848902)', 'node', 8905335469, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526679 59.6846912)', 'node', 8905558225, '{"height": "3", "highway": "street_lamp", "man_made": "surveillance", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530347 59.6849253)', 'node', 8906857477, '{"genus": "Philadelphus lemoinei", "taxon": "Philadelphus lemoinei", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник Лемуана", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530224 59.6849455)', 'node', 8906857478, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530015 59.6847554)', 'node', 8906857479, '{"natural": "tree_stump"}', NULL),
('SRID=4326;LINESTRING(30.4522584 59.6851734,30.4522474 59.6851858)', 'way', 103807093, '{"highway": "footway", "surface": "compacted"}', '{3968068679,1198357028}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525041 59.6846527,30.4522364 59.6845601,30.4516531 59.6843525,30.4513385 59.6842533,30.4513511 59.6841667)', 'way', 103807103, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{8566824024,12023699867,8114975022,1195141497,4014269128,3186425168}'),
('SRID=4326;LINESTRING(30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456)', 'way', 103807114, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{1198357004,303515662,8566916345,1198356771,8566916346,1198356889,1198357009,8906857470}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529382 59.6847803,30.4528051 59.6851927,30.4527793 59.6852746,30.4527609 59.6853349,30.4527422 59.6853961,30.4527263 59.6854482,30.4527224 59.6854618)', 'way', 153761053, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068681,8114975050,8114975107,8895975844,8895975845,8895975847,4912270253,1664064412}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4532459 59.6852254,30.45322 59.6852491)', 'way', 153761054, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975105,3968068669}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4528762 59.6851274,30.4530118 59.6851874)', 'way', 153947121, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381541,1665582246}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4529574 59.6848702,30.4531238 59.6848204)', 'way', 153947122, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1738381532,1665582234}'),
('SRID=4326;LINESTRING(30.4533888 59.6848413,30.4535109 59.6849058,30.4534919 59.684967)', 'way', 153947123, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582235,1738381534,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533267 59.6852228,30.4533391 59.6851996,30.4533483 59.6851876,30.4533556 59.6851828,30.4533653 59.6851769,30.4533784 59.6851717,30.4533901 59.6851678,30.4534147 59.6851629,30.4534315 59.6851615,30.4534524 59.6850941)', 'way', 153947124, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975034,8899249793,8114975035,8902027910,8899249794,8902027909,8899249795,1738381544,8114975036,1665582244}'),
('SRID=4326;LINESTRING(30.4531795 59.685129,30.4533062 59.6850846,30.4534722 59.6850303,30.4534919 59.684967)', 'way', 153947125, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975075,1665582243,1738381539,1665582240}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4530483 59.6850678,30.4529356 59.6849912)', 'way', 153947126, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,1665582242,8902082170}'),
('SRID=4326;LINESTRING(30.4529356 59.6849912,30.4530873 59.6849398,30.453213 59.6848988)', 'way', 153947127, '{"highway": "footway", "surface": "fine_gravel"}', '{8902082170,1665582238,8904992643}'),
('SRID=4326;LINESTRING(30.4532598 59.6849025,30.4533508 59.6849575,30.4534722 59.6850303,30.4534524 59.6850941)', 'way', 153947128, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992648,1665582239,1738381539,1665582244}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4531238 59.6848204,30.4533888 59.6848413,30.4535282 59.6848524)', 'way', 153947130, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1665582234,1665582235,1665582236}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4530873 59.6849398,30.4532201 59.6849487,30.4533508 59.6849575,30.4534919 59.684967)', 'way', 153947131, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1665582238,8902082149,1665582239,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533062 59.6850846,30.4533306 59.6850189,30.4533508 59.6849575,30.4533888 59.6848413)', 'way', 153947132, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,1665582243,8902082150,1665582239,1665582235}'),
('SRID=4326;LINESTRING(30.4534524 59.6850941,30.4533062 59.6850846,30.4531801 59.6850762,30.4530483 59.6850678,30.452898 59.6850578)', 'way', 153947133, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582244,1665582243,8902082168,1665582242,1665582241}'),
('SRID=4326;LINESTRING(30.4532234 59.6850226,30.4533062 59.6850846,30.4534147 59.6851629)', 'way', 153947134, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975088,1665582243,1738381544}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4530483 59.6850678,30.4530675 59.6850048,30.4530873 59.6849398,30.4531238 59.6848204)', 'way', 153947135, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,1665582242,8902082151,1665582238,1665582234}'),
('SRID=4326;LINESTRING(30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858)', 'way', 312745383, '{"barrier": "fence"}', '{1439053672,4912270255,4438910482,8895996664,4438910480,3234125031,4438910477,8893386635,4438910475,8895996665,4438910473,8114975112,8114975111,1198357028}'),
('SRID=4326;LINESTRING(30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554)', 'way', 315626926, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053649,8895996432,8895996430,1439053648,1439053645,8895996431,1439053641,1439053639}'),
('SRID=4326;LINESTRING(30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577)', 'way', 317173782, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{1653641713,8114975028,8114975027,8566824024}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.4526304 59.6847065,30.4529536 59.6847313,30.453482 59.6847765,30.4535921 59.6847856,30.4535778 59.6848316,30.4534654 59.685163)', 'way', 393601662, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774427,8905543616,3968068681,7927774426,3968068674,8114975049,3968068687}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4530118 59.6851874,30.4532501 59.6852048,30.4532657 59.6852057)', 'way', 393601664, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1665582246,8899299159,1665582248}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4528762 59.6851274,30.4530483 59.6850678,30.4531752 59.6850205)', 'way', 393601667, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1738381541,1665582242,8114975100}'),
('SRID=4326;LINESTRING(30.452545 59.6854429,30.4525305 59.6854105,30.4525224 59.6853929,30.4525133 59.6853758,30.4525036 59.6853597,30.4524909 59.6853438,30.4524775 59.6853279,30.4524583 59.6853083,30.4524437 59.6852938,30.4524165 59.6852717,30.4523957 59.6852568,30.452375 59.6852427,30.4523461 59.6852243,30.4523179 59.6852068)', 'way', 393620818, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975116,8895996660,8895996640,4438927787,8895996641,8895996659,8895996642,4438927782,8114975115,8895996661,8895996639,4438927777,8895996638,8114975114}'),
('SRID=4326;LINESTRING(30.45322 59.6852491,30.4530263 59.6852336,30.4529402 59.6852275,30.4528645 59.6852217)', 'way', 393620820, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068669,8895975857,8895975877,8895975841}'),
('SRID=4326;LINESTRING(30.4527686 59.6854977,30.4528746 59.6855048)', 'way', 446650486, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053671,1439053674}'),
('SRID=4326;LINESTRING(30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905)', 'way', 446650506, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053619,8914843795,8895996424,8914843796,1439053616,8914843797,8895996423,8914843798,1439053613,8914843799,8895996422,8895996441,8914843802,8895996421,8914843801,1439053611,8914843800,8895996420,1439053614}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522278 59.6851794)', 'way', 446651403, '{"barrier": "fence"}', '{1198357028,1653641713}'),
('SRID=4326;LINESTRING(30.4524943 59.6854502,30.452545 59.6854429,30.4525879 59.6854383,30.4527263 59.6854482,30.4528729 59.6854587)', 'way', 500077282, '{"highway": "footway", "surface": "fine_gravel"}', '{4912270255,8114975116,4438928092,4912270253,4438928093}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522167 59.6853009)', 'way', 758868053, '{"highway": "footway"}', '{1198357028,1406921754}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529562 59.6847243)', 'way', 849729200, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068681,8905543615}'),
('SRID=4326;LINESTRING(30.453482 59.6847765,30.4534851 59.684767)', 'way', 849729201, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774426,8905543614}'),
('SRID=4326;LINESTRING(30.452599 59.6846895,30.4525675 59.6846756,30.45256 59.6846723,30.452568 59.6846486,30.4535014 59.6847265,30.4534976 59.6847368)', 'way', 849729202, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068677,12023732269,8566916344,8566916343,8566916342,7927774425}'),
('SRID=4326;LINESTRING(30.4528543 59.6851747,30.4529071 59.6850026,30.4529249 59.685004,30.4529333 59.6849769,30.452917 59.6849756,30.4529721 59.6847963)', 'way', 871154683, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8114975041,8899249805,8899249804,8899249803,8899249802,8114975042}'),
('SRID=4326;LINESTRING(30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274,30.4526587 59.6847165)', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8114975046,8114975047,8906857474,8906857473,8114975046}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4531264 59.6851489)', 'way', 871154687, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,8114975076}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257)', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,8114975073,8114975074,8114975057,8114975058,8114975059,8114975075,8114975060,8114975061,8114975067,8114975068,8114975069,8114975077,8114975070,8114975062,8114975063,8114975064,8114975076,8114975065,8114975066,8114975071,8114975072,8114975078}'),
('SRID=4326;LINESTRING(30.4532501 59.6852048,30.4531713 59.6851525)', 'way', 871154689, '{"highway": "footway", "surface": "fine_gravel"}', '{8899299159,8114975077}'),
('SRID=4326;LINESTRING(30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998)', 'way', 871154691, '{"highway": "footway"}', '{8114975097,8114975079,8114975080,8114975081,8114975082,8114975083,8114975099,8114975084,8114975085,8114975086,8114975087,8114975088,8114975089,8114975090,8114975091,8114975092,8114975100,8114975093,8114975094,8114975095,8114975096,8114975097}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4529574 59.6848702,30.4530873 59.6849398,30.4531787 59.684998)', 'way', 871154694, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1738381532,1665582238,8114975097}'),
('SRID=4326;LINESTRING(30.4532281 59.6850005,30.4533508 59.6849575,30.4535109 59.6849058,30.4535282 59.6848524)', 'way', 871154695, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975099,1665582239,1738381534,1665582236}'),
('SRID=4326;LINESTRING(30.4532459 59.6852254,30.4528051 59.6851927,30.4522785 59.6851511)', 'way', 871154698, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8114975105,8114975107,8114975109}'),
('SRID=4326;LINESTRING(30.4526095 59.6853751,30.4526201 59.6853832,30.4527025 59.6853899,30.4527175 59.6853841,30.4527302 59.6853414,30.4527195 59.685334,30.4526348 59.6853281,30.4526225 59.6853328,30.4526095 59.6853751)', 'way', 871154699, '{"landuse": "flowerbed"}', '{8114975123,8114975124,8114975125,8895996607,8895996606,8114975126,8114975127,8114975181,8114975123}'),
('SRID=4326;LINESTRING(30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686)', 'way', 871154701, '{"landuse": "flowerbed"}', '{8114975136,8114975137,8114975138,8114975139,8114975140,8114975141,8114975142,8114975143,8114975136}'),
('SRID=4326;LINESTRING(30.4525419 59.6853075,30.4525505 59.6853142,30.4526031 59.6853185,30.4526157 59.6853129,30.4526268 59.6852724,30.4526177 59.6852659,30.4525671 59.6852621,30.452555 59.6852672,30.4525419 59.6853075)', 'way', 871154702, '{"landuse": "flowerbed"}', '{8114975144,8114975145,8114975146,8114975147,8114975148,8114975149,8114975150,8114975151,8114975144}'),
('SRID=4326;LINESTRING(30.4526478 59.6852554,30.4526557 59.6852612,30.452739 59.6852678,30.4527533 59.685262,30.452765 59.685222,30.4527443 59.68522,30.4527459 59.685216,30.452673 59.6852102,30.4526587 59.6852148,30.4526478 59.6852554)', 'way', 871154706, '{"landuse": "flowerbed"}', '{8114975172,8114975173,8114975174,8114975175,8114975176,8114975177,8114975178,8114975179,8114975180,8114975172}'),
('SRID=4326;LINESTRING(30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)', 'way', 872998899, '{"landuse": "flowerbed"}', '{8129422266,8129422267,8129422268,8129422269,8129422270,8129422271,8129422272,8895996472,8129422273,8895996471,8129422266}'),
('SRID=4326;LINESTRING(30.4536402 59.684764,30.4536193 59.6847624,30.4536067 59.6847614)', 'way', 891865282, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{1635198216,1198356775,8289295975}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232)', 'way', 922841960, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824024,1653641402,8566824025,8566824026}'),
('SRID=4326;LINESTRING(30.453531 59.6847593,30.4531199 59.6847256)', 'way', 922854851, '{"height": "8", "natural": "tree_row", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{5002059748,5002059751}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.452599 59.6846895)', 'way', 922854852, '{"highway": "steps"}', '{7927774427,3968068677}'),
('SRID=4326;LINESTRING(30.4536067 59.6847614,30.4535894 59.6847601)', 'way', 922854853, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{8289295975,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4526552 59.6847274,30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274)))', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398)))', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102)))', 'way', 871154691, '{"highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526095 59.6853751,30.4526225 59.6853328,30.4526348 59.6853281,30.4527195 59.685334,30.4527302 59.6853414,30.4527175 59.6853841,30.4527025 59.6853899,30.4526201 59.6853832,30.4526095 59.6853751)))', 'way', 871154699, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139)))', 'way', 871154701, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525419 59.6853075,30.452555 59.6852672,30.4525671 59.6852621,30.4526177 59.6852659,30.4526268 59.6852724,30.4526157 59.6853129,30.4526031 59.6853185,30.4525505 59.6853142,30.4525419 59.6853075)))', 'way', 871154702, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526478 59.6852554,30.4526587 59.6852148,30.452673 59.6852102,30.4527459 59.685216,30.4527443 59.68522,30.452765 59.685222,30.4527533 59.685262,30.452739 59.6852678,30.4526557 59.6852612,30.4526478 59.6852554)))', 'way', 871154706, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)))', 'way', 872998899, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;LINESTRING(30.4521596 59.6854203,30.4524943 59.6854502)', 'way', 961421780, '{"highway": "footway", "surface": "fine_gravel"}', '{8893386627,4912270255}'),
('SRID=4326;LINESTRING(30.4533818 59.6852214,30.4533763 59.68521)', 'way', 961717566, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053598,1439053596}'),
('SRID=4326;LINESTRING(30.4534979 59.6851951,30.4535038 59.6852069)', 'way', 961717567, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053589,1439053591}'),
('SRID=4326;LINESTRING(30.4533763 59.68521,30.4534979 59.6851951)', 'way', 961717568, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053596,1439053589}'),
('SRID=4326;LINESTRING(30.4527378 59.6852117,30.4526559 59.6852052,30.4525684 59.6851982,30.4524641 59.6851898,30.4522584 59.6851734)', 'way', 961717569, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975842,8895975876,8895975873,8895975858,3968068679}'),
('SRID=4326;LINESTRING(30.4530032 59.685292,30.453022 59.6852839,30.4530407 59.6852758,30.4530635 59.68527,30.4530877 59.685267,30.4531091 59.6852663,30.4531333 59.6852683,30.4531547 59.6852744,30.45322 59.6852491)', 'way', 961717570, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975875,8895975856,8895975855,8895975850,8895975854,8895975853,8895975852,8895975851,3968068669}'),
('SRID=4326;LINESTRING(30.4524419 59.6852441,30.452456 59.6851977,30.4524483 59.6851915,30.4523702 59.6851856,30.4523568 59.6851898,30.4523826 59.6852055,30.4524088 59.6852218,30.4524248 59.6852328,30.4524419 59.6852441)', 'way', 961717571, '{"landuse": "flowerbed"}', '{8895975865,8895975864,8895975863,8895975862,8895975859,8895975861,8895975860,8895975838,8895975865}'),
('SRID=4326;LINESTRING(30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946)', 'way', 961717572, '{"landuse": "flowerbed"}', '{8895975872,8895975871,8895975870,8895975869,8895975868,8895975867,8895975866,8895975872}'),
('SRID=4326;LINESTRING(30.4530263 59.6852336,30.4530032 59.685292,30.4529231 59.6852858,30.4527793 59.6852746,30.452638 59.6852636,30.4525513 59.6852568,30.4524466 59.6852487,30.4524641 59.6851898)', 'way', 961717573, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975857,8895975875,8895975843,8895975844,8895975848,8895975846,8895975874,8895975858}'),
('SRID=4326;LINESTRING(30.4529402 59.6852275,30.4529231 59.6852858,30.4529053 59.6853463,30.4528865 59.6854078)', 'way', 961717574, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975877,8895975843,8895975880,8895975878}'),
('SRID=4326;LINESTRING(30.4526559 59.6852052,30.452638 59.6852636,30.4526195 59.6853238,30.4526009 59.6853847,30.4527422 59.6853961,30.4528865 59.6854078)', 'way', 961717575, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975876,8895975848,8895975849,8895975879,8895975847,8895975878}'),
('SRID=4326;LINESTRING(30.4525684 59.6851982,30.4525513 59.6852568,30.4525338 59.685317,30.4526195 59.6853238,30.4527609 59.6853349,30.4529053 59.6853463)', 'way', 961717576, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975873,8895975846,8895975881,8895975849,8895975845,8895975880}'),
('SRID=4326;LINESTRING(30.4527487 59.6852082,30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082)', 'way', 961717577, '{"landuse": "flowerbed"}', '{8895975885,8895975884,8895975883,8895975882,8895975885}'),
('SRID=4326;LINESTRING(30.4532064 59.6852443,30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443)', 'way', 961717578, '{"landuse": "flowerbed"}', '{8895975889,8895975888,8895975887,8895975886,8895975889}'),
('SRID=4326;LINESTRING(30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696)', 'way', 961717579, '{"landuse": "flowerbed"}', '{8895975901,8895975902,8895975900,8895975903,8895975891,8895975890,8895975901}'),
('SRID=4326;LINESTRING(30.4530554 59.6852658,30.4530414 59.6852392,30.453028 59.6852429,30.4530143 59.6852802,30.4530288 59.6852733,30.453041 59.6852693,30.4530554 59.6852658)', 'way', 961717580, '{"landuse": "flowerbed"}', '{8895975898,8895975895,8895975896,8895975907,8895975897,8895975906,8895975898}'),
('SRID=4326;LINESTRING(30.4530632 59.6852641,30.4530782 59.6852621,30.4530921 59.6852616,30.4531031 59.6852618,30.4531172 59.6852446,30.4530501 59.6852392,30.4530632 59.6852641)', 'way', 961717581, '{"landuse": "flowerbed"}', '{8895975905,8895975899,8895975904,8895975892,8895975893,8895975894,8895975905}'),
('SRID=4326;LINESTRING(30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204)', 'way', 961717582, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053627,8914843793,8895996425,8914843794,1439053619}'),
('SRID=4326;LINESTRING(30.4525812 59.6854845,30.4526564 59.6854895)', 'way', 961717593, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{8895996555,1439053669}'),
('SRID=4326;LINESTRING(30.4527747 59.6854387,30.4528506 59.685445,30.4528681 59.6854402,30.4528755 59.6854172,30.4528654 59.6854091,30.4527852 59.6854026,30.4527687 59.6854078,30.4527618 59.6854305,30.4527747 59.6854387)', 'way', 961717594, '{"landuse": "flowerbed"}', '{8895996465,8895996464,8895996463,8895996462,8895996461,8895996460,8895996459,8895996458,8895996465}'),
('SRID=4326;LINESTRING(30.4525201 59.6853123,30.4525328 59.6853069,30.4525442 59.6852666,30.4525351 59.6852597,30.4524557 59.6852538,30.4524775 59.6852724,30.4524969 59.6852906,30.4525201 59.6853123)', 'way', 961717595, '{"landuse": "flowerbed"}', '{8895996470,8895996469,8895996468,8895996467,8895996466,8895996428,8895996429,8895996470}'),
('SRID=4326;LINESTRING(30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969,30.4523418 59.6851889)', 'way', 961717596, '{"landuse": "grass"}', '{8895996495,8895975839,8895996483,8895996484,8895996485,8895996486,8895996487,8895996488,8895996489,8895996490,8895996491,8895996492,8895996493,8895996494,8895996496,8895996473,8895996479,8895996480,8895996474,8895996509,8895996508,8895996507,8895996506,8895996505,8895996504,8895996503,8895996502,8895996501,8895996500,8895996499,8895996498,8895996497,8895996478,8895996495}'),
('SRID=4326;LINESTRING(30.4523081 59.6852118,30.4522803 59.6851945,30.4522795 59.6852157,30.4523143 59.6852356,30.4523427 59.6852536,30.4523628 59.6852673,30.4523827 59.6852816,30.4524087 59.6853027,30.4524225 59.6853163,30.4524411 59.6853354,30.452454 59.6853507,30.452466 59.6853657,30.4524751 59.6853808,30.4524839 59.6853973,30.4524918 59.6854125,30.4524982 59.6854272,30.452501 59.6854325,30.4525097 59.6854362,30.4525224 59.6854348,30.4525257 59.6854303,30.4525231 59.6854242,30.4525171 59.6854097,30.4525091 59.6853943,30.4525002 59.6853776,30.4524909 59.685362,30.4524785 59.6853465,30.4524653 59.6853309,30.4524465 59.6853116,30.4524322 59.6852976,30.4524056 59.685276,30.4523853 59.6852614,30.4523649 59.6852475,30.4523362 59.6852293,30.4523081 59.6852118)', 'way', 961717597, '{"landuse": "grass"}', '{8895996522,8895996477,8895996536,8895996524,8895996525,8895996526,8895996527,8895996528,8895996529,8895996530,8895996531,8895996532,8895996533,8895996534,8895996535,8895996537,8895996482,8895996476,8895996481,8895996523,8895996475,8895996521,8895996520,8895996519,8895996518,8895996517,8895996516,8895996515,8895996514,8895996513,8895996512,8895996511,8895996510,8895996522}'),
('SRID=4326;LINESTRING(30.4526076 59.685425,30.4526842 59.6854313,30.4527032 59.6854269,30.4527112 59.6854034,30.4527003 59.6853955,30.4526196 59.6853891,30.4526042 59.6853942,30.4525975 59.6854176,30.4526076 59.685425)', 'way', 961717598, '{"landuse": "flowerbed"}', '{8895996545,8895996544,8895996543,8895996542,8895996541,8895996540,8895996539,8895996538,8895996545}'),
('SRID=4326;LINESTRING(30.4528639 59.685494,30.4528702 59.6854731,30.4527911 59.6854671,30.4527849 59.685488,30.4528639 59.685494)', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996549,8895996548,8895996547,8895996546,8895996549}'),
('SRID=4326;LINESTRING(30.4526433 59.6854773,30.4526495 59.6854564,30.4525705 59.6854504,30.4525642 59.6854713,30.4526433 59.6854773)', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996553,8895996552,8895996551,8895996550,8895996553}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528709 59.6855164)', 'way', 961717601, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,8895996554}'),
('SRID=4326;LINESTRING(30.4529138 59.6853368,30.4529235 59.6853445,30.4529678 59.6853472,30.4529853 59.6853413,30.4529963 59.6853005,30.4529866 59.6852936,30.4529427 59.6852903,30.4529263 59.6852951,30.4529138 59.6853368)', 'way', 961717602, '{"landuse": "flowerbed"}', '{8895996564,8895996563,8895996562,8895996561,8895996560,8895996559,8895996558,8895996557,8895996564}'),
('SRID=4326;LINESTRING(30.452933 59.6852753,30.4529441 59.6852838,30.4529886 59.6852873,30.453002 59.6852821,30.4530171 59.6852433,30.4530088 59.6852371,30.4529582 59.685233,30.4529444 59.6852374,30.452933 59.6852753)', 'way', 961717603, '{"landuse": "flowerbed"}', '{8895996572,8895996571,8895996570,8895996569,8895996568,8895996567,8895996566,8895996565,8895996572}'),
('SRID=4326;LINESTRING(30.4525595 59.6852465,30.4525692 59.6852544,30.4526207 59.6852585,30.4526333 59.6852538,30.452645 59.6852146,30.4526353 59.6852076,30.4525847 59.6852036,30.4525709 59.685208,30.4525595 59.6852465)', 'way', 961717604, '{"landuse": "flowerbed"}', '{8895996580,8895996579,8895996578,8895996577,8895996576,8895996575,8895996574,8895996573,8895996580}'),
('SRID=4326;LINESTRING(30.452817 59.6852667,30.4528288 59.6852748,30.4529066 59.6852809,30.45292 59.6852751,30.4529319 59.6852358,30.4529216 59.6852291,30.452851 59.685224,30.4528493 59.6852281,30.452831 59.6852267,30.452817 59.6852667)', 'way', 961717605, '{"landuse": "flowerbed"}', '{8895996589,8895996588,8895996587,8895996586,8895996585,8895996584,8895996581,8895996583,8895996582,8895996589}'),
('SRID=4326;LINESTRING(30.4527946 59.6853272,30.4528053 59.6853349,30.4528878 59.6853416,30.4529031 59.6853359,30.4529154 59.6852941,30.4529042 59.6852874,30.4528247 59.6852816,30.4528087 59.6852864,30.4527946 59.6853272)', 'way', 961717606, '{"landuse": "flowerbed"}', '{8895996597,8895996596,8895996595,8895996594,8895996593,8895996592,8895996591,8895996590,8895996597}'),
('SRID=4326;LINESTRING(30.4527745 59.6853889,30.4527865 59.6853969,30.4528677 59.6854032,30.4528839 59.6853982,30.4528953 59.6853552,30.4528845 59.6853477,30.4528052 59.6853419,30.4527899 59.6853454,30.4527745 59.6853889)', 'way', 961717607, '{"landuse": "flowerbed"}', '{8895996605,8895996604,8895996603,8895996602,8895996601,8895996600,8895996599,8895996598,8895996605}'),
('SRID=4326;LINESTRING(30.452565 59.6854206,30.4525598 59.6854071,30.4525516 59.6853892,30.4525422 59.6853716,30.4525319 59.6853544,30.4525184 59.6853376,30.4525045 59.6853211,30.4524848 59.6853009,30.4524693 59.6852857,30.4524408 59.6852624,30.4524192 59.685247,30.4523979 59.6852324,30.4523685 59.6852137,30.4523402 59.6851962)', 'way', 961717608, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996623,8895996621,8895996620,8895996619,8895996618,8895996617,8895996616,8895996615,8895996614,8895996613,8895996612,8895996611,8895996610,8895996622}'),
('SRID=4326;LINESTRING(30.4525109 59.6854262,30.4525044 59.6854114,30.4524965 59.6853961,30.4524877 59.6853796,30.4524784 59.6853642,30.4524662 59.6853489,30.4524532 59.6853335,30.4524345 59.6853143,30.4524204 59.6853005,30.4523942 59.6852791,30.452374 59.6852647,30.4523538 59.6852509,30.4523252 59.6852327,30.4522972 59.6852153)', 'way', 961717609, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996637,8895996635,8895996634,8895996633,8895996632,8895996631,8895996630,8895996629,8895996628,8895996627,8895996626,8895996625,8895996624,8895996636}'),
('SRID=4326;LINESTRING(30.4523179 59.6852068,30.4522881 59.6851891,30.4522584 59.6851734,30.4522785 59.6851511,30.4525958 59.6847532,30.4529382 59.6847803,30.4535778 59.6848316)', 'way', 961717610, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975114,8895996608,3968068679,8114975109,8114975051,8114975050,8114975049}'),
('SRID=4326;LINESTRING(30.4527224 59.6854618,30.4527166 59.6854798)', 'way', 961717612, '{"highway": "steps", "incline": "up", "surface": "paving_stones"}', '{1664064412,8895996662}'),
('SRID=4326;LINESTRING(30.4534116 59.6851536,30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536)', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249763,8899249762,8899249761,8899249760,8899249759,8899249763}'),
('SRID=4326;LINESTRING(30.4535137 59.6851734,30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437)', 'way', 962062988, '{"source:taxon": "board"}', '{8899249777,8899249776,8899249775,8899249774}'),
('SRID=4326;LINESTRING(30.4534505 59.6851512,30.4535484 59.6848425)', 'way', 962062989, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.5", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8899249781,8899249780}'),
('SRID=4326;LINESTRING(30.4532761 59.6852013,30.4533137 59.6852128,30.453319 59.6851999,30.4533257 59.6851898,30.4533338 59.6851796,30.4533458 59.6851715,30.4533606 59.6851647,30.453378 59.6851586,30.4533941 59.6851559,30.4533211 59.6851024,30.4533083 59.6851038,30.4532761 59.6852013)', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249792,8899249791,8899249790,8899249789,8899249788,8899249787,8899249786,8899249785,8899249784,8899249783,8899249782,8899249792}'),
('SRID=4326;LINESTRING(30.4534315 59.6851615,30.4534654 59.685163)', 'way', 962062991, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975036,3968068687}'),
('SRID=4326;LINESTRING(30.45277 59.6851675,30.4528221 59.6849965,30.4528061 59.6849952,30.4528148 59.6849678,30.4528309 59.6849691,30.4528877 59.684789)', 'way', 962062992, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8899249807,8899249801,8899249800,8899249799,8899249798,8899249806}'),
('SRID=4326;LINESTRING(30.4530825 59.6850727,30.4530768 59.6850789,30.4531357 59.6851196,30.4531475 59.6851179,30.4531599 59.6851179,30.4531731 59.6851201,30.4531813 59.685123,30.4532721 59.6850914,30.45327 59.6850856,30.4530825 59.6850727)', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249816,8899249815,8899249814,8899249813,8899249812,8899249811,8899249810,8899249809,8899249808,8899249816}'),
('SRID=4326;LINESTRING(30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148)', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299126,8899299125,8899299124,8899299123,8899299122,8899299121,8899299120,8899299119,8899299118,8899299117,8899299126}'),
('SRID=4326;LINESTRING(30.4531566 59.6851458,30.4531627 59.6851441,30.4531665 59.6851411,30.4531672 59.6851376,30.4531645 59.6851343,30.4531591 59.685132,30.4531523 59.6851313,30.4531455 59.6851322,30.4531404 59.6851346,30.4531381 59.685138,30.4531391 59.6851415,30.4531433 59.6851444,30.4531496 59.6851459,30.4531566 59.6851458)', 'way', 962062995, '{"landuse": "grass"}', '{8899299139,8899299138,8899299137,8899299136,8899299135,8899299134,8899299133,8899299132,8899299131,8899299130,8899299129,8899299128,8899299140,8899299139}'),
('SRID=4326;LINESTRING(30.4531836 59.6851532,30.45325 59.6851972,30.4532587 59.6851977,30.4532923 59.6851023,30.4532804 59.6850981,30.4531914 59.68513,30.4531946 59.6851353,30.453195 59.6851401,30.4531936 59.6851444,30.45319 59.6851488,30.4531836 59.6851532)', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299150,8899299149,8899299141,8899299148,8899299142,8899299147,8899299146,8899299145,8899299144,8899299143,8899299150}'),
('SRID=4326;LINESTRING(30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299158,8899299157,8899299156,8899299155,8899299154,8899299153,8899299152,8899299151,8899249778,8899299158}'),
('SRID=4326;LINESTRING(30.4532162 59.6852145,30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145)', 'way', 962062998, '{"landuse": "grass"}', '{8899299165,8899299164,8899299163,8899299161,8899299160,8899299162,8899299165}'),
('SRID=4326;LINESTRING(30.4532627 59.6852077,30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077)', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', '{8902082028,8902082027,8902082026,8902082025,8902082024,8902082023,8902082022,8902082021,8902082020,8902027911,8902082019,8902082018,8902082017,8902027912,8902027916,8902027913,8902027915,8902027914,8902082028}'),
('SRID=4326;LINESTRING(30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082032,8902082031,8902082030,8902082029,8902082032}'),
('SRID=4326;LINESTRING(30.4529465 59.6849826,30.4530583 59.6849454,30.4530566 59.6849397,30.4529452 59.6849315,30.4529338 59.6849691,30.4529492 59.6849698,30.4529465 59.6849826)', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082038,8902082037,8902082036,8902082035,8902082034,8902082033,8902082038}'),
('SRID=4326;LINESTRING(30.4530344 59.685052,30.4530456 59.6850508,30.4530757 59.684955,30.4530662 59.6849507,30.4529465 59.6849918,30.4530344 59.685052)', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082047,8902082046,8902082045,8902082044,8902082043,8902082047}'),
('SRID=4326;LINESTRING(30.4529083 59.6850544,30.4530153 59.6850613,30.4530221 59.685056,30.4529398 59.6850009,30.4529378 59.6850121,30.4529184 59.6850114,30.4529083 59.6850544)', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082054,8902082053,8902082052,8902082051,8902082050,8902082049,8902082054}'),
('SRID=4326;LINESTRING(30.4528875 59.6851184,30.4530138 59.6850731,30.4530125 59.6850679,30.4529043 59.6850625,30.4528875 59.6851184)', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082059,8902082058,8902082057,8902082056,8902082059}'),
('SRID=4326;LINESTRING(30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789)', 'way', 962382766, '{"landuse": "grass"}', '{8902082065,8902082064,8902082063,8902082062,8902082065}'),
('SRID=4326;LINESTRING(30.4529896 59.6851748,30.4530072 59.6851719,30.4530311 59.6850841,30.4530206 59.6850798,30.4528885 59.6851275,30.4529896 59.6851748)', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082070,8902082069,8902082068,8902082067,8902082066,8902082070}'),
('SRID=4326;LINESTRING(30.4533332 59.6850719,30.4534612 59.68503,30.4533655 59.6849715,30.4533546 59.6849733,30.4533227 59.6850682,30.4533332 59.6850719)', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082080,8902082079,8902082078,8902082077,8902082076,8902082080}'),
('SRID=4326;LINESTRING(30.4533437 59.685083,30.4534444 59.6850899,30.4534619 59.6850382,30.4533411 59.685078,30.4533437 59.685083)', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082084,8902082083,8902082082,8902082081,8902082084}'),
('SRID=4326;LINESTRING(30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173)', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082090,8902082089,8902082088,8902082087,8902082086,8902082085,8902082090}'),
('SRID=4326;LINESTRING(30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113)', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082096,8902082095,8902082094,8902082093,8902082092,8902082091,8902082096}'),
('SRID=4326;LINESTRING(30.4532258 59.6849527,30.4532116 59.6849902,30.4532207 59.684992,30.4532298 59.6849953,30.4533219 59.6849634,30.4533191 59.6849588,30.4532258 59.6849527)', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082102,8902082101,8902082100,8902082099,8902082098,8902082097,8902082102}'),
('SRID=4326;LINESTRING(30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082108,8902082107,8902082106,8902082105,8902082104,8902082103,8902082108}'),
('SRID=4326;LINESTRING(30.4530763 59.6850024,30.4531619 59.6850065,30.4531647 59.6850018,30.4531695 59.6849976,30.4531032 59.6849548,30.453091 59.6849565,30.4530763 59.6850024)', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082109,8902082114,8902082113,8902082112,8902082111,8902082110,8902082109}'),
('SRID=4326;LINESTRING(30.4530716 59.6850547,30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547)', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082120,8902082119,8902082118,8902082117,8902082116,8902082115,8902082120}'),
('SRID=4326;LINESTRING(30.4531735 59.6850722,30.4531863 59.6850287,30.4531799 59.6850271,30.4531749 59.6850252,30.4530791 59.6850599,30.453083 59.685065,30.4531735 59.6850722)', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082126,8902082125,8902082124,8902082123,8902082122,8902082121,8902082126}'),
('SRID=4326;LINESTRING(30.4531903 59.6850727,30.4532727 59.6850781,30.4532816 59.6850715,30.4532223 59.6850274,30.453211 59.6850297,30.453201 59.6850303,30.4531903 59.6850727)', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082132,8902082131,8902082130,8902082129,8902082128,8902082127,8902082132}'),
('SRID=4326;LINESTRING(30.453206 59.6849937,30.4532201 59.6849487)', 'way', 962382778, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975081,8902082149}'),
('SRID=4326;LINESTRING(30.4532335 59.6850137,30.4533306 59.6850189)', 'way', 962382779, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975086,8902082150}'),
('SRID=4326;LINESTRING(30.4531682 59.6850102,30.4530675 59.6850048)', 'way', 962382780, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975094,8902082151}'),
('SRID=4326;LINESTRING(30.4531253 59.6850083,30.4531256 59.6850158,30.4531288 59.6850232,30.4531349 59.6850302,30.4531434 59.6850364,30.4531543 59.6850416,30.4531669 59.6850457,30.4531809 59.6850485,30.4531957 59.6850498,30.4532107 59.6850496,30.4532253 59.685048,30.4532391 59.685045,30.4532514 59.6850406,30.4532618 59.6850352,30.4532699 59.6850288,30.4532753 59.6850217,30.4532779 59.6850143,30.4532776 59.6850067,30.4532744 59.6849993,30.4532684 59.6849924,30.4532598 59.6849862,30.453249 59.6849809,30.4532363 59.6849768,30.4532224 59.6849741,30.4532076 59.6849728,30.4531926 59.6849729,30.4531779 59.6849745,30.4531642 59.6849776,30.4531519 59.6849819,30.4531415 59.6849874,30.4531334 59.6849938,30.4531279 59.6850008,30.4531253 59.6850083)', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082167,8902082134,8902082166,8902082133,8902082165,8902082148,8902082164,8902082147,8902082163,8902082146,8902082162,8902082145,8902082161,8902082144,8902082160,8902082143,8902082159,8902082142,8902082158,8902082141,8902082157,8902082140,8902082156,8902082139,8902082155,8902082138,8902082154,8902082137,8902082153,8902082136,8902082152,8902082135,8902082167}'),
('SRID=4326;LINESTRING(30.4531956 59.6850267,30.4531801 59.6850762)', 'way', 962382782, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975091,8902082168}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4529124 59.6850066,30.4529307 59.6850078,30.4529356 59.6849912,30.4529412 59.6849735,30.4529245 59.6849722,30.4529389 59.6849276)', 'way', 962382783, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381535,8902082040,8902082170,8902082039,8902082169,1665582237}'),
('SRID=4326;LINESTRING(30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877)', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992660,8904992659,8904992658,8904992657,8904992656,8904992655,8904992654,8904992653,8904992652,8904992651,8904992650,8904992649,8904992648,8904992647,8904992646,8904992645,8904992644,8904992643,8904992642,8904992641,8904992640,8904992639,8904992660}'),
('SRID=4326;LINESTRING(30.4532432 59.6848971,30.4532493 59.6848954,30.4532531 59.6848924,30.4532538 59.6848889,30.4532511 59.6848856,30.4532457 59.6848833,30.4532389 59.6848826,30.4532321 59.6848835,30.453227 59.684886,30.4532247 59.6848893,30.4532257 59.6848928,30.4532299 59.6848957,30.4532362 59.6848972,30.4532432 59.6848971)', 'way', 962678726, '{"landuse": "grass"}', '{8904992673,8904992672,8904992671,8904992670,8904992669,8904992668,8904992667,8904992666,8904992665,8904992664,8904992663,8904992662,8904992661,8904992673}'),
('SRID=4326;LINESTRING(30.4530998 59.6849248,30.4531105 59.684928,30.4532056 59.6848974,30.4532029 59.6848932,30.4532023 59.6848877,30.4532043 59.6848829,30.4532098 59.6848776,30.4531384 59.6848341,30.4531253 59.6848349,30.4530998 59.6849248)', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992682,8904992681,8904992680,8904992679,8904992637,8904992678,8904992677,8904992676,8904992675,8904992682}'),
('SRID=4326;LINESTRING(30.4530724 59.6849262,30.4530868 59.6849239,30.4531127 59.6848333,30.4531034 59.6848301,30.4529683 59.6848711,30.4530724 59.6849262)', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992687,8904992686,8904992685,8904992684,8904992683,8904992687}'),
('SRID=4326;LINESTRING(30.4530589 59.6849341,30.4530633 59.6849302,30.452961 59.6848772,30.4529482 59.6849246,30.4530589 59.6849341)', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992691,8904992690,8904992689,8904992688,8904992691}'),
('SRID=4326;LINESTRING(30.4531212 59.684939,30.4533222 59.6849516,30.4533269 59.6849477,30.4532581 59.6849071,30.4532455 59.6849087,30.4532339 59.6849085,30.4532243 59.684907,30.4532133 59.6849034,30.4531185 59.6849335,30.4531212 59.684939)', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992699,8904992698,8904992697,8904992696,8904992692,8904992638,8904992695,8904992694,8904992693,8904992699}'),
('SRID=4326;LINESTRING(30.453536 59.6848401,30.4529797 59.6847958,30.452977 59.6848046,30.4535329 59.6848493,30.453536 59.6848401)', 'way', 962714214, '{"landuse": "flowerbed"}', '{8905335420,8905335419,8905335418,8905335417,8905335420}'),
('SRID=4326;LINESTRING(30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335435,8905335434,8905335433,8905335432,8905335435}'),
('SRID=4326;LINESTRING(30.4533819 59.6849565,30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565)', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335439,8905335438,8905335437,8905335436,8905335439}'),
('SRID=4326;LINESTRING(30.4533623 59.6849431,30.4533739 59.6849464,30.4534994 59.6849065,30.4534038 59.6848537,30.4533921 59.6848545,30.4533623 59.6849431)', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335444,8905335443,8905335442,8905335441,8905335440,8905335444}'),
('SRID=4326;LINESTRING(30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335454,8905335453,8905335452,8905335451,8905335450,8905335449,8905335448,8905335447,8905335446,8905335454}'),
('SRID=4326;LINESTRING(30.4529663 59.6848632,30.4530962 59.6848253,30.4530928 59.6848201,30.4529831 59.6848107,30.4529663 59.6848632)', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335458,8905335457,8905335456,8905335455,8905335458}'),
('SRID=4326;LINESTRING(30.4532195 59.6848732,30.4532263 59.6848712,30.4532379 59.6848698,30.4532504 59.6848704,30.4532619 59.6848729,30.4532706 59.684876,30.4533642 59.6848467,30.4533614 59.6848416,30.453158 59.6848262,30.4531503 59.6848308,30.4532195 59.6848732)', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335467,8905335466,8905335465,8905335464,8905335463,8905335462,8905335461,8905335445,8905335460,8905335459,8905335467}'),
('SRID=4326;LINESTRING(30.4532684 59.6848807,30.4533888 59.6848413)', 'way', 962714221, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992654,1665582235}'),
('SRID=4326;LINESTRING(30.4531238 59.6848204,30.4532177 59.684877)', 'way', 962714222, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582234,8904992660}'),
('SRID=4326;LINESTRING(30.4527677 59.6846399,30.4528579 59.6846477)', 'way', 962735606, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8905543613,1198356896}'),
('SRID=4326;LINESTRING(30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399)', 'way', 962735608, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824026,1198356935,8566824027,8905543613}'),
('SRID=4326;LINESTRING(30.4534851 59.684767,30.4534913 59.6847521,30.4534976 59.6847368)', 'way', 962735609, '{"highway": "steps"}', '{8905543614,12023732271,7927774425}'),
('SRID=4326;LINESTRING(30.4529562 59.6847243,30.4529615 59.6847082,30.4529628 59.6847041)', 'way', 962735610, '{"highway": "steps"}', '{8905543615,12023732270,3968068678}'),
('SRID=4326;LINESTRING(30.4526304 59.6847065,30.4525958 59.6847532)', 'way', 962735611, '{"highway": "footway", "surface": "fine_gravel"}', '{8905543616,8114975051}'),
('SRID=4326;LINESTRING(30.4528676 59.6847547,30.4526341 59.6847357,30.452631 59.6847454,30.4528645 59.6847644,30.4528676 59.6847547)', 'way', 962735612, '{"landuse": "grass"}', '{8905558220,8905558219,8905558218,8905558217,8905558220}'),
('SRID=4326;LINESTRING(30.4535589 59.6848104,30.4530176 59.6847681,30.4530149 59.6847769,30.4535559 59.6848195,30.4535589 59.6848104)', 'way', 962735613, '{"landuse": "grass"}', '{8905558224,8905558223,8905558222,8905558221,8905558224}'),
('SRID=4326;LINESTRING(30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573,30.4530182 59.6847465)', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8905558227,8905558226,8906857476,8906857475,8905558227}'),
('SRID=4326;LINESTRING(30.4523152 59.6851448,30.4526116 59.6847664)', 'way', 962869359, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.7", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857452,8906857451}'),
('SRID=4326;LINESTRING(30.4526277 59.6846803,30.4526365 59.6846782,30.4526406 59.6846738,30.4526381 59.684669,30.4526302 59.6846662,30.4526205 59.6846666,30.4526137 59.6846701,30.4526128 59.684675,30.4526184 59.684679,30.4526277 59.6846803)', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857461,8906857453,8906857460,8906857459,8906857458,8906857457,8906857456,8906857455,8906857454,8906857461}'),
('SRID=4326;LINESTRING(30.4535863 59.6847456,30.4535811 59.6847595)', 'way', 962869365, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8906857470,8289295976}'),
('SRID=4326;MULTIPOLYGON(((30.4513 59.6845239,30.4513105 59.6845148,30.4513253 59.6844972,30.4513336 59.6844848,30.4513473 59.6844699,30.4513568 59.6844555,30.4513653 59.6844381,30.4513738 59.6844262,30.4513936 59.6844093,30.4514013 59.6843976,30.4514225 59.6843888,30.4514444 59.6843812,30.4514614 59.6843629,30.4514704 59.6843445,30.4514736 59.6843262,30.4514828 59.6842988,30.4514912 59.6842865,30.4514975 59.6842799,30.4515117 59.6842705,30.4515428 59.6842625,30.4516031 59.6842549,30.4518408 59.6843394,30.4519523 59.6843794,30.4520216 59.6844035,30.4520874 59.6844268,30.4521402 59.684444,30.4521943 59.6844606,30.452244 59.6844736,30.4522939 59.6844865,30.4523452 59.6844991,30.4524113 59.6845149,30.4524654 59.6845284,30.4525244 59.6845406,30.4525539 59.6845467,30.452566 59.6845558,30.452571 59.6845656,30.4525675 59.6845745,30.4525615 59.68459,30.4525618 59.6845988,30.4525613 59.6846073,30.4525568 59.6846156,30.4525466 59.6846232,30.4525331 59.6846279,30.4525251 59.684634,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4521768 59.6852884,30.4521573 59.685297,30.4521207 59.6853099,30.4520859 59.6853167,30.4520483 59.6853214,30.4520121 59.6853235,30.4519679 59.6853228,30.4519209 59.685316,30.4518731 59.6853033,30.4518364 59.6852869,30.4518016 59.6852646,30.4517747 59.6852436,30.4517546 59.685224,30.4517399 59.685205,30.4517278 59.6851773,30.4517104 59.6851603,30.4516916 59.6851468,30.4516857 59.6851285,30.4516903 59.6851123,30.4517117 59.6851023,30.4517426 59.685094,30.4517784 59.6850892,30.4518103 59.6850908,30.4518403 59.6851005,30.4518731 59.6850949,30.4518771 59.6850809,30.4518692 59.685051,30.4518777 59.6850294,30.4519043 59.6850131,30.4519376 59.6850028,30.4519737 59.684999,30.4520079 59.6849997,30.4520477 59.685012,30.4520887 59.6850223,30.4521435 59.6850216,30.4521948 59.6850093,30.4522112 59.6849969,30.4522301 59.6849727,30.45222 59.6849586,30.4521979 59.6849496,30.4521524 59.6849328,30.452119 59.6849135,30.452105 59.6848849,30.4521099 59.684868,30.4520932 59.684849,30.4520658 59.6848372,30.4520255 59.6848223,30.4520099 59.6848104,30.4519866 59.6847939,30.4519651 59.6847718,30.4519517 59.6847501,30.4519518 59.6847258,30.4519545 59.6847041,30.4519786 59.6846635,30.4520121 59.6846479,30.452051 59.6846256,30.4520604 59.6846161,30.4520537 59.6846046,30.4520175 59.6845829,30.4519692 59.6845613,30.451933 59.684566,30.4519102 59.6845748,30.4518928 59.6845917,30.4518772 59.6846127,30.4518697 59.684638,30.4518561 59.6846587,30.4518347 59.6846794,30.4518136 59.6846859,30.451785 59.6846963,30.4517612 59.6847117,30.4517363 59.6847257,30.4517004 59.6847328,30.4516678 59.6847376,30.4516243 59.6847395,30.4515783 59.6847426,30.4515624 59.6847383,30.451536 59.6847319,30.4515265 59.6847207,30.4515128 59.6847092,30.4515012 59.6846991,30.4514963 59.6846932,30.4515039 59.6846846,30.4515091 59.6846707,30.4515006 59.6846638,30.4514837 59.6846584,30.4514488 59.6846536,30.4514298 59.6846424,30.4514235 59.6846339,30.451434 59.6846216,30.451452 59.6846104,30.4514721 59.684604,30.4514816 59.6845934,30.4514827 59.6845827,30.4514763 59.6845715,30.4514427 59.6845604,30.4514004 59.6845719,30.4513792 59.6845708,30.451356 59.684566,30.4513317 59.6845601,30.4513137 59.6845489,30.4513042 59.6845393,30.4513 59.6845239)))', 'relation', 12444790, '{"natural": "wood", "leaf_type": "mixed", "leaf_cycle": "mixed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523568 59.6851898,30.4523702 59.6851856,30.4524483 59.6851915,30.452456 59.6851977,30.4524419 59.6852441,30.4524248 59.6852328,30.4524088 59.6852218,30.4523826 59.6852055,30.4523568 59.6851898)))', 'way', 961717571, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459)))', 'way', 961717572, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082,30.4523303 59.6851757)))', 'way', 961717577, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443,30.4528543 59.6852169)))', 'way', 961717578, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622)))', 'way', 961717579, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6852802,30.453028 59.6852429,30.4530414 59.6852392,30.4530554 59.6852658,30.453041 59.6852693,30.4530288 59.6852733,30.4530143 59.6852802)))', 'way', 961717580, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530501 59.6852392,30.4531172 59.6852446,30.4531031 59.6852618,30.4530921 59.6852616,30.4530782 59.6852621,30.4530632 59.6852641,30.4530501 59.6852392)))', 'way', 961717581, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.4531138 59.6852988,30.4530897 59.6853096,30.4530682 59.6853211,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168)))', 'relation', 12935642, '{"height": "6", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530106 59.6853114,30.4530161 59.6853019,30.4530244 59.6852922,30.4530375 59.685285,30.4530534 59.685278,30.4530732 59.685274,30.4530931 59.6852723,30.4531124 59.685272,30.4531329 59.6852751,30.4531443 59.685278,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530111 59.6853217,30.4530106 59.6853114)))', 'relation', 12922491, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530012 59.685359,30.4529724 59.685378,30.4529542 59.6853912,30.4529312 59.685409,30.4529136 59.685403)))', 'relation', 12935641, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527618 59.6854305,30.4527687 59.6854078,30.4527852 59.6854026,30.4528654 59.6854091,30.4528755 59.6854172,30.4528681 59.6854402,30.4528506 59.685445,30.4527747 59.6854387,30.4527618 59.6854305)))', 'way', 961717594, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524557 59.6852538,30.4525351 59.6852597,30.4525442 59.6852666,30.4525328 59.6853069,30.4525201 59.6853123,30.4524969 59.6852906,30.4524775 59.6852724,30.4524557 59.6852538)))', 'way', 961717595, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523226 59.6851969,30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969)))', 'way', 961717596, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522795 59.6852157,30.4522803 59.6851945,30.4523081 59.6852118,30.4523362 59.6852293,30.4523649 59.6852475,30.4523853 59.6852614,30.4524056 59.685276,30.4524322 59.6852976,30.4524465 59.6853116,30.4524653 59.6853309,30.4524785 59.6853465,30.4524909 59.685362,30.4525002 59.6853776,30.4525091 59.6853943,30.4525171 59.6854097,30.4525231 59.6854242,30.4525257 59.6854303,30.4525224 59.6854348,30.4525097 59.6854362,30.452501 59.6854325,30.4524982 59.6854272,30.4524918 59.6854125,30.4524839 59.6853973,30.4524751 59.6853808,30.452466 59.6853657,30.452454 59.6853507,30.4524411 59.6853354,30.4524225 59.6853163,30.4524087 59.6853027,30.4523827 59.6852816,30.4523628 59.6852673,30.4523427 59.6852536,30.4523143 59.6852356,30.4522795 59.6852157)))', 'way', 961717597, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525975 59.6854176,30.4526042 59.6853942,30.4526196 59.6853891,30.4527003 59.6853955,30.4527112 59.6854034,30.4527032 59.6854269,30.4526842 59.6854313,30.4526076 59.685425,30.4525975 59.6854176)))', 'way', 961717598, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527849 59.685488,30.4527911 59.6854671,30.4528702 59.6854731,30.4528639 59.685494,30.4527849 59.685488)))', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525642 59.6854713,30.4525705 59.6854504,30.4526495 59.6854564,30.4526433 59.6854773,30.4525642 59.6854713)))', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529138 59.6853368,30.4529263 59.6852951,30.4529427 59.6852903,30.4529866 59.6852936,30.4529963 59.6853005,30.4529853 59.6853413,30.4529678 59.6853472,30.4529235 59.6853445,30.4529138 59.6853368)))', 'way', 961717602, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452933 59.6852753,30.4529444 59.6852374,30.4529582 59.685233,30.4530088 59.6852371,30.4530171 59.6852433,30.453002 59.6852821,30.4529886 59.6852873,30.4529441 59.6852838,30.452933 59.6852753)))', 'way', 961717603, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525595 59.6852465,30.4525709 59.685208,30.4525847 59.6852036,30.4526353 59.6852076,30.452645 59.6852146,30.4526333 59.6852538,30.4526207 59.6852585,30.4525692 59.6852544,30.4525595 59.6852465)))', 'way', 961717604, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452817 59.6852667,30.452831 59.6852267,30.4528493 59.6852281,30.452851 59.685224,30.4529216 59.6852291,30.4529319 59.6852358,30.45292 59.6852751,30.4529066 59.6852809,30.4528288 59.6852748,30.452817 59.6852667)))', 'way', 961717605, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527946 59.6853272,30.4528087 59.6852864,30.4528247 59.6852816,30.4529042 59.6852874,30.4529154 59.6852941,30.4529031 59.6853359,30.4528878 59.6853416,30.4528053 59.6853349,30.4527946 59.6853272)))', 'way', 961717606, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527745 59.6853889,30.4527899 59.6853454,30.4528052 59.6853419,30.4528845 59.6853477,30.4528953 59.6853552,30.4528839 59.6853982,30.4528677 59.6854032,30.4527865 59.6853969,30.4527745 59.6853889)))', 'way', 961717607, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536,30.4533349 59.6850974)))', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437,30.4535137 59.6851734,30.4534909 59.6851715)))', 'relation', 12925809, '{"crop": "grape", "genus": "Vitis", "taxon": "Vitis amurensis", "landuse": "vineyard", "genus:ru": "Виноград", "taxon:ru": "Виноград амурский"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532761 59.6852013,30.4533083 59.6851038,30.4533211 59.6851024,30.4533941 59.6851559,30.453378 59.6851586,30.4533606 59.6851647,30.4533458 59.6851715,30.4533338 59.6851796,30.4533257 59.6851898,30.453319 59.6851999,30.4533137 59.6852128,30.4532761 59.6852013)))', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530768 59.6850789,30.4530825 59.6850727,30.45327 59.6850856,30.4532721 59.6850914,30.4531813 59.685123,30.4531731 59.6851201,30.4531599 59.6851179,30.4531475 59.6851179,30.4531357 59.6851196,30.4530768 59.6850789)))', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728)))', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531381 59.685138,30.4531404 59.6851346,30.4531455 59.6851322,30.4531523 59.6851313,30.4531591 59.685132,30.4531645 59.6851343,30.4531672 59.6851376,30.4531665 59.6851411,30.4531627 59.6851441,30.4531566 59.6851458,30.4531496 59.6851459,30.4531433 59.6851444,30.4531391 59.6851415,30.4531381 59.685138)))', 'way', 962062995, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531836 59.6851532,30.45319 59.6851488,30.4531936 59.6851444,30.453195 59.6851401,30.4531946 59.6851353,30.4531914 59.68513,30.4532804 59.6850981,30.4532923 59.6851023,30.4532587 59.6851977,30.45325 59.6851972,30.4531836 59.6851532)))', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)))', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145,30.4528382 59.6851861)))', 'way', 962062998, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077,30.4528577 59.6851769)))', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)))', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529338 59.6849691,30.4529452 59.6849315,30.4530566 59.6849397,30.4530583 59.6849454,30.4529465 59.6849826,30.4529492 59.6849698,30.4529338 59.6849691)))', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529465 59.6849918,30.4530662 59.6849507,30.4530757 59.684955,30.4530456 59.6850508,30.4530344 59.685052,30.4529465 59.6849918)))', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529083 59.6850544,30.4529184 59.6850114,30.4529378 59.6850121,30.4529398 59.6850009,30.4530221 59.685056,30.4530153 59.6850613,30.4529083 59.6850544)))', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528875 59.6851184,30.4529043 59.6850625,30.4530125 59.6850679,30.4530138 59.6850731,30.4528875 59.6851184)))', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739)))', 'way', 962382766, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528885 59.6851275,30.4530206 59.6850798,30.4530311 59.6850841,30.4530072 59.6851719,30.4529896 59.6851748,30.4528885 59.6851275)))', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533227 59.6850682,30.4533546 59.6849733,30.4533655 59.6849715,30.4534612 59.68503,30.4533332 59.6850719,30.4533227 59.6850682)))', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533411 59.685078,30.4534619 59.6850382,30.4534444 59.6850899,30.4533437 59.685083,30.4533411 59.685078)))', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233)))', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005)))', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532116 59.6849902,30.4532258 59.6849527,30.4533191 59.6849588,30.4533219 59.6849634,30.4532298 59.6849953,30.4532207 59.684992,30.4532116 59.6849902)))', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)))', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530763 59.6850024,30.453091 59.6849565,30.4531032 59.6849548,30.4531695 59.6849976,30.4531647 59.6850018,30.4531619 59.6850065,30.4530763 59.6850024)))', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547,30.4530603 59.6850515)))', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530791 59.6850599,30.4531749 59.6850252,30.4531799 59.6850271,30.4531863 59.6850287,30.4531735 59.6850722,30.453083 59.685065,30.4530791 59.6850599)))', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531903 59.6850727,30.453201 59.6850303,30.453211 59.6850297,30.4532223 59.6850274,30.4532816 59.6850715,30.4532727 59.6850781,30.4531903 59.6850727)))', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531253 59.6850083,30.4531279 59.6850008,30.4531334 59.6849938,30.4531415 59.6849874,30.4531519 59.6849819,30.4531642 59.6849776,30.4531779 59.6849745,30.4531926 59.6849729,30.4532076 59.6849728,30.4532224 59.6849741,30.4532363 59.6849768,30.453249 59.6849809,30.4532598 59.6849862,30.4532684 59.6849924,30.4532744 59.6849993,30.4532776 59.6850067,30.4532779 59.6850143,30.4532753 59.6850217,30.4532699 59.6850288,30.4532618 59.6850352,30.4532514 59.6850406,30.4532391 59.685045,30.4532253 59.685048,30.4532107 59.6850496,30.4531957 59.6850498,30.4531809 59.6850485,30.4531669 59.6850457,30.4531543 59.6850416,30.4531434 59.6850364,30.4531349 59.6850302,30.4531288 59.6850232,30.4531256 59.6850158,30.4531253 59.6850083)))', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903)))', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532247 59.6848893,30.453227 59.684886,30.4532321 59.6848835,30.4532389 59.6848826,30.4532457 59.6848833,30.4532511 59.6848856,30.4532538 59.6848889,30.4532531 59.6848924,30.4532493 59.6848954,30.4532432 59.6848971,30.4532362 59.6848972,30.4532299 59.6848957,30.4532257 59.6848928,30.4532247 59.6848893)))', 'way', 962678726, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530998 59.6849248,30.4531253 59.6848349,30.4531384 59.6848341,30.4532098 59.6848776,30.4532043 59.6848829,30.4532023 59.6848877,30.4532029 59.6848932,30.4532056 59.6848974,30.4531105 59.684928,30.4530998 59.6849248)))', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529683 59.6848711,30.4531034 59.6848301,30.4531127 59.6848333,30.4530868 59.6849239,30.4530724 59.6849262,30.4529683 59.6848711)))', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529482 59.6849246,30.452961 59.6848772,30.4530633 59.6849302,30.4530589 59.6849341,30.4529482 59.6849246)))', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531185 59.6849335,30.4532133 59.6849034,30.4532243 59.684907,30.4532339 59.6849085,30.4532455 59.6849087,30.4532581 59.6849071,30.4533269 59.6849477,30.4533222 59.6849516,30.4531212 59.684939,30.4531185 59.6849335)))', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452977 59.6848046,30.4529797 59.6847958,30.453536 59.6848401,30.4535329 59.6848493,30.452977 59.6848046)))', 'way', 962714214, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)))', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565,30.4533809 59.6849511)))', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533623 59.6849431,30.4533921 59.6848545,30.4534038 59.6848537,30.4534994 59.6849065,30.4533739 59.6849464,30.4533623 59.6849431)))', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)))', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529663 59.6848632,30.4529831 59.6848107,30.4530928 59.6848201,30.4530962 59.6848253,30.4529663 59.6848632)))', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531503 59.6848308,30.453158 59.6848262,30.4533614 59.6848416,30.4533642 59.6848467,30.4532706 59.684876,30.4532619 59.6848729,30.4532504 59.6848704,30.4532379 59.6848698,30.4532263 59.6848712,30.4532195 59.6848732,30.4531503 59.6848308)))', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452631 59.6847454,30.4526341 59.6847357,30.4528676 59.6847547,30.4528645 59.6847644,30.452631 59.6847454)))', 'way', 962735612, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530149 59.6847769,30.4530176 59.6847681,30.4535589 59.6848104,30.4535559 59.6848195,30.4530149 59.6847769)))', 'way', 962735613, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6847573,30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573)))', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523152 59.6851448,30.4526116 59.6847664,30.4528877 59.684789,30.4528309 59.6849691,30.4528148 59.6849678,30.4528061 59.6849952,30.4528221 59.6849965,30.45277 59.6851675,30.4527658 59.68518,30.4523152 59.6851448)))', 'relation', 12933782, '{"ref": "5", "name": "Кенконс", "genus": "Tilia", "name:en": "The Quincunx", "natural": "wood", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526128 59.684675,30.4526137 59.6846701,30.4526205 59.6846666,30.4526302 59.6846662,30.4526381 59.684669,30.4526406 59.6846738,30.4526365 59.6846782,30.4526277 59.6846803,30.4526184 59.684679,30.4526128 59.684675)))', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526042 59.6846709,30.4526082 59.6846655,30.452617 59.6846635,30.4528469 59.6846817,30.452843 59.684694,30.4528376 59.6847122,30.4526498 59.6846973,30.4526123 59.6846817,30.4526042 59.6846709)))', 'relation', 12933783, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530629 59.6847308,30.4530706 59.6847131,30.4530752 59.684699,30.4535863 59.6847456,30.4535811 59.6847595,30.4535752 59.6847748,30.4530629 59.6847308)))', 'relation', 12933784, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4534977 59.6852035,30.4534967 59.6852111,30.453492 59.6852191,30.4534813 59.6852261,30.4534692 59.6852309,30.4534524 59.6852342,30.453435 59.6852355,30.4534193 59.6852337,30.4534045 59.6852307,30.4533914 59.6852248,30.4533831 59.6852182,30.4533763 59.68521,30.4533752 59.6852006)))', 'relation', 12935640, '{"height": "5.5", "roof:shape": "pyramidal", "roof:colour": "#DADDE2", "roof:height": "0.5", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526773 59.6854805,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.4527511 59.6854859,30.4526773 59.6854805)))', 'relation', 12987950, '{"height": "1", "roof:shape": "skillion", "roof:colour": "grey", "roof:height": "1", "building:part": "yes", "roof:direction": "170", "building:colour": "#E4C78F", "roof:orientation": "along"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4526773 59.6854805,30.4527511 59.6854859,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528709 59.6855164,30.4527091 59.6855042,30.4525787 59.6854944)))', 'relation', 12935639, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4522474 59.6851858,30.4522167 59.6853009,30.4522119 59.6853269,30.4521905 59.6853763,30.4521596 59.6854203,30.4521293 59.6854701,30.4520946 59.6855262,30.4520624 59.6855804,30.4520524 59.6856064,30.452047 59.6856386,30.452047 59.6856666,30.4520551 59.685713,30.4520778 59.685798,30.4520997 59.6858613,30.4521127 59.6859046,30.4521047 59.6859432,30.4520825 59.6859825,30.4520478 59.686026,30.4520492 59.6860479,30.4520658 59.6860755,30.4520819 59.6860924,30.4521387 59.6861383,30.4521581 59.6861556,30.4521822 59.6861782,30.45222 59.6862149,30.4522535 59.6862461,30.4522676 59.6862668,30.4522828 59.6862897,30.4522911 59.6863104,30.4522992 59.6863312,30.4523018 59.6863618,30.4522989 59.6863961,30.4522911 59.6864255,30.452286 59.6864496,30.4522787 59.6864747,30.4522743 59.6864925,30.452274 59.6865148,30.4522776 59.6865312,30.4522888 59.6865538,30.4523045 59.686573,30.4523226 59.6865862,30.4523413 59.6865954,30.4523836 59.686613,30.4524214 59.6866244,30.4524614 59.686634,30.4524912 59.6866392,30.4525264 59.6866438,30.4525641 59.6866457,30.4526585 59.6866455,30.4527524 59.6866414,30.4528825 59.6866353,30.4530173 59.6866255,30.4531259 59.6866181,30.4531936 59.6866133,30.453271 59.6866114,30.4533083 59.686614,30.4534028 59.6866228,30.4535229 59.6866363,30.4536201 59.6866455,30.453691 59.6866508,30.4536976 59.6866508,30.4539823 59.6866673,30.4539778 59.6866919,30.4544217 59.6867427,30.4544227 59.6867377,30.4544646 59.686742,30.4544638 59.6867472,30.4545508 59.6867576,30.4545534 59.6867525,30.4545963 59.6867573,30.4546214 59.6867604,30.4546788 59.6867553,30.4548168 59.686752,30.4551163 59.6867835,30.4552388 59.6868093,30.4553945 59.6868602,30.455491 59.6869022,30.4555769 59.68694,30.4556466 59.6869672,30.4557807 59.6870023,30.4558987 59.6870186,30.4559816 59.68702,30.4560875 59.6870601,30.4561508 59.6871091,30.4561831 59.6871675,30.456183 59.687235,30.4561616 59.6872894,30.4561159 59.6873352,30.4560824 59.6873697,30.4560436 59.6874139,30.4560113 59.687453,30.4559765 59.6875127,30.4559804 59.6875356,30.4559953 59.6875601,30.4560395 59.6875816,30.4560838 59.6875938,30.4561467 59.6876019,30.4561991 59.6876021,30.4563573 59.6875979,30.4565289 59.6875961,30.4566782 59.6875933,30.4567611 59.687592,30.4568899 59.687586,30.4570005 59.6875828,30.4570995 59.6875755,30.4572099 59.6875697,30.4573214 59.6875781,30.4574243 59.6875895,30.4575564 59.6876086,30.4576489 59.6876236,30.4577906 59.6876357,30.4578929 59.687656,30.4579737 59.6876911,30.4580413 59.6877282,30.4581225 59.6877678,30.4581817 59.6878027,30.4582341 59.6878291,30.4583152 59.6878863,30.4583478 59.6879193,30.4583877 59.6879673,30.458411 59.6880122,30.4584387 59.6880452,30.4584657 59.6880811,30.4585427 59.6881373,30.4585748 59.6881735,30.4586375 59.6882236,30.4586938 59.6882576,30.4587833 59.6883125,30.45884 59.6883434,30.4588959 59.6883741,30.4589723 59.6884163,30.4590175 59.6884495,30.4590717 59.6884887,30.4591366 59.6885238,30.4591908 59.6885653,30.4592104 59.6886013,30.4592312 59.6886474,30.4592494 59.6886943,30.4592859 59.6887303,30.4593172 59.688773,30.4593556 59.6888131,30.459429 59.6888677,30.459467 59.6889042,30.4594979 59.688929,30.4595172 59.6889694,30.4595266 59.6890044,30.4595285 59.689042,30.4595248 59.6890919,30.4595255 59.6891719,30.4595317 59.6892178,30.4595442 59.6893129,30.4595387 59.689363,30.4595118 59.6894235,30.4594761 59.689469,30.4594014 59.6895068,30.4593069 59.6895588,30.4592476 59.6895966,30.4591945 59.6896312,30.4591511 59.6896562,30.4591092 59.6896944,30.4590843 59.6897378,30.4590826 59.689771,30.4590853 59.6898069,30.4591078 59.6898435,30.4592007 59.6898882,30.4592339 59.6899293,30.4592628 59.6899874,30.4592762 59.6900429,30.45928 59.6901025,30.4592809 59.6901575,30.4592798 59.6902243,30.4593042 59.6902777,30.4593662 59.6903178,30.4594544 59.6903409,30.4595249 59.6903674,30.4595807 59.6903944,30.4596268 59.6904316,30.4596583 59.6904756,30.4596087 59.690551,30.4596006 59.6905905,30.4595977 59.6906403,30.4595904 59.6906903,30.4595826 59.6907418,30.4595821 59.6908019,30.459583 59.6908375,30.459529 59.6908703,30.4594074 59.6909353,30.4592831 59.6909939,30.459213 59.6910431,30.4591817 59.691066,30.4591361 59.6911201,30.4591012 59.6911675,30.4591012 59.691223,30.4591406 59.6912486,30.4592295 59.6912875,30.4592895 59.6913173,30.4593728 59.6913444,30.4594455 59.6913593,30.459517 59.6913682,30.4596037 59.6913935,30.4596491 59.6914211,30.4596908 59.6914522,30.4597319 59.6914924,30.4597559 59.6915361,30.4597745 59.6915821,30.459787 59.6916313,30.4597852 59.6916643,30.4597718 59.6917238,30.4597396 59.6917861,30.4596859 59.6918429,30.4596685 59.6918693,30.4596383 59.6919054,30.4596009 59.6919405,30.4595315 59.6919991,30.4594652 59.6920502,30.4594082 59.6920946,30.4593773 59.6921151,30.4593545 59.6921348,30.4593366 59.6921529,30.4593399 59.6921734,30.4593659 59.6921939,30.4596045 59.6923272,30.4596496 59.6923362,30.4596901 59.6923377,30.4597398 59.6923315,30.4597933 59.6923156,30.4598526 59.6922792,30.4599141 59.692234,30.4600168 59.6921771,30.4600862 59.6921317,30.4601606 59.6921103,30.4602526 59.6920827,30.460323 59.6920633,30.4603814 59.6920333,30.4604812 59.6919715,30.4605362 59.6919506,30.4606073 59.6919499,30.4606743 59.6919675,30.4607467 59.6920081,30.4608017 59.6920284,30.4608728 59.6920473,30.4609935 59.6920595,30.4610726 59.692067,30.4611517 59.6920866,30.4612403 59.6921299,30.4612939 59.6921759,30.4613569 59.6922104,30.4614227 59.6922341,30.4614964 59.6922659,30.4615568 59.6923059,30.4616211 59.6923729,30.4616748 59.6924466,30.4617579 59.6925197,30.4618368 59.6925614,30.461948 59.6926074,30.4620442 59.6926525,30.4621643 59.6927115,30.4622732 59.6927583,30.4623906 59.6927971,30.4625398 59.6928238,30.4626554 59.6928355,30.4627278 59.6928346,30.4627807 59.6928331,30.4629009 59.6928193,30.4629797 59.6928093,30.4630314 59.6928086,30.4630815 59.6928162,30.4631241 59.6928309,30.4631433 59.692849,30.4631354 59.6928782,30.4630918 59.6929178,30.4629933 59.692982,30.4628509 59.6930395,30.4627989 59.693076,30.4627775 59.6931068,30.4627715 59.6931374,30.4627782 59.6931678,30.4628 59.6931938,30.462816 59.6932161,30.4628201 59.6932352,30.4628276 59.6932642,30.4628055 59.6932947,30.462749 59.6933555,30.4627356 59.6934076,30.4627544 59.6934638,30.4627866 59.6935491,30.4628348 59.6936025,30.4628814 59.6936516,30.4629464 59.6936976,30.4630181 59.6937555,30.4631033 59.6938351,30.463194 59.693908,30.4632997 59.6939707,30.4633997 59.6940315,30.4634563 59.6940722,30.4634978 59.6941112,30.4635448 59.6941433,30.4635995 59.6941633,30.4636618 59.6941785,30.4637065 59.6941778,30.4637604 59.694169,30.4638165 59.6941725,30.4638941 59.6941882,30.463945 59.6941973,30.4639826 59.6942136,30.4640155 59.6942304,30.4640341 59.6942422,30.4640539 59.694259,30.4640781 59.6942943,30.4641097 59.6943536,30.4641054 59.6943849,30.4640955 59.6944214,30.4640677 59.6944543,30.4640278 59.694509,30.4639684 59.6945921,30.4639761 59.694632,30.4640196 59.6946691,30.4640928 59.6947215,30.4641504 59.6947644,30.4642414 59.694848,30.4643013 59.6949614,30.4643265 59.6950347,30.4643629 59.6950927,30.464383 59.6951471,30.4644155 59.6951914,30.4644503 59.6952616,30.464467 59.6953187,30.4644779 59.6953885,30.4644493 59.6954307,30.4644137 59.6954645,30.4643477 59.6955048,30.4642827 59.6955528,30.4641331 59.6956106,30.4640324 59.6956546,30.4639589 59.6956973,30.4639054 59.6957548,30.4638826 59.6958068,30.4638917 59.6958626,30.4638959 59.695908,30.4638913 59.6959452,30.4638761 59.6959807,30.4638581 59.6960266,30.4638387 59.6960774,30.4638353 59.6961315,30.4638514 59.6962235,30.4639031 59.6963079,30.4639806 59.6963837,30.4640641 59.696435,30.4641563 59.6964993,30.4642492 59.6965314,30.464353 59.6965624,30.4645112 59.6966079,30.4646909 59.6966431,30.4648519 59.6966796,30.4649082 59.6966992,30.4649645 59.6967256,30.4650316 59.6967635,30.465104 59.6968014,30.4651737 59.6968352,30.4652724 59.696889,30.4653398 59.6969338,30.4653714 59.6969637,30.4653977 59.6970024,30.4654124 59.6970396,30.4654285 59.6970924,30.4654299 59.6971357,30.4654285 59.6971912,30.4654178 59.6972534,30.4654178 59.6973103,30.4654268 59.6973472,30.465443 59.6973849,30.4654739 59.6974306,30.465535 59.6974889,30.4655776 59.6975263,30.4655998 59.6975497,30.4656249 59.6975948,30.4656281 59.6976305,30.4656291 59.6976586,30.465636 59.697698,30.4656478 59.6977439,30.4656559 59.6977839,30.4656639 59.6978247,30.4656741 59.697865,30.4656808 59.6978977,30.4656931 59.6979479,30.4657242 59.6979888,30.4657651 59.6980369,30.4658049 59.6980618,30.4658569 59.6980859,30.4659085 59.6981101,30.4659691 59.6981356,30.4659934 59.6981619,30.4660187 59.6982125,30.4660434 59.6982506,30.4660765 59.6982913,30.46612 59.6983229,30.46618 59.6983645,30.4662324 59.6983954,30.466279 59.6984245,30.4663222 59.6984585,30.4663422 59.6984839,30.4663508 59.6985161,30.466347 59.6985389,30.4663297 59.6985658,30.4662984 59.6986043,30.4662667 59.6986353,30.4662287 59.6986639,30.4662098 59.6986996,30.4662023 59.698738,30.4662177 59.6987814,30.4662476 59.6988217,30.4662941 59.6988595,30.4663218 59.6988897,30.4663703 59.6989336,30.4664066 59.698983,30.4664342 59.6990318,30.46626 59.699006,30.4662245 59.6990009,30.4661986 59.6989985,30.465736 59.6989731,30.465674 59.6989864,30.4656438 59.6989955,30.4656194 59.6990058,30.4655995 59.6990178,30.4655881 59.6990296,30.4655669 59.6990522,30.4655425 59.6990838,30.4655077 59.6991223,30.4654429 59.6991855,30.4653481 59.6992218,30.4652461 59.6992516,30.4651852 59.6992621,30.4651339 59.6992648,30.4650235 59.6992651,30.4649339 59.6992741,30.4648662 59.6992863,30.4647744 59.6993078,30.4647108 59.6993347,30.4646409 59.6993755,30.4645943 59.6994397,30.4645313 59.6994729,30.464447 59.6994976,30.4643342 59.6995189,30.4641272 59.6995513,30.4601 59.6956121,30.4590933 59.6945995,30.4585195 59.6940453,30.4565283 59.6920253,30.4559963 59.6915691,30.455779 59.6913562,30.4555191 59.6911016,30.4536132 59.6892318,30.4533114 59.6893232,30.4532486 59.6892981,30.453085 59.689221,30.4529871 59.689177,30.4528879 59.6891357,30.4528128 59.6891072,30.4524488 59.6889751,30.4524008 59.688958,30.4523038 59.6889045,30.4522723 59.6888961,30.4522552 59.6888858,30.4522361 59.6888724,30.452216 59.68885,30.4521838 59.6888324,30.4521207 59.6887986,30.4520511 59.6887644,30.4518909 59.6886967,30.4517882 59.6886551,30.4516822 59.6886098,30.4515358 59.6885556,30.4514019 59.6885123,30.4513037 59.6884778,30.4512571 59.6884636,30.4512056 59.6884428,30.4511404 59.6884196,30.4510778 59.6883871,30.4510264 59.6883553,30.4509783 59.6883239,30.4508749 59.6882578,30.4508266 59.688226,30.4507678 59.6881981,30.4505943 59.6881208,30.4501869 59.6879433,30.4499736 59.6878632,30.4499334 59.6878503,30.4498881 59.687841,30.4497871 59.6878092,30.4494924 59.6876814,30.4490926 59.6875099,30.4490362 59.6874936,30.4489854 59.6874759,30.4489383 59.6874638,30.448876 59.687449,30.4487626 59.6874338,30.4486346 59.6874221,30.4485214 59.6874142,30.4483648 59.6874032,30.4474691 59.687337,30.4468361 59.6872873,30.4467403 59.6872722,30.446684 59.6872669,30.4463496 59.6872017,30.4463085 59.6871943,30.4462561 59.6871833,30.4462179 59.6871721,30.446187 59.6871613,30.4461557 59.68715,30.4461253 59.6871366,30.4461066 59.6871274,30.4460918 59.6871135,30.4460273 59.6870454,30.4459552 59.6870078,30.4459436 59.6870073,30.4459073 59.6869902,30.4458766 59.6869748,30.445846 59.6869616,30.4458216 59.6869518,30.4457961 59.6869433,30.4457578 59.6869309,30.4457123 59.6869183,30.4456647 59.6869057,30.4455949 59.6868892,30.4455514 59.68688,30.4455232 59.6868726,30.4455129 59.6868665,30.4453868 59.6868434,30.44531 59.6868381,30.4452457 59.6868322,30.44506 59.686812,30.4450028 59.6868076,30.4449557 59.6868041,30.4449237 59.6868029,30.4448943 59.6868019,30.4448734 59.6868039,30.4448512 59.6868054,30.4448212 59.6868026,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017)))', 'relation', 4187886, '{"ref": "II", "name": "Долина реки Славянки", "place": "quarter", "name:az": "Slavyanka çayının vadisi", "name:fr": "Vallée de la rivière Slavianka", "name:hy": "Սլավյանկա գետի հովիտ", "name:uk": "Долина річки Слов''янки", "name:zh": "谷斯拉维亚卡河", "boundary": "protected_area", "int_name": "Vallée de la rivière Slavianka", "wikidata": "Q121809341", "wikipedia": "ru:Павловский парк#Долина реки Славянки", "description": "Район Павловского парка"}', NULL),
('SRID=4326;LINESTRING(30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392)', 'way', 1297781094, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{8289295976,12023732271,12023732270,12023732269,8114975027,12023699867,12023732331,12023732330,12023732337,12023732336}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528788 59.6854915)', 'way', 1093902027, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,1439053668}'),
('SRID=4326;LINESTRING(30.4535894 59.6847601,30.4535811 59.6847595)', 'way', 1297781085, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{12023732332,8289295976}'),
('SRID=4326;LINESTRING(30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601)', 'way', 1297781086, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{12023732335,12023732334,12023732333,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4519927 59.6856654,30.451993 59.6856352,30.4519974 59.6856085,30.4520057 59.6855861,30.452033 59.685533,30.4520717 59.6854725,30.4521073 59.6854196,30.4521538 59.6853554,30.4521646 59.6853419,30.4521729 59.6853289,30.4521751 59.685321,30.4521778 59.6853033,30.4521768 59.6852884,30.4522278 59.6851794,30.4522474 59.6851858,30.4522695 59.6851929,30.4522692 59.6852184,30.452307 59.6852409,30.4523333 59.6852571,30.4523534 59.6852701,30.4523836 59.685295,30.4524088 59.6853175,30.4524395 59.6853504,30.4524616 59.6853789,30.4524735 59.685401,30.4524845 59.6854195,30.4524943 59.6854502,30.452497 59.6854882,30.452346 59.6854768,30.4523217 59.6855588,30.4522802 59.6855556,30.4522258 59.6855515,30.4522191 59.6855742,30.4522002 59.685638,30.4521808 59.6857036,30.4521745 59.6857248,30.4522289 59.6857289,30.4522705 59.6857319,30.4522477 59.6858088,30.4522804 59.6858113,30.4525803 59.6858339,30.4526091 59.6858361,30.4526832 59.6858416,30.4528205 59.685852,30.4528174 59.6858982,30.4527279 59.6859036,30.4527314 59.6859191,30.4527383 59.6859422,30.4527472 59.6859643,30.4527643 59.6859927,30.4527791 59.6860133,30.4527956 59.6860336,30.4528174 59.6860572,30.4528406 59.6860793,30.4528659 59.6861008,30.4528879 59.6861175,30.4529175 59.6861373,30.4529497 59.6861561,30.4529804 59.6861727,30.4530167 59.6861897,30.4530418 59.6861992,30.4530963 59.6861616,30.4531534 59.686184,30.4531278 59.6862023,30.453137 59.6862056,30.4531608 59.6862141,30.4531704 59.6862175,30.453196 59.6861992,30.4531795 59.686249,30.4531642 59.6862975,30.453138 59.686381,30.4531363 59.6863866,30.4532826 59.6863983,30.4532725 59.6864305,30.4532916 59.686432,30.4532869 59.6864462,30.4532998 59.6864473,30.4533248 59.6864494,30.4533485 59.6864515,30.4533611 59.6864525,30.4533659 59.6864383,30.4534768 59.6864467,30.453575 59.6864544,30.4535812 59.6864636,30.4536188 59.68646,30.4536556 59.6864553,30.4536952 59.6864492,30.4537376 59.6864434,30.4537814 59.6864354,30.4538212 59.6864281,30.453863 59.6864194,30.4538817 59.6864353,30.4539287 59.6864214,30.4539454 59.6864356,30.4539576 59.686432,30.4540057 59.6864176,30.4540172 59.6864141,30.4540005 59.6863999,30.4540399 59.6863883,30.4540219 59.6863729,30.4540549 59.6863624,30.4540887 59.6863495,30.4541297 59.6863344,30.4541407 59.6863296,30.4541607 59.6863411,30.4541696 59.6863371,30.4542 59.6863235,30.4542091 59.6863195,30.4541887 59.6863078,30.4541965 59.6863041,30.4542363 59.6862844,30.4542705 59.6862654,30.4542999 59.6862773,30.4544137 59.6862059,30.4543849 59.6861942,30.4544059 59.686181,30.4544395 59.686154,30.4544728 59.6861239,30.4544964 59.6860973,30.4545494 59.6861117,30.4546053 59.6861282,30.4545922 59.6861427,30.4545784 59.6861572,30.4545449 59.6861862,30.4545138 59.6862131,30.4544576 59.6862495,30.4543906 59.6862854,30.4543294 59.6863147,30.4542746 59.6863415,30.454221 59.6863683,30.454115 59.6864133,30.454039 59.6864407,30.4539464 59.6864693,30.4539252 59.6864763,30.4538233 59.6865047,30.4536724 59.6865094,30.4536724 59.6865223,30.4536503 59.6865223,30.4535973 59.686521,30.4535465 59.6865208,30.4535021 59.6865209,30.4534712 59.6865222,30.4534473 59.6865255,30.453429 59.6865331,30.4534215 59.6865438,30.4534132 59.686574,30.4534136 59.6865866,30.453423 59.6865971,30.4534445 59.6866075,30.4534686 59.686613,30.4534579 59.6866461,30.4534073 59.6866421,30.4533332 59.6866345,30.4532837 59.6866305,30.453254 59.6866292,30.4532071 59.6866305,30.4531615 59.686632,30.4531191 59.6866347,30.4531041 59.6865988,30.4531448 59.6865925,30.4531695 59.6865869,30.4531966 59.6865772,30.4532138 59.6865676,30.4532231 59.6865589,30.453199 59.6865568,30.4531811 59.6865532,30.4531596 59.6865468,30.4531373 59.6865396,30.4531219 59.6865326,30.4530964 59.6865196,30.4530733 59.6865042,30.4530555 59.6864887,30.4530367 59.6864681,30.4530227 59.6864499,30.4530105 59.6864274,30.4530012 59.6864103,30.4529945 59.6863933,30.4529919 59.6863759,30.4529905 59.686347,30.4529907 59.6863231,30.4529911 59.6862911,30.4529891 59.686281,30.4529827 59.6862715,30.4529634 59.6862545,30.4529402 59.6862373,30.4529067 59.6862141,30.4528563 59.6861801,30.4528201 59.6861533,30.4527906 59.6861317,30.4527578 59.6861047,30.452731 59.6860823,30.4527092 59.6860609,30.4526947 59.6860457,30.4526816 59.6860278,30.4526652 59.6860011,30.4526541 59.6859782,30.4526337 59.6859283,30.4526256 59.6859159,30.4526103 59.685908,30.4525905 59.6859034,30.4525603 59.6859009,30.452391 59.6858965,30.4523675 59.6858999,30.4523504 59.685904,30.4523333 59.6859114,30.452312 59.685923,30.4522313 59.6859637,30.4521811 59.6859882,30.452085 59.686032,30.4520765 59.6860386,30.4520753 59.6860476,30.4520797 59.6860577,30.4520264 59.6860652,30.4520201 59.6860504,30.4520162 59.6860346,30.4520143 59.6860207,30.4520168 59.6860051,30.4520203 59.685989,30.4520274 59.6859769,30.4520341 59.6859612,30.4520405 59.6859506,30.452047 59.6859415,30.4520537 59.6859259,30.4520544 59.6859134,30.4520523 59.6858956,30.4520465 59.6858708,30.4520254 59.6858069,30.4519995 59.68571,30.4519927 59.6856654),(30.4521704 59.6857398,30.4521704 59.6857513,30.4521744 59.6857635,30.4521811 59.6857763,30.4521945 59.6857899,30.4522187 59.6858021,30.4522414 59.6858088,30.4522629 59.685735,30.4521731 59.6857289,30.4521704 59.6857398),(30.452226 59.6855475,30.4523159 59.6855543,30.4523387 59.6854798,30.4523212 59.6854826,30.4523011 59.6854866,30.452277 59.6854941,30.4522596 59.6855015,30.4522448 59.6855117,30.4522354 59.6855225,30.4522301 59.6855347,30.452226 59.6855475),(30.4522508 59.6858359,30.4525647 59.6858582,30.4525714 59.6858373,30.4522575 59.6858142,30.4522508 59.6858359),(30.4523249 59.685462,30.4523727 59.6854667,30.4523804 59.6854465,30.4523327 59.6854418,30.4523249 59.685462)))', 'relation', 6636677, '{"surface": "fine_gravel", "area:highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533763 59.68521,30.4534979 59.6851951,30.4535038 59.6852069,30.4534995 59.6852209,30.4533878 59.6852355,30.4533818 59.6852214,30.4533763 59.68521)))', 'relation', 12947389, '{"height": "6", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523253 59.6851768,30.4523286 59.6851637,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4525881 59.6854311,30.452574 59.6853959,30.4525486 59.6853522,30.4525291 59.6853286,30.4525137 59.6853106,30.452501 59.6852981,30.4524755 59.6852751,30.452455 59.6852592,30.4524366 59.6852453,30.4524178 59.6852321,30.4523994 59.6852201,30.4523706 59.6852014,30.452339 59.6851839,30.4523253 59.6851768)))', 'relation', 5906400, '{"ref": "2", "name": "Цветочный партер", "leisure": "garden", "name:en": "The Flower Parterre", "ref:okn": "781620399040956", "alt_name": "Цветники Марии Фёдоровны", "wikidata": "Q118122045", "garden:type": "flowerbed", "garden:style": "french"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.4533268 59.6853074,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532343 59.6853363,30.453156 59.6852825)))', 'relation', 17755883, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4531158 59.6853933,30.4531719 59.6854212,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530216 59.6854636,30.4529242 59.6854401,30.4529045 59.6854337)))', 'relation', 17755885, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4532343 59.6853363,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.453238 59.6853862,30.453207 59.6854026,30.4531719 59.6854212,30.4531158 59.6853933,30.4530217 59.6853466)))', 'relation', 17755884, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527677 59.6846399,30.4527719 59.6846286,30.4527799 59.6846212,30.4527933 59.6846157,30.4528134 59.6846137,30.4528403 59.6846144,30.4528537 59.6846178,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399)))', 'relation', 12932608, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 1721132, '{"ref": "3", "name": "Павильон Трёх граций", "note": "Геометрические теги крыши павильона размещены отдельно", "name:es": "Pabellón de las tres gracias", "name:fr": "Pavillon des Trois Grâces", "name:pt": "Pavilhão das Três Graças", "name:zh": "三美人亭", "ref:okn": "781610399040356", "tourism": "attraction", "building": "yes", "heritage": "2", "historic": "yes", "wikidata": "Q112716431", "addr:city": "Павловск", "architect": "Чарльз Камерон", "start_date": "1800", "addr:street": "Садовая улица", "architect:en": "Charles Cameron", "addr:housenumber": "20 литЧ", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6514/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12202573, '{"height": "7", "min_height": "5.5", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "1", "building:part": "yes", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12497925, '{"height": "1.5", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525466 59.6846232,30.4525568 59.6846156,30.4525613 59.6846073,30.4525618 59.6845988,30.4525615 59.68459,30.4525675 59.6845745,30.452571 59.6845656,30.452566 59.6845558,30.4525539 59.6845467,30.4526659 59.6845694,30.4527826 59.6845897,30.4528946 59.6846069,30.4530012 59.6846212,30.4535732 59.6846878,30.4535916 59.6846905,30.453606 59.6846946,30.4536164 59.684701,30.4536208 59.6847085,30.4536214 59.684718,30.4536181 59.6847274,30.4536067 59.6847614,30.4535894 59.6847601,30.4535811 59.6847595,30.4535863 59.6847456,30.4535923 59.6847296,30.4535925 59.6847224,30.4535886 59.6847164,30.4535807 59.6847121,30.4535698 59.6847103,30.4535555 59.6847085,30.4530859 59.6846667,30.4530887 59.6846582,30.4530942 59.6846416,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399,30.4525841 59.6846239,30.4525626 59.6846222,30.4525466 59.6846232)))', 'relation', 12131779, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452047 59.6856386,30.4520524 59.6856064,30.4520624 59.6855804,30.4520946 59.6855262,30.4521293 59.6854701,30.4521596 59.6854203,30.4521905 59.6853763,30.4522119 59.6853269,30.4522167 59.6853009,30.4522474 59.6851858,30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4601554 59.6854805,30.4601767 59.6856005,30.4601793 59.6857568,30.4601468 59.6858374,30.4600081 59.6860973,30.459853 59.68614,30.459704 59.6863415,30.4596832 59.6864086,30.4596712 59.686482,30.4596638 59.6865545,30.459666 59.6866369,30.4596929 59.6867933,30.4597047 59.6868418,30.4597409 59.6869365,30.4598403 59.6871335,30.4599111 59.6872432,30.4599552 59.6873116,30.4600453 59.6874469,30.460134 59.687572,30.4600858 59.6875668,30.4600427 59.6875593,30.4599863 59.6875559,30.4598958 59.6875545,30.4597744 59.6875619,30.4597289 59.6875627,30.4596698 59.687583,30.4596323 59.6876026,30.4595974 59.6876371,30.4595625 59.6876658,30.4595236 59.6876852,30.459478 59.6876967,30.459407 59.6877062,30.4593453 59.6877028,30.4592849 59.6876838,30.4592367 59.6876553,30.4591509 59.6875883,30.4590905 59.6875599,30.4590355 59.6875424,30.4589524 59.6875261,30.4588343 59.6875105,30.4586868 59.6875038,30.4585474 59.6875038,30.4584333 59.6875086,30.4583274 59.6875126,30.4582348 59.6875193,30.4581437 59.6875301,30.4580095 59.6875505,30.4579371 59.6875654,30.4579009 59.6875782,30.4578312 59.6876019,30.4577386 59.6876249,30.4576489 59.6876236,30.4575564 59.6876086,30.4574243 59.6875895,30.4573214 59.6875781,30.4572099 59.6875697,30.4570995 59.6875755,30.4570005 59.6875828,30.4568899 59.687586,30.4567611 59.687592,30.4566782 59.6875933,30.4565289 59.6875961,30.4563573 59.6875979,30.4561991 59.6876021,30.4561467 59.6876019,30.4560838 59.6875938,30.4560395 59.6875816,30.4559953 59.6875601,30.4559804 59.6875356,30.4559765 59.6875127,30.4560113 59.687453,30.4560436 59.6874139,30.4560824 59.6873697,30.4561159 59.6873352,30.4561616 59.6872894,30.456183 59.687235,30.4561831 59.6871675,30.4561508 59.6871091,30.4560875 59.6870601,30.4559816 59.68702,30.4558987 59.6870186,30.4557807 59.6870023,30.4556466 59.6869672,30.4555769 59.68694,30.455491 59.6869022,30.4553945 59.6868602,30.4552388 59.6868093,30.4551163 59.6867835,30.4548168 59.686752,30.4546788 59.6867553,30.4546214 59.6867604,30.4545963 59.6867573,30.4545534 59.6867525,30.4545508 59.6867576,30.4544638 59.6867472,30.4544646 59.686742,30.4544227 59.6867377,30.4544217 59.6867427,30.4539778 59.6866919,30.4539823 59.6866673,30.4536976 59.6866508,30.453691 59.6866508,30.4536201 59.6866455,30.4535229 59.6866363,30.4534028 59.6866228,30.4533083 59.686614,30.453271 59.6866114,30.4531936 59.6866133,30.4531259 59.6866181,30.4530173 59.6866255,30.4528825 59.6866353,30.4527524 59.6866414,30.4526585 59.6866455,30.4525641 59.6866457,30.4525264 59.6866438,30.4524912 59.6866392,30.4524614 59.686634,30.4524214 59.6866244,30.4523836 59.686613,30.4523413 59.6865954,30.4523226 59.6865862,30.4523045 59.686573,30.4522888 59.6865538,30.4522776 59.6865312,30.452274 59.6865148,30.4522743 59.6864925,30.4522787 59.6864747,30.452286 59.6864496,30.4522911 59.6864255,30.4522989 59.6863961,30.4523018 59.6863618,30.4522992 59.6863312,30.4522911 59.6863104,30.4522828 59.6862897,30.4522676 59.6862668,30.4522535 59.6862461,30.45222 59.6862149,30.4521822 59.6861782,30.4521581 59.6861556,30.4521387 59.6861383,30.4520819 59.6860924,30.4520658 59.6860755,30.4520492 59.6860479,30.4520478 59.686026,30.4520825 59.6859825,30.4521047 59.6859432,30.4521127 59.6859046,30.4520997 59.6858613,30.4520778 59.685798,30.4520551 59.685713,30.452047 59.6856666,30.452047 59.6856386)))', 'relation', 4194432, '{"ref": "III", "name": "Придворцовый район", "place": "quarter", "name:fr": "Secteur central", "website": "https://pavlovskmuseum.ru/about/park/layout/36/", "boundary": "protected_area", "wikidata": "Q121809724", "wikipedia": "ru:Павловский парк#Центральный (Придворцовый) район", "description": "Район исторического Павловского парка"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4366882 59.6889898,30.4370373 59.6889668,30.4370736 59.6889644,30.4371138 59.6889367,30.4374634 59.6889115,30.4375002 59.6889088,30.4375427 59.6889059,30.4380171 59.6888738,30.438182 59.6888616,30.4383254 59.6888487,30.4384589 59.6888338,30.4385849 59.6888182,30.4388652 59.6887778,30.4389016 59.6887728,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346802 59.6935317,30.4346817 59.6935045,30.4346729 59.6934955,30.4346017 59.6934439,30.4344133 59.6933106,30.4344523 59.6932882,30.4344971 59.6932601,30.4345233 59.6932407,30.4345424 59.6932254,30.4345634 59.6932027,30.4345863 59.693171,30.4345979 59.6931498,30.4346066 59.6931248,30.4346128 59.6930889,30.434612 59.693054,30.4346077 59.6930245,30.4346019 59.6930124,30.4345969 59.693,30.4345757 59.6929702,30.4345621 59.6929518,30.434542 59.6929299,30.4345091 59.6928998,30.4344756 59.6928775,30.4344413 59.6928581,30.4343883 59.6928337,30.4343603 59.6928224,30.4343198 59.692809,30.4342705 59.6927958,30.4342429 59.6927909,30.4341796 59.6927811,30.4341217 59.6927737,30.4340777 59.6927708,30.4340075 59.6927673,30.4339293 59.6927692,30.4338474 59.6927768,30.433767 59.6927902,30.4337225 59.6928016,30.4335043 59.6926756,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)))', 'relation', 1721131, '{"name": "Павловский парк", "note": "https://wiki.openstreetmap.org/wiki/RU:Павловск/Павловский_парк", "leisure": "park", "name:be": "Паўлаўскі парк", "name:bg": "Павловски парк", "name:ca": "Parc Pàvlovsk", "name:en": "Pavlovsk Park", "name:es": "Parque Pávlovsk", "name:fr": "Parc de Pavlovsk", "name:he": "פארק פבלובסק", "name:hy": "Պավլովսկ պարկը", "name:nl": "Pavlovskpark", "name:ru": "Павловский парк", "name:zh": "巴甫洛夫斯克公园", "ref:okn": "781720399040986", "website": "https://pavlovskmuseum.ru/about/park/", "boundary": "protected_area", "heritage": "2", "historic": "yes", "int_name": "Parc de Pavlovsk", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q2506336", "wikipedia": "ru:Павловский парк", "fee:amount": "100", "start_date": "1777", "opening_hours": "07:00-19:00", "protect_class": "22", "operator:phone": "+7 (812) 452-15-36", "fee:conditional": "yes @ 9:00-17:00", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6407/", "operator:tourism": "museum", "operator:website": "http://www.pavlovskmuseum.ru", "protection_title": "Государственный музей-заповедник"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4368674 59.6896812,30.4373083 59.6896203,30.4383622 59.6894747,30.4383925 59.6894699,30.4387768 59.6894091,30.4389533 59.6893793,30.4395631 59.6892765,30.4395975 59.6896826,30.43963 59.6897841,30.4411104 59.6895883,30.4411759 59.6892872,30.4412059 59.6891298,30.4412229 59.6890714,30.4402547 59.6891154,30.4398722 59.6891396,30.4395358 59.6891608,30.4394903 59.6891472,30.4392717 59.6889536,30.4391469 59.6889286,30.4391174 59.6889211,30.4390705 59.6889062,30.4390316 59.6888852,30.4390007 59.6888636,30.4389819 59.6888446,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346174 59.6935301,30.4346147 59.6935224,30.4346086 59.6935129,30.4345932 59.6935014,30.4344744 59.6934215,30.4344752 59.6934118,30.4344684 59.6934032,30.4343048 59.693294,30.4335858 59.6928433,30.4335672 59.6928378,30.4335491 59.692831,30.4335344 59.6928246,30.4335169 59.6928158,30.4334908 59.6928019,30.4334747 59.6927935,30.4334378 59.6927735,30.4334063 59.6927569,30.4333486 59.6927221,30.4332896 59.6926848,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)),((30.4459925 59.6840515,30.4465029 59.6838166,30.4469327 59.6836721,30.4472874 59.6834226,30.4479163 59.6832392,30.4483415 59.6832476,30.4484247 59.6832514,30.4484595 59.6832547,30.4484884 59.6832585,30.4485108 59.6832641,30.4489705 59.6834352,30.4489993 59.6834563,30.4490069 59.6834636,30.4492468 59.6836887,30.4491255 59.6840718,30.4490543 59.6840686,30.4483928 59.684035,30.4478277 59.6840459,30.4469355 59.6841321,30.4462744 59.6842068,30.4459925 59.6840515)))', 'relation', 17990902, '{"name": "Государственный музей-заповедник «Павловск»", "note": "граница имущественного комплекса организации, не граница парка", "boundary": "protected_area", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q405637"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601,30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698)))', 'relation', 17786995, '{"landuse": "construction", "start_date": "06.204", "description": "реставрация Павильона Трех граций"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522477 59.6858088,30.4522705 59.6857319,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4527091 59.6855042,30.4528709 59.6855164,30.4529043 59.6855189,30.4529835 59.685525,30.4530542 59.6855302,30.4530286 59.6856166,30.4529796 59.6857822,30.4529559 59.6858622,30.4528897 59.6858572,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088)))', 'relation', 6636658, '{"height": "19.650", "architect": "Чарльз Камерон", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2.45", "building:part": "yes", "building:colour": "#FFE19C", "source:building:part": "http://pancer.ru/images/project/012/2.jpg"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4530216 59.6854636,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.453064 59.6855044,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 6636659, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528709 59.6855164,30.4528746 59.6855048,30.4528788 59.6854915,30.4529122 59.6854936,30.4529942 59.6854993,30.4529881 59.6855114,30.4529835 59.685525,30.4529043 59.6855189,30.4528709 59.6855164)))', 'relation', 14572596, '{"height": "6.65", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533818 59.6852214,30.453417 59.6852162,30.4534578 59.6852115,30.4535038 59.6852069,30.4535289 59.6853164,30.4535075 59.6853177,30.4534847 59.6853198,30.4534688 59.6853212,30.4534368 59.6853262,30.453436 59.6853248,30.4534146 59.6852887,30.4533878 59.6852355,30.4533818 59.6852214)))', 'relation', 17755881, '{"height": "13", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.453436 59.6853248,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533268 59.6853074,30.4532684 59.6852465)))', 'relation', 17755882, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.4533836 59.6852944,30.4533532 59.6853009,30.4533268 59.6853074,30.4532946 59.6853162,30.4532665 59.6853249,30.4532343 59.6853363,30.4532132 59.6853445,30.4531881 59.6853553,30.453164 59.6853668,30.4531411 59.6853788,30.4531158 59.6853933,30.4530954 59.6854062,30.4530746 59.6854199,30.4530552 59.6854344,30.4530382 59.6854491,30.4530216 59.6854636,30.4530079 59.6854761,30.4530004 59.6854886,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 17904735, '{"height": "10", "roof:shape": "flat", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.4528469 59.6846817,30.452843 59.684694,30.4529628 59.6847041,30.4530706 59.6847131,30.4530752 59.684699,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4535302 59.6851198,30.4535229 59.6851437,30.4535137 59.6851734,30.4535124 59.6851786,30.4535038 59.6852069,30.4534979 59.6851951,30.4534914 59.6851874,30.4534811 59.6851808,30.4534678 59.6851758,30.4534524 59.6851728,30.453436 59.6851719,30.4534196 59.6851732,30.4534028 59.6851772,30.4533891 59.6851835,30.4533796 59.6851915,30.4533752 59.6852006,30.4533763 59.68521,30.4533818 59.6852214,30.4533524 59.685227,30.4533302 59.6852316,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4528993 59.6854656,30.4528865 59.6854815,30.4528788 59.6854915,30.4528746 59.6855048,30.4527686 59.6854977,30.452777 59.6854654,30.4527565 59.685464,30.4527224 59.6854618,30.4526841 59.6854592,30.4526646 59.6854579,30.4526564 59.6854895,30.4525812 59.6854845,30.4525787 59.6854944,30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858,30.4522278 59.6851794)))', 'relation', 4274530, '{"fee": "yes", "ref": "IIIа", "name": "Собственный сад", "leisure": "garden", "name:fr": "Jardin privé", "ref:okn": "781620399040366", "tourism": "attraction", "alt_name": "Собственный садик", "boundary": "protected_area", "heritage": "2", "wikidata": "Q118122043", "start_date": "1803", "garden:style": "french", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6518/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4521745 59.6857248,30.4521808 59.6857036,30.4522002 59.685638,30.4522191 59.6855742,30.4522258 59.6855515,30.4522802 59.6855556,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533763 59.68521,30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540229 59.6848667,30.4540358 59.6848708,30.454047 59.6848759,30.4540561 59.6848821,30.454063 59.6848889,30.4540674 59.6848962,30.4540691 59.6849039,30.454068 59.6849115,30.4540643 59.6849189,30.454058 59.6849259,30.4540493 59.6849322,30.4540386 59.6849376,30.4540261 59.684942,30.4540122 59.6849452,30.4539975 59.684947,30.4539823 59.6849475,30.4539763 59.6849646,30.453965 59.6849637,30.4539277 59.6849606,30.4538688 59.6849558,30.4538059 59.6849506,30.4537818 59.6849487,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537483 59.6850789,30.4538612 59.6850876,30.4539247 59.6850925,30.4539406 59.6850424,30.4539786 59.6850519,30.4540221 59.685063,30.4540417 59.6850686,30.4540646 59.6850751,30.4541059 59.6850881,30.4541472 59.6851025,30.4541871 59.685118,30.4542254 59.6851343,30.4542622 59.6851516,30.4542942 59.6851377,30.4544115 59.6852076,30.4543838 59.6852203,30.4544141 59.6852392,30.4544426 59.6852588,30.4544691 59.6852791,30.4544972 59.6853031,30.4545225 59.6853279,30.4545451 59.6853534,30.4545829 59.6853462,30.4546442 59.6854282,30.4546081 59.6854351,30.4546263 59.6854611,30.4546407 59.6854917,30.4546513 59.6855211,30.4546577 59.6855509,30.4545667 59.6855569,30.4545695 59.6855677,30.4545502 59.6855689,30.4545521 59.6855762,30.454475 59.6855814,30.454473 59.685574,30.4544524 59.6855754,30.4544496 59.6855646,30.4544349 59.6855656,30.4543687 59.68557,30.4543619 59.6855441,30.4543522 59.6855184,30.4543439 59.6854971,30.4543247 59.685468,30.454307 59.6854434,30.4542866 59.6854194,30.4542636 59.6853959,30.4542381 59.6853732,30.4542062 59.685347,30.4541753 59.6853248,30.4541426 59.6853062,30.4541083 59.6852876,30.4540689 59.6852681,30.4540273 59.6852498,30.4539837 59.6852328,30.4539382 59.685217,30.4538908 59.6852026,30.4538877 59.6852126,30.4539316 59.6852158,30.4539299 59.6852218,30.4539248 59.68524,30.453923 59.6852463,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536921 59.6853643,30.4536766 59.6853631,30.453626 59.6853592,30.4536111 59.6853581,30.4536187 59.6853329,30.4534688 59.6853212,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.4532824 59.685393,30.4532679 59.6854007,30.4532019 59.6854356,30.4531881 59.6854429,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.45306 59.6855156,30.4530542 59.6855302,30.4530286 59.6856166,30.4530752 59.6856201,30.4531272 59.685624,30.4531226 59.6856395,30.4531 59.6857159,30.4530826 59.6857747,30.4530781 59.6857896,30.4530261 59.6857857,30.4529796 59.6857822,30.4529559 59.6858622,30.4529512 59.6858765,30.4529486 59.6858896,30.4529478 59.6859011,30.4529482 59.6859112,30.452952 59.685926,30.4529569 59.6859385,30.4529638 59.6859523,30.4529718 59.6859649,30.4529791 59.6859757,30.4529856 59.6859841,30.4530246 59.6859742,30.4530338 59.6859834,30.4530767 59.6860278,30.4530861 59.6860371,30.4530482 59.6860471,30.4530568 59.6860536,30.4530663 59.6860602,30.4530779 59.6860674,30.4530898 59.6860742,30.4531018 59.6860809,30.4531136 59.6860871,30.4531293 59.6860946,30.453148 59.6861029,30.4531695 59.6861116,30.4532167 59.6861306,30.4533686 59.6861421,30.453376 59.6861189,30.4533898 59.68612,30.4534436 59.6861244,30.453457 59.6861255,30.4534496 59.6861487,30.4536027 59.6861615,30.4535556 59.6863114,30.4535958 59.6863065,30.4536563 59.6862959,30.4537014 59.6862868,30.4537731 59.6862682,30.4538342 59.6862493,30.453879 59.6862345,30.4539364 59.686214,30.4539768 59.686198,30.45402 59.6861768,30.4540703 59.686148,30.4541119 59.6861223,30.4541469 59.6860952,30.4541742 59.6860729,30.4541995 59.6860505,30.4542215 59.6860272,30.4542918 59.6860451,30.4543031 59.6860479,30.4543127 59.6860386,30.45433 59.6860429,30.4543365 59.6860363,30.4544062 59.6860538,30.4543997 59.6860604,30.4544185 59.6860651,30.4544086 59.6860746,30.4544964 59.6860973,30.4544728 59.6861239,30.4544395 59.686154,30.4544059 59.686181,30.4543849 59.6861942,30.4544137 59.6862059,30.4542999 59.6862773,30.4542705 59.6862654,30.4542363 59.6862844,30.4541965 59.6863041,30.4541887 59.6863078,30.4542091 59.6863195,30.4542 59.6863235,30.4541696 59.6863371,30.4541607 59.6863411,30.4541407 59.6863296,30.4541297 59.6863344,30.4540887 59.6863495,30.4540549 59.6863624,30.4540219 59.6863729,30.4540399 59.6863883,30.4540005 59.6863999,30.4540172 59.6864141,30.4540057 59.6864176,30.4539576 59.686432,30.4539454 59.6864356,30.4539287 59.6864214,30.4538817 59.6864353,30.453863 59.6864194,30.4538212 59.6864281,30.4537814 59.6864354,30.4537376 59.6864434,30.4536952 59.6864492,30.4536556 59.6864553,30.4536188 59.68646,30.4535812 59.6864636,30.453575 59.6864544,30.4534768 59.6864467,30.4533659 59.6864383,30.4533611 59.6864525,30.4533485 59.6864515,30.4533248 59.6864494,30.4532998 59.6864473,30.4532869 59.6864462,30.4532916 59.686432,30.4532725 59.6864305,30.4532826 59.6863983,30.4531363 59.6863866,30.453138 59.686381,30.4531642 59.6862975,30.4531215 59.686294,30.4531372 59.6862455,30.4531795 59.686249,30.453196 59.6861992,30.4531704 59.6862175,30.4531608 59.6862141,30.453137 59.6862056,30.4531278 59.6862023,30.4531534 59.686184,30.4530963 59.6861616,30.4530418 59.6861992,30.4530167 59.6861897,30.4529804 59.6861727,30.4529497 59.6861561,30.4529175 59.6861373,30.4528879 59.6861175,30.4528659 59.6861008,30.4528406 59.6860793,30.4528174 59.6860572,30.4527956 59.6860336,30.4527791 59.6860133,30.4527643 59.6859927,30.4527472 59.6859643,30.4527383 59.6859422,30.4527314 59.6859191,30.4527279 59.6859036,30.4528174 59.6858982,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088,30.4522705 59.6857319,30.4522289 59.6857289,30.4521745 59.6857248)))', 'relation', 1759666, '{"name": "Павловский дворец", "name:ca": "Palau Pàvlovsk", "name:en": "Pavlovsk Palace", "name:fi": "Pavlovskin_palatsi", "name:fr": "Palais de Pavlovsk", "name:pt": "Palácio de Pavlovsk", "name:uz": "Pavlovsk saroyi", "name:zh": "巴甫洛夫斯克的宫殿", "ref:okn": "781610399040316", "tourism": "museum", "building": "palace", "historic": "yes", "int_name": "Palais de Pavlovsk", "wikidata": "Q118121947", "wikipedia": "ru:Павловский дворец", "start_date": "1782", "addr:street": "Садовая улица", "roof:colour": "#DADDE2", "building:colour": "#FFE19C", "addr:housenumber": "20 литА"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534688 59.6853212,30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536666 59.6853366,30.4536187 59.6853329,30.4534688 59.6853212)))', 'relation', 6636665, '{"name": "Южный корпус", "height": "15", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4534995 59.6852209)))', 'relation', 14572597, '{"height": "15", "roof:shape": "gabled", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540054 59.6848752,30.4537854 59.6848579,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537003 59.685133,30.453682 59.6851921,30.4535124 59.6851786)))', 'relation', 18019154, '{"height": "13", "roof:shape": "hipped", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL);
--Testcase 402:
SELECT count(*) FROM json_osm_test;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 404: オーク / Sồi
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 406:
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 407:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 408: 落葉性 / Cây rụng lá
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 409:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 410: 常緑植物 / Cây thường xanh
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 411:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 412: XVIII cent.
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 413:
DELETE FROM json_osm_test;
--Testcase 500:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/macaddr.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR"( "i" int OPTIONS (key 'true'), "m" macaddr) SERVER sqlite_svr OPTIONS (table 'type_MACADDR');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (1, '08:00:2b:01:02:03');
--Testcase 012:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (2, '08-00-2b-01-02-03');
--Testcase 013:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (3, '08002b:010203');
--Testcase 014:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (4, '08002b-010203');
--Testcase 015:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (5, '0800.2b01.0203');
--Testcase 016:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (6, '0800-2b01-0203');
--Testcase 017:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (7, '08002b010203');
--Testcase 018:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (8, '08:00:2F:01:02:03');
--Testcase 019:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (9, '08-00-2F-01-02-03');
--Testcase 020:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (10, '08002F:010203');
--Testcase 021:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (11, '08002F-010203');
--Testcase 022:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (12, '0800.2F01.0203');
--Testcase 023:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (13, '0800-2F01-0203');
--Testcase 024:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (14, '08002F010203');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (15, decode('08002F010203', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (16, decode('08002b010203', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE macaddr;
--Testcase 029:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (17, '08:00:2b:01:02:03');
--Testcase 030:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (18, '08-00-2b-01-02-03');
--Testcase 031:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (19, '08002b:010203');
--Testcase 032:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (20, '08002b-010203');
--Testcase 033:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (21, '0800.2b01.0203');
--Testcase 034:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (22, '0800-2b01-0203');
--Testcase 035:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (23, '08002b010203');
--Testcase 036:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (24, '08:00:2F:01:02:03');
--Testcase 037:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (25, '08-00-2F-01-02-03');
--Testcase 038:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (26, '08002F:010203');
--Testcase 039:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (27, '08002F-010203');
--Testcase 040:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (28, '0800.2F01.0203');
--Testcase 041:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (29, '0800-2F01-0203');
--Testcase 042:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (31, '08:00:2b:01:02:03');
--Testcase 046:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (32, '08-00-2b-01-02-03');
--Testcase 047:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (33, '08002b:010203');
--Testcase 048:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (34, '08002b-010203');
--Testcase 049:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (35, '0800.2b01.0203');
--Testcase 050:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (36, '0800-2b01-0203');
--Testcase 051:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (37, '08002b010203');
--Testcase 052:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (38, '08:00:2F:01:02:03');
--Testcase 053:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (39, '08-00-2F-01-02-03');
--Testcase 054:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (40, '08002F:010203');
--Testcase 055:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (41, '08002F-010203');
--Testcase 056:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (42, '0800.2F01.0203');
--Testcase 057:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (43, '0800-2F01-0203');
--Testcase 058:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (45, '08:00:2b:01:02:03');
--Testcase 062:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (46, '08-00-2b-01-02-03');
--Testcase 063:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (47, '08002b:010203');
--Testcase 064:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (48, '08002b-010203');
--Testcase 065:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (49, '0800.2b01.0203');
--Testcase 066:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (50, '0800-2b01-0203');
--Testcase 067:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (51, '08002b010203');
--Testcase 068:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (52, '08:00:2F:01:02:03');
--Testcase 069:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (53, '08-00-2F-01-02-03');
--Testcase 070:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (54, '08002F:010203');
--Testcase 071:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (55, '08002F-010203');
--Testcase 072:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (56, '0800.2F01.0203');
--Testcase 073:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (57, '0800-2F01-0203');
--Testcase 074:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR+"( "i" int OPTIONS (key 'true'), "m" macaddr, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR+');
--Testcase 077:
SELECT * FROM "type_MACADDR+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 084:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 088:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 091:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17; -- 9527026057731
--Testcase 098:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 106:
SELECT * FROM "type_MACADDR+";
--Testcase 107:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (59, '08:AA:2F:01:02:04');
--Testcase 108:
SELECT * FROM "type_MACADDR+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 111:
SELECT * FROM "type_MACADDR+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 115:
SELECT * FROM "type_MACADDR+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 119:
SELECT * FROM "type_MACADDR+";
--Testcase 120:
DELETE FROM "type_MACADDR";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (60, '01:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (61, '02:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (62, '03:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (63, '00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (64, '00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (65, '00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (66, '00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (67, '00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (68, '00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDRpk" (col macaddr OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDRpk" VALUES ('01-02-03-04-05-06');
--Testcase 159:
SELECT * FROM "type_MACADDRpk";
--Testcase 160:
DELETE FROM "type_MACADDRpk";
--no macaddr operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/macaddr8.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR8"( "i" int OPTIONS (key 'true'), "m" macaddr8) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (1, '08:00:2b:01:02:03:04:05');
--Testcase 012:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (2, '08-00-2b-01-02-03-04-05');
--Testcase 013:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (3, '08002b01:02030405');
--Testcase 014:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (4, '08002b01-02030405');
--Testcase 015:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (5, '0800.2b01.0203.0405');
--Testcase 016:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (6, '0800-2b01-0203-0405');
--Testcase 017:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (7, '08002b0102030405');
--Testcase 018:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (8, '08:00:2F:01:02:03:04:05');
--Testcase 019:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (9, '08-00-2F-01-02-03-04-05');
--Testcase 020:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (10, '08002F01:02030405');
--Testcase 021:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (11, '08002F01-02030405');
--Testcase 022:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (12, '0800.2F01.0203.0405');
--Testcase 023:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (13, '0800-2F01-0203-0405');
--Testcase 024:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (14, '08002F0102030405');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (15, decode('08002F0102030405', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (16, decode('08002b0102030405', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE macaddr8;
--Testcase 029:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (17, '08:00:2b:01:02:03:04:05');
--Testcase 030:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (18, '08-00-2b-01-02-03-04-05');
--Testcase 031:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (19, '08002b01:02030405');
--Testcase 032:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (20, '08002b01-02030405');
--Testcase 033:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (21, '0800.2b01.0203.0405');
--Testcase 034:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (22, '0800-2b01-0203-0405');
--Testcase 035:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (23, '08002b0102030405');
--Testcase 036:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (24, '08:00:2F:01:02:03:04:05');
--Testcase 037:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (25, '08-00-2F-01-02-03-04-05');
--Testcase 038:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (26, '08002F01:02030405');
--Testcase 039:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (27, '08002F01-02030405');
--Testcase 040:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (28, '0800.2F01.0203.0405');
--Testcase 041:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (29, '0800-2F01-0203-0405');
--Testcase 042:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (31, '08:00:2b:01:02:03:04:05');
--Testcase 046:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (32, '08-00-2b-01-02-03-04-05');
--Testcase 047:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (33, '08002b01:02030405');
--Testcase 048:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (34, '08002b01-02030405');
--Testcase 049:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (35, '0800.2b01.0203.0405');
--Testcase 050:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (36, '0800-2b01-0203-0405');
--Testcase 051:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (37, '08002b0102030405');
--Testcase 052:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (38, '08:00:2F:01:02:03:04:05');
--Testcase 053:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (39, '08-00-2F-01-02-03-04-05');
--Testcase 054:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (40, '08002F01:02030405');
--Testcase 055:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (41, '08002F01-02030405');
--Testcase 056:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (42, '0800.2F01.0203.0405');
--Testcase 057:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (43, '0800-2F01-0203-0405');
--Testcase 058:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (45, '08:00:2b:01:02:03:04:05');
--Testcase 062:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (46, '08-00-2b-01-02-03-04-05');
--Testcase 063:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (47, '08002b01:02030405');
--Testcase 064:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (48, '08002b01-02030405');
--Testcase 065:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (49, '0800.2b01.0203.0405');
--Testcase 066:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (50, '0800-2b01-0203-0405');
--Testcase 067:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (51, '08002b0102030405');
--Testcase 068:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (52, '08:00:2F:01:02:03:04:05');
--Testcase 069:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (53, '08-00-2F-01-02-03-04-05');
--Testcase 070:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (54, '08002F01:02030405');
--Testcase 071:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (55, '08002F01-02030405');
--Testcase 072:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (56, '0800.2F01.0203.0405');
--Testcase 073:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (57, '0800-2F01-0203-0405');
--Testcase 074:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR8+"( "i" int OPTIONS (key 'true'), "m" macaddr8, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8+');
--Testcase 077:
SELECT * FROM "type_MACADDR8+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 084:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 088:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 091:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 098:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 106:
SELECT * FROM "type_MACADDR8+";
--Testcase 107:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (59, '08:AA:2F:01:02:04:04:05');
--Testcase 108:
SELECT * FROM "type_MACADDR8+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 111:
SELECT * FROM "type_MACADDR8+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 115:
SELECT * FROM "type_MACADDR8+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 119:
SELECT * FROM "type_MACADDR8+";
--Testcase 120:
DELETE FROM "type_MACADDR8";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (60, '01:00:00:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (61, '02:00:00:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (62, '03:00:00:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (63, '00:00:00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (64, '00:00:00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (65, '00:00:00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (66, '00:00:00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (67, '00:00:00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (68, '00:00:00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR8" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR8" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDR8pk" (col macaddr8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDR8pk" VALUES ('01-02-03-04-05-06-07-08');
--Testcase 159:
SELECT * FROM "type_MACADDR8pk";
--Testcase 160:
DELETE FROM "type_MACADDR8pk";
--no macaddr8 operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR8";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/numeric.sql
================================================
--
-- NUMERIC
--
--Testcase 567:
CREATE EXTENSION sqlite_fdw;
--Testcase 568:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 569:
CREATE FOREIGN TABLE num_data (id int4 OPTIONS (key 'true'), val numeric(210,10)) SERVER sqlite_svr;
--Testcase 570:
CREATE FOREIGN TABLE num_exp_add (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 571:
CREATE FOREIGN TABLE num_exp_sub (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 572:
CREATE FOREIGN TABLE num_exp_div (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 573:
CREATE FOREIGN TABLE num_exp_mul (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 574:
CREATE FOREIGN TABLE num_exp_sqrt (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 575:
CREATE FOREIGN TABLE num_exp_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 576:
CREATE FOREIGN TABLE num_exp_log10 (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 577:
CREATE FOREIGN TABLE num_exp_power_10_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 1556:
CREATE FOREIGN TABLE num_variance (a numeric) SERVER sqlite_svr;
--Testcase 578:
CREATE FOREIGN TABLE num_result (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), result numeric(210,10)) SERVER sqlite_svr;
-- ******************************
-- * The following EXPECTED results are computed by bc(1)
-- * with a scale of 200
-- ******************************
BEGIN TRANSACTION;
--Testcase 1:
INSERT INTO num_exp_add VALUES (0,0,'0');
--Testcase 2:
INSERT INTO num_exp_sub VALUES (0,0,'0');
--Testcase 3:
INSERT INTO num_exp_mul VALUES (0,0,'0');
--Testcase 4:
INSERT INTO num_exp_div VALUES (0,0,'NaN');
--Testcase 5:
INSERT INTO num_exp_add VALUES (0,1,'0');
--Testcase 6:
INSERT INTO num_exp_sub VALUES (0,1,'0');
--Testcase 7:
INSERT INTO num_exp_mul VALUES (0,1,'0');
--Testcase 8:
INSERT INTO num_exp_div VALUES (0,1,'NaN');
--Testcase 9:
INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047');
--Testcase 10:
INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047');
--Testcase 11:
INSERT INTO num_exp_mul VALUES (0,2,'0');
--Testcase 12:
INSERT INTO num_exp_div VALUES (0,2,'0');
--Testcase 13:
INSERT INTO num_exp_add VALUES (0,3,'4.31');
--Testcase 14:
INSERT INTO num_exp_sub VALUES (0,3,'-4.31');
--Testcase 15:
INSERT INTO num_exp_mul VALUES (0,3,'0');
--Testcase 16:
INSERT INTO num_exp_div VALUES (0,3,'0');
--Testcase 17:
INSERT INTO num_exp_add VALUES (0,4,'7799461.4119');
--Testcase 18:
INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119');
--Testcase 19:
INSERT INTO num_exp_mul VALUES (0,4,'0');
--Testcase 20:
INSERT INTO num_exp_div VALUES (0,4,'0');
--Testcase 21:
INSERT INTO num_exp_add VALUES (0,5,'16397.038491');
--Testcase 22:
INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491');
--Testcase 23:
INSERT INTO num_exp_mul VALUES (0,5,'0');
--Testcase 24:
INSERT INTO num_exp_div VALUES (0,5,'0');
--Testcase 25:
INSERT INTO num_exp_add VALUES (0,6,'93901.57763026');
--Testcase 26:
INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026');
--Testcase 27:
INSERT INTO num_exp_mul VALUES (0,6,'0');
--Testcase 28:
INSERT INTO num_exp_div VALUES (0,6,'0');
--Testcase 29:
INSERT INTO num_exp_add VALUES (0,7,'-83028485');
--Testcase 30:
INSERT INTO num_exp_sub VALUES (0,7,'83028485');
--Testcase 31:
INSERT INTO num_exp_mul VALUES (0,7,'0');
--Testcase 32:
INSERT INTO num_exp_div VALUES (0,7,'0');
--Testcase 33:
INSERT INTO num_exp_add VALUES (0,8,'74881');
--Testcase 34:
INSERT INTO num_exp_sub VALUES (0,8,'-74881');
--Testcase 35:
INSERT INTO num_exp_mul VALUES (0,8,'0');
--Testcase 36:
INSERT INTO num_exp_div VALUES (0,8,'0');
--Testcase 37:
INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420');
--Testcase 38:
INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420');
--Testcase 39:
INSERT INTO num_exp_mul VALUES (0,9,'0');
--Testcase 40:
INSERT INTO num_exp_div VALUES (0,9,'0');
--Testcase 41:
INSERT INTO num_exp_add VALUES (1,0,'0');
--Testcase 42:
INSERT INTO num_exp_sub VALUES (1,0,'0');
--Testcase 43:
INSERT INTO num_exp_mul VALUES (1,0,'0');
--Testcase 44:
INSERT INTO num_exp_div VALUES (1,0,'NaN');
--Testcase 45:
INSERT INTO num_exp_add VALUES (1,1,'0');
--Testcase 46:
INSERT INTO num_exp_sub VALUES (1,1,'0');
--Testcase 47:
INSERT INTO num_exp_mul VALUES (1,1,'0');
--Testcase 48:
INSERT INTO num_exp_div VALUES (1,1,'NaN');
--Testcase 49:
INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047');
--Testcase 50:
INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047');
--Testcase 51:
INSERT INTO num_exp_mul VALUES (1,2,'0');
--Testcase 52:
INSERT INTO num_exp_div VALUES (1,2,'0');
--Testcase 53:
INSERT INTO num_exp_add VALUES (1,3,'4.31');
--Testcase 54:
INSERT INTO num_exp_sub VALUES (1,3,'-4.31');
--Testcase 55:
INSERT INTO num_exp_mul VALUES (1,3,'0');
--Testcase 56:
INSERT INTO num_exp_div VALUES (1,3,'0');
--Testcase 57:
INSERT INTO num_exp_add VALUES (1,4,'7799461.4119');
--Testcase 58:
INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119');
--Testcase 59:
INSERT INTO num_exp_mul VALUES (1,4,'0');
--Testcase 60:
INSERT INTO num_exp_div VALUES (1,4,'0');
--Testcase 61:
INSERT INTO num_exp_add VALUES (1,5,'16397.038491');
--Testcase 62:
INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491');
--Testcase 63:
INSERT INTO num_exp_mul VALUES (1,5,'0');
--Testcase 64:
INSERT INTO num_exp_div VALUES (1,5,'0');
--Testcase 65:
INSERT INTO num_exp_add VALUES (1,6,'93901.57763026');
--Testcase 66:
INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026');
--Testcase 67:
INSERT INTO num_exp_mul VALUES (1,6,'0');
--Testcase 68:
INSERT INTO num_exp_div VALUES (1,6,'0');
--Testcase 69:
INSERT INTO num_exp_add VALUES (1,7,'-83028485');
--Testcase 70:
INSERT INTO num_exp_sub VALUES (1,7,'83028485');
--Testcase 71:
INSERT INTO num_exp_mul VALUES (1,7,'0');
--Testcase 72:
INSERT INTO num_exp_div VALUES (1,7,'0');
--Testcase 73:
INSERT INTO num_exp_add VALUES (1,8,'74881');
--Testcase 74:
INSERT INTO num_exp_sub VALUES (1,8,'-74881');
--Testcase 75:
INSERT INTO num_exp_mul VALUES (1,8,'0');
--Testcase 76:
INSERT INTO num_exp_div VALUES (1,8,'0');
--Testcase 77:
INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420');
--Testcase 78:
INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420');
--Testcase 79:
INSERT INTO num_exp_mul VALUES (1,9,'0');
--Testcase 80:
INSERT INTO num_exp_div VALUES (1,9,'0');
--Testcase 81:
INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047');
--Testcase 82:
INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047');
--Testcase 83:
INSERT INTO num_exp_mul VALUES (2,0,'0');
--Testcase 84:
INSERT INTO num_exp_div VALUES (2,0,'NaN');
--Testcase 85:
INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047');
--Testcase 86:
INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047');
--Testcase 87:
INSERT INTO num_exp_mul VALUES (2,1,'0');
--Testcase 88:
INSERT INTO num_exp_div VALUES (2,1,'NaN');
--Testcase 89:
INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094');
--Testcase 90:
INSERT INTO num_exp_sub VALUES (2,2,'0');
--Testcase 91:
INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209');
--Testcase 92:
INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000');
--Testcase 93:
INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047');
--Testcase 94:
INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047');
--Testcase 95:
INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257');
--Testcase 96:
INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266');
--Testcase 97:
INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047');
--Testcase 98:
INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047');
--Testcase 99:
INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593');
--Testcase 100:
INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685');
--Testcase 101:
INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047');
--Testcase 102:
INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047');
--Testcase 103:
INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077');
--Testcase 104:
INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429');
--Testcase 105:
INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787');
--Testcase 106:
INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307');
--Testcase 107:
INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222');
--Testcase 108:
INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940');
--Testcase 109:
INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047');
--Testcase 110:
INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953');
--Testcase 111:
INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795');
--Testcase 112:
INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518');
--Testcase 113:
INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047');
--Testcase 114:
INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047');
--Testcase 115:
INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407');
--Testcase 116:
INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476');
--Testcase 117:
INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467');
--Testcase 118:
INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627');
--Testcase 119:
INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740');
--Testcase 120:
INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811');
--Testcase 121:
INSERT INTO num_exp_add VALUES (3,0,'4.31');
--Testcase 122:
INSERT INTO num_exp_sub VALUES (3,0,'4.31');
--Testcase 123:
INSERT INTO num_exp_mul VALUES (3,0,'0');
--Testcase 124:
INSERT INTO num_exp_div VALUES (3,0,'NaN');
--Testcase 125:
INSERT INTO num_exp_add VALUES (3,1,'4.31');
--Testcase 126:
INSERT INTO num_exp_sub VALUES (3,1,'4.31');
--Testcase 127:
INSERT INTO num_exp_mul VALUES (3,1,'0');
--Testcase 128:
INSERT INTO num_exp_div VALUES (3,1,'NaN');
--Testcase 129:
INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047');
--Testcase 130:
INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047');
--Testcase 131:
INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257');
--Testcase 132:
INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352');
--Testcase 133:
INSERT INTO num_exp_add VALUES (3,3,'8.62');
--Testcase 134:
INSERT INTO num_exp_sub VALUES (3,3,'0');
--Testcase 135:
INSERT INTO num_exp_mul VALUES (3,3,'18.5761');
--Testcase 136:
INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000');
--Testcase 137:
INSERT INTO num_exp_add VALUES (3,4,'7799465.7219');
--Testcase 138:
INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019');
--Testcase 139:
INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289');
--Testcase 140:
INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552');
--Testcase 141:
INSERT INTO num_exp_add VALUES (3,5,'16401.348491');
--Testcase 142:
INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491');
--Testcase 143:
INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621');
--Testcase 144:
INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504');
--Testcase 145:
INSERT INTO num_exp_add VALUES (3,6,'93905.88763026');
--Testcase 146:
INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026');
--Testcase 147:
INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206');
--Testcase 148:
INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595');
--Testcase 149:
INSERT INTO num_exp_add VALUES (3,7,'-83028480.69');
--Testcase 150:
INSERT INTO num_exp_sub VALUES (3,7,'83028489.31');
--Testcase 151:
INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35');
--Testcase 152:
INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240');
--Testcase 153:
INSERT INTO num_exp_add VALUES (3,8,'74885.31');
--Testcase 154:
INSERT INTO num_exp_sub VALUES (3,8,'-74876.69');
--Testcase 155:
INSERT INTO num_exp_mul VALUES (3,8,'322737.11');
--Testcase 156:
INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553');
--Testcase 157:
INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420');
--Testcase 158:
INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420');
--Testcase 159:
INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020');
--Testcase 160:
INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854');
--Testcase 161:
INSERT INTO num_exp_add VALUES (4,0,'7799461.4119');
--Testcase 162:
INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119');
--Testcase 163:
INSERT INTO num_exp_mul VALUES (4,0,'0');
--Testcase 164:
INSERT INTO num_exp_div VALUES (4,0,'NaN');
--Testcase 165:
INSERT INTO num_exp_add VALUES (4,1,'7799461.4119');
--Testcase 166:
INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119');
--Testcase 167:
INSERT INTO num_exp_mul VALUES (4,1,'0');
--Testcase 168:
INSERT INTO num_exp_div VALUES (4,1,'NaN');
--Testcase 169:
INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047');
--Testcase 170:
INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047');
--Testcase 171:
INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593');
--Testcase 172:
INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385');
--Testcase 173:
INSERT INTO num_exp_add VALUES (4,3,'7799465.7219');
--Testcase 174:
INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019');
--Testcase 175:
INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289');
--Testcase 176:
INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883');
--Testcase 177:
INSERT INTO num_exp_add VALUES (4,4,'15598922.8238');
--Testcase 178:
INSERT INTO num_exp_sub VALUES (4,4,'0');
--Testcase 179:
INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161');
--Testcase 180:
INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000');
--Testcase 181:
INSERT INTO num_exp_add VALUES (4,5,'7815858.450391');
--Testcase 182:
INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409');
--Testcase 183:
INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429');
--Testcase 184:
INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061');
--Testcase 185:
INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026');
--Testcase 186:
INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974');
--Testcase 187:
INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094');
--Testcase 188:
INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606');
--Testcase 189:
INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881');
--Testcase 190:
INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119');
--Testcase 191:
INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715');
--Testcase 192:
INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637');
--Testcase 193:
INSERT INTO num_exp_add VALUES (4,8,'7874342.4119');
--Testcase 194:
INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119');
--Testcase 195:
INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839');
--Testcase 196:
INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143');
--Testcase 197:
INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420');
--Testcase 198:
INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420');
--Testcase 199:
INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980');
--Testcase 200:
INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409');
--Testcase 201:
INSERT INTO num_exp_add VALUES (5,0,'16397.038491');
--Testcase 202:
INSERT INTO num_exp_sub VALUES (5,0,'16397.038491');
--Testcase 203:
INSERT INTO num_exp_mul VALUES (5,0,'0');
--Testcase 204:
INSERT INTO num_exp_div VALUES (5,0,'NaN');
--Testcase 205:
INSERT INTO num_exp_add VALUES (5,1,'16397.038491');
--Testcase 206:
INSERT INTO num_exp_sub VALUES (5,1,'16397.038491');
--Testcase 207:
INSERT INTO num_exp_mul VALUES (5,1,'0');
--Testcase 208:
INSERT INTO num_exp_div VALUES (5,1,'NaN');
--Testcase 209:
INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047');
--Testcase 210:
INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047');
--Testcase 211:
INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077');
--Testcase 212:
INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446');
--Testcase 213:
INSERT INTO num_exp_add VALUES (5,3,'16401.348491');
--Testcase 214:
INSERT INTO num_exp_sub VALUES (5,3,'16392.728491');
--Testcase 215:
INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621');
--Testcase 216:
INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584');
--Testcase 217:
INSERT INTO num_exp_add VALUES (5,4,'7815858.450391');
--Testcase 218:
INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409');
--Testcase 219:
INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429');
--Testcase 220:
INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192');
--Testcase 221:
INSERT INTO num_exp_add VALUES (5,5,'32794.076982');
--Testcase 222:
INSERT INTO num_exp_sub VALUES (5,5,'0');
--Testcase 223:
INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081');
--Testcase 224:
INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000');
--Testcase 225:
INSERT INTO num_exp_add VALUES (5,6,'110298.61612126');
--Testcase 226:
INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926');
--Testcase 227:
INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766');
--Testcase 228:
INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689');
--Testcase 229:
INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509');
--Testcase 230:
INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491');
--Testcase 231:
INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135');
--Testcase 232:
INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710');
--Testcase 233:
INSERT INTO num_exp_add VALUES (5,8,'91278.038491');
--Testcase 234:
INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509');
--Testcase 235:
INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571');
--Testcase 236:
INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228');
--Testcase 237:
INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420');
--Testcase 238:
INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420');
--Testcase 239:
INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220');
--Testcase 240:
INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427');
--Testcase 241:
INSERT INTO num_exp_add VALUES (6,0,'93901.57763026');
--Testcase 242:
INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026');
--Testcase 243:
INSERT INTO num_exp_mul VALUES (6,0,'0');
--Testcase 244:
INSERT INTO num_exp_div VALUES (6,0,'NaN');
--Testcase 245:
INSERT INTO num_exp_add VALUES (6,1,'93901.57763026');
--Testcase 246:
INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026');
--Testcase 247:
INSERT INTO num_exp_mul VALUES (6,1,'0');
--Testcase 248:
INSERT INTO num_exp_div VALUES (6,1,'NaN');
--Testcase 249:
INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787');
--Testcase 250:
INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307');
--Testcase 251:
INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222');
--Testcase 252:
INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823');
--Testcase 253:
INSERT INTO num_exp_add VALUES (6,3,'93905.88763026');
--Testcase 254:
INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026');
--Testcase 255:
INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206');
--Testcase 256:
INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907');
--Testcase 257:
INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026');
--Testcase 258:
INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974');
--Testcase 259:
INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094');
--Testcase 260:
INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469');
--Testcase 261:
INSERT INTO num_exp_add VALUES (6,5,'110298.61612126');
--Testcase 262:
INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926');
--Testcase 263:
INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766');
--Testcase 264:
INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679');
--Testcase 265:
INSERT INTO num_exp_add VALUES (6,6,'187803.15526052');
--Testcase 266:
INSERT INTO num_exp_sub VALUES (6,6,'0');
--Testcase 267:
INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676');
--Testcase 268:
INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000');
--Testcase 269:
INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974');
--Testcase 270:
INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026');
--Testcase 271:
INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610');
--Testcase 272:
INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980');
--Testcase 273:
INSERT INTO num_exp_add VALUES (6,8,'168782.57763026');
--Testcase 274:
INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026');
--Testcase 275:
INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906');
--Testcase 276:
INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184');
--Testcase 277:
INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160');
--Testcase 278:
INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680');
--Testcase 279:
INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920');
--Testcase 280:
INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789');
--Testcase 281:
INSERT INTO num_exp_add VALUES (7,0,'-83028485');
--Testcase 282:
INSERT INTO num_exp_sub VALUES (7,0,'-83028485');
--Testcase 283:
INSERT INTO num_exp_mul VALUES (7,0,'0');
--Testcase 284:
INSERT INTO num_exp_div VALUES (7,0,'NaN');
--Testcase 285:
INSERT INTO num_exp_add VALUES (7,1,'-83028485');
--Testcase 286:
INSERT INTO num_exp_sub VALUES (7,1,'-83028485');
--Testcase 287:
INSERT INTO num_exp_mul VALUES (7,1,'0');
--Testcase 288:
INSERT INTO num_exp_div VALUES (7,1,'NaN');
--Testcase 289:
INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047');
--Testcase 290:
INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953');
--Testcase 291:
INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795');
--Testcase 292:
INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700');
--Testcase 293:
INSERT INTO num_exp_add VALUES (7,3,'-83028480.69');
--Testcase 294:
INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31');
--Testcase 295:
INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35');
--Testcase 296:
INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974');
--Testcase 297:
INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881');
--Testcase 298:
INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119');
--Testcase 299:
INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715');
--Testcase 300:
INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686');
--Testcase 301:
INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509');
--Testcase 302:
INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491');
--Testcase 303:
INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135');
--Testcase 304:
INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574');
--Testcase 305:
INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974');
--Testcase 306:
INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026');
--Testcase 307:
INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610');
--Testcase 308:
INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294');
--Testcase 309:
INSERT INTO num_exp_add VALUES (7,7,'-166056970');
--Testcase 310:
INSERT INTO num_exp_sub VALUES (7,7,'0');
--Testcase 311:
INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225');
--Testcase 312:
INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000');
--Testcase 313:
INSERT INTO num_exp_add VALUES (7,8,'-82953604');
--Testcase 314:
INSERT INTO num_exp_sub VALUES (7,8,'-83103366');
--Testcase 315:
INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285');
--Testcase 316:
INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118');
--Testcase 317:
INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420');
--Testcase 318:
INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580');
--Testcase 319:
INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700');
--Testcase 320:
INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382');
--Testcase 321:
INSERT INTO num_exp_add VALUES (8,0,'74881');
--Testcase 322:
INSERT INTO num_exp_sub VALUES (8,0,'74881');
--Testcase 323:
INSERT INTO num_exp_mul VALUES (8,0,'0');
--Testcase 324:
INSERT INTO num_exp_div VALUES (8,0,'NaN');
--Testcase 325:
INSERT INTO num_exp_add VALUES (8,1,'74881');
--Testcase 326:
INSERT INTO num_exp_sub VALUES (8,1,'74881');
--Testcase 327:
INSERT INTO num_exp_mul VALUES (8,1,'0');
--Testcase 328:
INSERT INTO num_exp_div VALUES (8,1,'NaN');
--Testcase 329:
INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047');
--Testcase 330:
INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047');
--Testcase 331:
INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407');
--Testcase 332:
INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615');
--Testcase 333:
INSERT INTO num_exp_add VALUES (8,3,'74885.31');
--Testcase 334:
INSERT INTO num_exp_sub VALUES (8,3,'74876.69');
--Testcase 335:
INSERT INTO num_exp_mul VALUES (8,3,'322737.11');
--Testcase 336:
INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410');
--Testcase 337:
INSERT INTO num_exp_add VALUES (8,4,'7874342.4119');
--Testcase 338:
INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119');
--Testcase 339:
INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839');
--Testcase 340:
INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956');
--Testcase 341:
INSERT INTO num_exp_add VALUES (8,5,'91278.038491');
--Testcase 342:
INSERT INTO num_exp_sub VALUES (8,5,'58483.961509');
--Testcase 343:
INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571');
--Testcase 344:
INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456');
--Testcase 345:
INSERT INTO num_exp_add VALUES (8,6,'168782.57763026');
--Testcase 346:
INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026');
--Testcase 347:
INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906');
--Testcase 348:
INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424');
--Testcase 349:
INSERT INTO num_exp_add VALUES (8,7,'-82953604');
--Testcase 350:
INSERT INTO num_exp_sub VALUES (8,7,'83103366');
--Testcase 351:
INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285');
--Testcase 352:
INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172');
--Testcase 353:
INSERT INTO num_exp_add VALUES (8,8,'149762');
--Testcase 354:
INSERT INTO num_exp_sub VALUES (8,8,'0');
--Testcase 355:
INSERT INTO num_exp_mul VALUES (8,8,'5607164161');
--Testcase 356:
INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000');
--Testcase 357:
INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420');
--Testcase 358:
INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420');
--Testcase 359:
INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020');
--Testcase 360:
INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735');
--Testcase 361:
INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420');
--Testcase 362:
INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420');
--Testcase 363:
INSERT INTO num_exp_mul VALUES (9,0,'0');
--Testcase 364:
INSERT INTO num_exp_div VALUES (9,0,'NaN');
--Testcase 365:
INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420');
--Testcase 366:
INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420');
--Testcase 367:
INSERT INTO num_exp_mul VALUES (9,1,'0');
--Testcase 368:
INSERT INTO num_exp_div VALUES (9,1,'NaN');
--Testcase 369:
INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467');
--Testcase 370:
INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627');
--Testcase 371:
INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740');
--Testcase 372:
INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526');
--Testcase 373:
INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420');
--Testcase 374:
INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420');
--Testcase 375:
INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020');
--Testcase 376:
INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677');
--Testcase 377:
INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420');
--Testcase 378:
INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420');
--Testcase 379:
INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980');
--Testcase 380:
INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484');
--Testcase 381:
INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420');
--Testcase 382:
INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420');
--Testcase 383:
INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220');
--Testcase 384:
INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807');
--Testcase 385:
INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160');
--Testcase 386:
INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680');
--Testcase 387:
INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920');
--Testcase 388:
INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280');
--Testcase 389:
INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420');
--Testcase 390:
INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580');
--Testcase 391:
INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700');
--Testcase 392:
INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689');
--Testcase 393:
INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420');
--Testcase 394:
INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420');
--Testcase 395:
INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020');
--Testcase 396:
INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748');
--Testcase 397:
INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840');
--Testcase 398:
INSERT INTO num_exp_sub VALUES (9,9,'0');
--Testcase 399:
INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400');
--Testcase 400:
INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 401:
INSERT INTO num_exp_sqrt VALUES (0,'0');
--Testcase 402:
INSERT INTO num_exp_sqrt VALUES (1,'0');
--Testcase 403:
INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505');
--Testcase 404:
INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396');
--Testcase 405:
INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923');
--Testcase 406:
INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473');
--Testcase 407:
INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406');
--Testcase 408:
INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230');
--Testcase 409:
INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542');
--Testcase 410:
INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 411:
INSERT INTO num_exp_ln VALUES (0,'NaN');
--Testcase 412:
INSERT INTO num_exp_ln VALUES (1,'NaN');
--Testcase 413:
INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514');
--Testcase 414:
INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971');
--Testcase 415:
INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464');
--Testcase 416:
INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038');
--Testcase 417:
INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127');
--Testcase 418:
INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991');
--Testcase 419:
INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668');
--Testcase 420:
INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 421:
INSERT INTO num_exp_log10 VALUES (0,'NaN');
--Testcase 422:
INSERT INTO num_exp_log10 VALUES (1,'NaN');
--Testcase 423:
INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459');
--Testcase 424:
INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075');
--Testcase 425:
INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345');
--Testcase 426:
INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626');
--Testcase 427:
INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671');
--Testcase 428:
INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914');
--Testcase 429:
INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138');
--Testcase 430:
INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 431:
INSERT INTO num_exp_power_10_ln VALUES (0,'NaN');
--Testcase 432:
INSERT INTO num_exp_power_10_ln VALUES (1,'NaN');
--Testcase 433:
INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184');
--Testcase 434:
INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393');
--Testcase 435:
INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636');
--Testcase 436:
INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098');
--Testcase 437:
INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067');
--Testcase 438:
INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627');
--Testcase 439:
INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952');
--Testcase 440:
INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 441:
INSERT INTO num_data VALUES (0, '0');
--Testcase 442:
INSERT INTO num_data VALUES (1, '0');
--Testcase 443:
INSERT INTO num_data VALUES (2, '-34338492.215397047');
--Testcase 444:
INSERT INTO num_data VALUES (3, '4.31');
--Testcase 445:
INSERT INTO num_data VALUES (4, '7799461.4119');
--Testcase 446:
INSERT INTO num_data VALUES (5, '16397.038491');
--Testcase 447:
INSERT INTO num_data VALUES (6, '93901.57763026');
--Testcase 448:
INSERT INTO num_data VALUES (7, '-83028485');
--Testcase 449:
INSERT INTO num_data VALUES (8, '74881');
--Testcase 450:
INSERT INTO num_data VALUES (9, '-24926804.045047420');
COMMIT TRANSACTION;
-- ******************************
-- * Create indices for faster checks
-- ******************************
-- Skip these setting, creating foreign table with primary key already covered.
--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
-- ******************************
--Testcase 451:
DELETE FROM num_result;
--Testcase 452:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val
FROM num_data t1, num_data t2;
--Testcase 453:
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;
--Testcase 454:
DELETE FROM num_result;
--Testcase 455:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10)
FROM num_data t1, num_data t2;
--Testcase 456:
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
-- ******************************
--Testcase 457:
DELETE FROM num_result;
--Testcase 458:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val
FROM num_data t1, num_data t2;
--Testcase 459:
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;
--Testcase 460:
DELETE FROM num_result;
--Testcase 461:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40)
FROM num_data t1, num_data t2;
--Testcase 462:
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
-- ******************************
--Testcase 463:
DELETE FROM num_result;
--Testcase 464:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val
FROM num_data t1, num_data t2;
--Testcase 465:
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;
--Testcase 466:
DELETE FROM num_result;
--Testcase 467:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30)
FROM num_data t1, num_data t2;
--Testcase 468:
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
-- ******************************
--Testcase 469:
DELETE FROM num_result;
--Testcase 470:
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';
--Testcase 471:
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;
--Testcase 472:
DELETE FROM num_result;
--Testcase 473:
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';
--Testcase 474:
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
-- ******************************
--Testcase 475:
DELETE FROM num_result;
--Testcase 476:
INSERT INTO num_result SELECT id, 0, SQRT(ABS(val))
FROM num_data;
--Testcase 477:
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
-- ******************************
--Testcase 478:
DELETE FROM num_result;
--Testcase 479:
INSERT INTO num_result SELECT id, 0, LN(ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 480:
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
-- ******************************
--Testcase 481:
DELETE FROM num_result;
--Testcase 482:
INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 483:
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
-- ******************************
--Testcase 484:
DELETE FROM num_result;
--Testcase 485:
INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
FROM num_data
WHERE val != '0.0';
--Testcase 486:
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.
-- ******************************
--Testcase 1451:
CREATE FOREIGN TABLE v (id int4 OPTIONS (key 'true'), x numeric, val float8) SERVER sqlite_svr;
BEGIN;
--Testcase 1452:
DELETE FROM v;
--Testcase 1453:
INSERT INTO v(x) VALUES ('0'::float8),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan');
--Testcase 1454:
SELECT x1, x2,
x1::numeric + x2::numeric AS sum,
x1::numeric - x2::numeric AS diff,
x1::numeric * x2::numeric AS prod
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1455:
SELECT x1, x2,
x1::numeric / x2::numeric AS quot,
x1::numeric % x2::numeric AS mod,
div(x1::numeric, x2::numeric) AS div
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x2 != 0;
ROLLBACK;
BEGIN;
--Testcase 1286:
DELETE FROM v;
--Testcase 1287:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1288:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1289:
DELETE FROM v;
--Testcase 1290:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1291:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1292:
DELETE FROM v;
--Testcase 1293:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1294:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1295:
DELETE FROM v;
--Testcase 1296:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1297:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1298:
DELETE FROM v;
--Testcase 1299:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1300:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1301:
DELETE FROM v;
--Testcase 1302:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1303:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1304:
DELETE FROM v;
--Testcase 1305:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1306:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1307:
DELETE FROM v;
--Testcase 1308:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1309:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1310:
DELETE FROM v;
--Testcase 1311:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1312:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1313:
DELETE FROM v;
--Testcase 1314:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1315:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1316:
DELETE FROM v;
--Testcase 1317:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1318:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1319:
DELETE FROM v;
--Testcase 1320:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1321:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1456:
DELETE FROM v;
--Testcase 1457:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1458:
SELECT x, -x as minusx, abs(x::numeric), floor(x::numeric), ceil(x::numeric), sign(x::numeric), numeric_inc(x::numeric) as inc
FROM v;
ROLLBACK;
BEGIN;
--Testcase 1459:
DELETE FROM v;
--Testcase 1460:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1461:
SELECT x, round(x::numeric), round(x::numeric,1) as round1, trunc(x::numeric), trunc(x::numeric,1) as trunc1
FROM v;
ROLLBACK;
-- the large values fall into the numeric abbreviation code's maximal classes
BEGIN;
--Testcase 1462:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),
('inf'),('-inf'),('nan'),
('inf'),('-inf'),('nan');
--Testcase 1463:
SELECT substring(x::text, 1, 32) FROM v ORDER BY x;
ROLLBACK;
--Testcase 1464:
DELETE FROM v;
--Testcase 1465:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('4.2'),('inf'),('nan');
--Testcase 1466:
SELECT x, sqrt(x) FROM v;
--Testcase 1333:
DELETE FROM v;
--Testcase 1334:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1335:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1336:
DELETE FROM v;
--Testcase 1337:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1338:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1467:
DELETE FROM v;
--Testcase 1468:
INSERT INTO v(x) VALUES ('1'::numeric),('4.2'),('inf'),('nan');
--Testcase 1469:
SELECT x,
log(x::numeric),
log10(x::numeric),
ln(x::numeric)
FROM v;
--Testcase 1342:
DELETE FROM v;
--Testcase 1343:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1344:
SELECT ln(x::numeric) FROM v;
--Testcase 1345:
DELETE FROM v;
--Testcase 1346:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1347:
SELECT ln(x::numeric) FROM v;
--Testcase 1348:
DELETE FROM v;
--Testcase 1349:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1350:
SELECT ln(x::numeric) FROM v;
--Testcase 1470:
DELETE FROM v;
--Testcase 1471:
INSERT INTO v(x) VALUES ('2'::numeric),('4.2'),('inf'),('nan');
--Testcase 1472:
SELECT x1, x2,
log(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1354:
DELETE FROM v;
--Testcase 1355:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1356:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1357:
DELETE FROM v;
--Testcase 1358:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1359:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1360:
DELETE FROM v;
--Testcase 1361:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1362:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1363:
DELETE FROM v;
--Testcase 1364:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1365:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1366:
DELETE FROM v;
--Testcase 1367:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1368:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1369:
DELETE FROM v;
--Testcase 1370:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1371:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1372:
DELETE FROM v;
--Testcase 1373:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1374:
SELECT log(x::numeric, 'inf') FROM v;
--Testcase 1473:
DELETE FROM v;
--Testcase 1474:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('2'),('4.2'),('inf'),('nan');
--Testcase 1475:
SELECT x1, x2,
power(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x1 != 0 OR x2 >= 0;
--Testcase 1378:
DELETE FROM v;
--Testcase 1379:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1380:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1381:
DELETE FROM v;
--Testcase 1382:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1383:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1384:
DELETE FROM v;
--Testcase 1385:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1386:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1387:
DELETE FROM v;
--Testcase 1388:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1389:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1390:
DELETE FROM v;
--Testcase 1391:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1392:
SELECT power(x::numeric, '3.3') FROM v;
--Testcase 1393:
DELETE FROM v;
--Testcase 1394:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1395:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1396:
DELETE FROM v;
--Testcase 1397:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1398:
SELECT power(x::numeric, '-1.5') FROM v;
--Testcase 1399:
DELETE FROM v;
--Testcase 1400:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1401:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1402:
DELETE FROM v;
--Testcase 1403:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1404:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1405:
DELETE FROM v;
--Testcase 1406:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1407:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1408:
DELETE FROM v;
--Testcase 1409:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1410:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1411:
DELETE FROM v;
--Testcase 1412:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1413:
SELECT power(x::numeric, '2') FROM v;
--Testcase 1414:
DELETE FROM v;
--Testcase 1415:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1416:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1417:
DELETE FROM v;
--Testcase 1418:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1419:
SELECT power(x::numeric, '4.5') FROM v;
--Testcase 1420:
DELETE FROM v;
--Testcase 1421:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1422:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1423:
DELETE FROM v;
--Testcase 1424:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1425:
SELECT power(x::numeric, '-3') FROM v;
--Testcase 1426:
DELETE FROM v;
--Testcase 1427:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1428:
SELECT power(x::numeric, '0') FROM v;
--Testcase 1429:
DELETE FROM v;
--Testcase 1430:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1431:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1432:
DELETE FROM v;
--Testcase 1433:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1434:
SELECT power(x::numeric, '-inf') FROM v;
-- ******************************
-- * miscellaneous checks for things that have been broken in the past...
-- ******************************
-- numeric AVG used to fail on some platforms
--Testcase 487:
SELECT AVG(val) FROM num_data;
--Testcase 1137:
SELECT MAX(val) FROM num_data;
--Testcase 1138:
SELECT MIN(val) FROM num_data;
--Testcase 488:
SELECT STDDEV(val) FROM num_data;
--Testcase 489:
SELECT VARIANCE(val) FROM num_data;
-- Check for appropriate rounding and overflow
--Testcase 579:
CREATE FOREIGN TABLE fract_only (id int, val numeric(4,4)) SERVER sqlite_svr;
--Testcase 490:
INSERT INTO fract_only VALUES (1, '0.0');
--Testcase 491:
INSERT INTO fract_only VALUES (2, '0.1');
--Testcase 492:
INSERT INTO fract_only VALUES (3, '1.0'); -- should fail
--Testcase 493:
INSERT INTO fract_only VALUES (4, '-0.9999');
--Testcase 494:
INSERT INTO fract_only VALUES (5, '0.99994');
--Testcase 495:
INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail
--Testcase 496:
INSERT INTO fract_only VALUES (7, '0.00001');
--Testcase 497:
INSERT INTO fract_only VALUES (8, '0.00017');
--Testcase 1139:
INSERT INTO fract_only VALUES (9, 'NaN');
--Testcase 1140:
INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail
--Testcase 1141:
INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail
--Testcase 498:
SELECT * FROM fract_only;
--Testcase 580:
DROP FOREIGN TABLE fract_only;
-- Check conversion to integers
-- SQLite promises to preserve the first 15 significant decimal digits of the floating point value.
-- However, it makes no guarantees about the accuracy of computations on floating point values, as no such guarantees are possible.
-- A floating-point value as written in an SQL statement may not be the same as the value represented internally.
-- Actual result is different from expected result.
--Testcase 1485:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 1486:
DELETE FROM num_tmp;
--Testcase 1487:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.5);
--Testcase 1488:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1489:
DELETE FROM num_tmp;
--Testcase 1490:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.4);
--Testcase 1491:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1492:
DELETE FROM num_tmp;
--Testcase 1493:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.4);
--Testcase 1494:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1495:
DELETE FROM num_tmp;
--Testcase 1496:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.5);
--Testcase 1497:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1498:
DELETE FROM num_tmp;
--Testcase 1499:
INSERT INTO num_tmp(n1) VALUES (-2147483648.5);
--Testcase 1500:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1501:
DELETE FROM num_tmp;
--Testcase 1502:
INSERT INTO num_tmp(n1) VALUES (-2147483648.4);
--Testcase 1503:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1504:
DELETE FROM num_tmp;
--Testcase 1505:
INSERT INTO num_tmp(n1) VALUES (2147483647.4);
--Testcase 1506:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1507:
DELETE FROM num_tmp;
--Testcase 1508:
INSERT INTO num_tmp(n1) VALUES (2147483647.5);
--Testcase 1509:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1510:
DELETE FROM num_tmp;
--Testcase 1511:
INSERT INTO num_tmp(n1) VALUES (-32768.5);
--Testcase 1512:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1513:
DELETE FROM num_tmp;
--Testcase 1514:
INSERT INTO num_tmp(n1) VALUES (-32768.4);
--Testcase 1515:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1516:
DELETE FROM num_tmp;
--Testcase 1517:
INSERT INTO num_tmp(n1) VALUES (32767.4);
--Testcase 1518:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1519:
DELETE FROM num_tmp;
--Testcase 1520:
INSERT INTO num_tmp(n1) VALUES (32767.5);
--Testcase 1521:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1555:
DELETE FROM num_tmp;
--Testcase 1555:
DROP FOREIGN TABLE num_tmp;
-- Check inf/nan conversion behavior
--Testcase 581:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 582:
DELETE FROM FLOAT8_TMP;
--Testcase 583:
INSERT INTO FLOAT8_TMP VALUES ('NaN');
--Testcase 584:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 585:
DELETE FROM FLOAT8_TMP;
--Testcase 586:
INSERT INTO FLOAT8_TMP VALUES ('Infinity');
--Testcase 587:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 588:
DELETE FROM FLOAT8_TMP;
--Testcase 589:
INSERT INTO FLOAT8_TMP VALUES ('-Infinity');
--Testcase 590:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 1142:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, f2 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1143:
DELETE FROM NUMERIC_TMP;
--Testcase 1144:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1145:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1146:
DELETE FROM NUMERIC_TMP;
--Testcase 1147:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1148:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1149:
DELETE FROM NUMERIC_TMP;
--Testcase 1150:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1151:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 591:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 592:
DELETE FROM FLOAT4_TMP;
--Testcase 593:
INSERT INTO FLOAT4_TMP VALUES ('NaN');
--Testcase 594:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 595:
DELETE FROM FLOAT4_TMP;
--Testcase 596:
INSERT INTO FLOAT4_TMP VALUES ('Infinity');
--Testcase 597:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 598:
DELETE FROM FLOAT4_TMP;
--Testcase 599:
INSERT INTO FLOAT4_TMP VALUES ('-Infinity');
--Testcase 600:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 1152:
DELETE FROM NUMERIC_TMP;
--Testcase 1153:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1154:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1155:
DELETE FROM NUMERIC_TMP;
--Testcase 1156:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1157:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1158:
DELETE FROM NUMERIC_TMP;
--Testcase 1159:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1160:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1161:
DELETE FROM NUMERIC_TMP;
--Testcase 1162:
INSERT INTO NUMERIC_TMP VALUES ('42'::int2);
--Testcase 1163:
SELECT f1::numeric FROM NUMERIC_TMP;
--Testcase 1164:
DELETE FROM NUMERIC_TMP;
--Testcase 1165:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1166:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1167:
DELETE FROM NUMERIC_TMP;
--Testcase 1168:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1169:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1170:
DELETE FROM NUMERIC_TMP;
--Testcase 1171:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1172:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1173:
DELETE FROM NUMERIC_TMP;
--Testcase 1174:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1175:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1176:
DELETE FROM NUMERIC_TMP;
--Testcase 1177:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1178:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1179:
DELETE FROM NUMERIC_TMP;
--Testcase 1180:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1181:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1182:
DELETE FROM NUMERIC_TMP;
--Testcase 1183:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1184:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1185:
DELETE FROM NUMERIC_TMP;
--Testcase 1186:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1187:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1188:
DELETE FROM NUMERIC_TMP;
--Testcase 1189:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1190:
SELECT f1::int8 FROM NUMERIC_TMP;
-- Simple check that ceil(), floor(), and round() work correctly
--Testcase 601:
CREATE FOREIGN TABLE ceil_floor_round (a numeric OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 499:
INSERT INTO ceil_floor_round VALUES ('-5.5');
--Testcase 500:
INSERT INTO ceil_floor_round VALUES ('-5.499999');
--Testcase 501:
INSERT INTO ceil_floor_round VALUES ('9.5');
--Testcase 502:
INSERT INTO ceil_floor_round VALUES ('9.4999999');
--Testcase 503:
INSERT INTO ceil_floor_round VALUES ('0.0');
--Testcase 504:
INSERT INTO ceil_floor_round VALUES ('0.0000001');
--Testcase 505:
INSERT INTO ceil_floor_round VALUES ('-0.000001');
--Testcase 506:
SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round ORDER BY a;
-- Check rounding, it should round ties away from zero.
--Testcase 602:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 603:
DELETE FROM INT4_TMP;
--Testcase 604:
INSERT INTO INT4_TMP SELECT a FROM generate_series(-5,5) a;
--Testcase 605:
SELECT f1 as pow,
round((-2.5 * 10 ^ f1)::numeric, -f1),
round((-1.5 * 10 ^ f1)::numeric, -f1),
round((-0.5 * 10 ^ f1)::numeric, -f1),
round((0.5 * 10 ^ f1)::numeric, -f1),
round((1.5 * 10 ^ f1)::numeric, -f1),
round((2.5 * 10 ^ f1)::numeric, -f1)
FROM INT4_TMP;
-- Testing for width_bucket(). For convenience, we test both the
-- numeric and float8 versions of the function in this file.
-- errors
--Testcase 606:
CREATE FOREIGN TABLE width_bucket_tbl (
id1 numeric,
id2 numeric,
id3 numeric,
id4 int,
id int OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 607:
DELETE FROM width_bucket_tbl;
--Testcase 608:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 609:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 610:
DELETE FROM width_bucket_tbl;
--Testcase 611:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 612:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 613:
DELETE FROM width_bucket_tbl;
--Testcase 614:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 615:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 616:
DELETE FROM width_bucket_tbl;
--Testcase 617:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 618:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 619:
DELETE FROM width_bucket_tbl;
--Testcase 620:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 621:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 622:
DELETE FROM width_bucket_tbl;
--Testcase 623:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 624:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 625:
DELETE FROM width_bucket_tbl;
--Testcase 626:
INSERT INTO width_bucket_tbl VALUES ('NaN'::numeric, 3.0, 4.0, 888);
--Testcase 627:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 628:
DELETE FROM width_bucket_tbl;
--Testcase 629:
INSERT INTO width_bucket_tbl VALUES (0, 'NaN'::numeric, 4.0, 888);
--Testcase 630:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 1191:
DELETE FROM width_bucket_tbl;
--Testcase 1192:
INSERT INTO width_bucket_tbl VALUES (2.0, 3.0, '-inf'::numeric, 888);
--Testcase 1193:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 1194:
DELETE FROM width_bucket_tbl;
--Testcase 1195:
INSERT INTO width_bucket_tbl VALUES (0, '-inf'::numeric, 4.0 , 888);
--Testcase 1196:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
-- normal operation
--Testcase 631:
CREATE FOREIGN TABLE width_bucket_test (
operand_num numeric OPTIONS (key 'true'),
operand_f8 float8
) SERVER sqlite_svr;
--COPY width_bucket_test (operand_num) FROM stdin;
--Testcase 507:
INSERT INTO width_bucket_test (operand_num) 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);
--Testcase 508:
UPDATE width_bucket_test SET operand_f8 = operand_num::float8;
--Testcase 509:
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
--Testcase 1197:
DELETE FROM width_bucket_tbl;
--Testcase 1198:
INSERT INTO width_bucket_tbl VALUES (0.0, 'Infinity'::numeric , 5, 10);
--Testcase 1199:
SELECT width_bucket(id1::numeric, 'Infinity'::numeric, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 1200:
DELETE FROM width_bucket_tbl;
--Testcase 1201:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, '-Infinity'::numeric, 20);
--Testcase 1202:
SELECT width_bucket(id1::numeric, id2, '-Infinity'::numeric, id4) FROM width_bucket_tbl; -- error
--Testcase 1203:
DELETE FROM width_bucket_tbl;
--Testcase 1204:
INSERT INTO width_bucket_tbl VALUES ('Infinity'::numeric, 1, 10, 10), ('-Infinity'::numeric, 1, 10, 10);
--Testcase 1205:
SELECT width_bucket(id1::numeric, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 510:
DELETE FROM width_bucket_tbl;
-- postgres does not support insert 'Infinity' and '-Infinity' as numeric.
--Testcase 632:
INSERT INTO width_bucket_tbl VALUES (0.0, 0.0, 5, 10);
--Testcase 633:
SELECT width_bucket(id1::float8, 'Infinity'::float8, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 511:
DELETE FROM width_bucket_tbl;
--Testcase 634:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, 0.0, 20);
--Testcase 635:
SELECT width_bucket(id1::float8, id2, 'Infinity'::float8, id4) FROM width_bucket_tbl; -- error
--Testcase 512:
DELETE FROM width_bucket_tbl;
--Testcase 636:
INSERT INTO width_bucket_tbl VALUES (0.0, 1, 10, 10);
--Testcase 637:
SELECT width_bucket('Infinity'::float8, id2, id3, id4), width_bucket('-Infinity'::float8, id2, id3, id4) FROM width_bucket_tbl;
-- Simple test for roundoff error when results should be exact
--Testcase 1445:
DELETE FROM width_bucket_tbl;
--Testcase 1446:
INSERT INTO width_bucket_tbl SELECT x, 10, 100, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1447:
SELECT id1, width_bucket(id1::float8, id2, id3, id4) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
--Testcase 1448:
DELETE FROM width_bucket_tbl;
--Testcase 1449:
INSERT INTO width_bucket_tbl SELECT x, 100, 10, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1450:
SELECT id1, width_bucket(id1::float8, 100, 10, 9) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
--Testcase 638:
DROP FOREIGN TABLE width_bucket_test;
-- TO_CHAR()
--
--Testcase 513:
SELECT to_char(val, '9G999G999G999G999G999')
FROM num_data;
--Testcase 514:
SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999')
FROM num_data;
--Testcase 515:
SELECT to_char(val, '9999999999999999.999999999999999PR')
FROM num_data;
--Testcase 516:
SELECT to_char(val, '9999999999999999.999999999999999S')
FROM num_data;
--Testcase 517:
SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data;
--Testcase 518:
SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data;
--Testcase 519:
SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data;
--Testcase 520:
SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data;
--Testcase 521:
SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data;
--Testcase 522:
SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data;
--Testcase 523:
SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data;
--Testcase 524:
SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data;
--Testcase 525:
SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data;
--Testcase 526:
SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data;
--Testcase 527:
SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data;
--Testcase 528:
SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data;
--Testcase 529:
SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data;
--Testcase 530:
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;
--Testcase 531:
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;
--Testcase 532:
SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data;
--Testcase 533:
SELECT to_char(val, '999999SG9999999999') FROM num_data;
--Testcase 534:
SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data;
--Testcase 535:
SELECT to_char(val, '9.999EEEE') FROM num_data;
--Testcase 1476:
DELETE FROM v;
--Testcase 1477:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1478:
SELECT x,
to_char(x, '9.999EEEE') as numeric,
to_char(x::float8, '9.999EEEE') as float8,
to_char(x::float4, '9.999EEEE') as float4
FROM v;
--Testcase 1522:
DELETE FROM v;
--Testcase 1523:
INSERT INTO v(x) VALUES (-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0),
(1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071);
--Testcase 1524:
SELECT x,
to_char(('1.2345e'||x)::numeric, '9.999EEEE') as numeric
FROM v;
--Testcase 1479:
DELETE FROM v;
--Testcase 1480:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1481:
SELECT x,
to_char(x, 'MI9999999999.99') as numeric,
to_char(x::float8, 'MI9999999999.99') as float8,
to_char(x::float4, 'MI9999999999.99') as float4
FROM v;
--Testcase 1482:
DELETE FROM v;
--Testcase 1483:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1484:
SELECT x,
to_char(x, 'MI99.99') as numeric,
to_char(x::float8, 'MI99.99') as float8,
to_char(x::float4, 'MI99.99') as float4
FROM v;
--Testcase 536:
DELETE FROM ceil_floor_round;
--Testcase 537:
INSERT INTO ceil_floor_round VALUES ('100'::numeric);
--Testcase 538:
SELECT to_char(a, 'FM999.9') FROM ceil_floor_round;
--Testcase 539:
SELECT to_char(a, 'FM999.') FROM ceil_floor_round;
--Testcase 540:
SELECT to_char(a, 'FM999') FROM ceil_floor_round;
-- Check parsing of literal text in a format string
--Testcase 541:
SELECT to_char(a, 'foo999') FROM ceil_floor_round;
--Testcase 542:
SELECT to_char(a, 'f\oo999') FROM ceil_floor_round;
--Testcase 543:
SELECT to_char(a, 'f\\oo999') FROM ceil_floor_round;
--Testcase 544:
SELECT to_char(a, 'f\"oo999') FROM ceil_floor_round;
--Testcase 545:
SELECT to_char(a, 'f\\"oo999') FROM ceil_floor_round;
--Testcase 546:
SELECT to_char(a, 'f"ool"999') FROM ceil_floor_round;
--Testcase 547:
SELECT to_char(a, 'f"\ool"999') FROM ceil_floor_round;
--Testcase 548:
SELECT to_char(a, 'f"\\ool"999') FROM ceil_floor_round;
--Testcase 549:
SELECT to_char(a, 'f"ool\"999') FROM ceil_floor_round;
--Testcase 550:
SELECT to_char(a, 'f"ool\\"999') FROM ceil_floor_round;
-- TO_NUMBER()
--
--Testcase 639:
create foreign table to_number_tbl (a text, id int options (key 'true')) server sqlite_svr;
--Testcase 1211:
SET lc_numeric = 'C';
--Testcase 640:
DELETE FROM to_number_tbl;
--Testcase 641:
INSERT INTO to_number_tbl VALUES ('-34,338,492');
--Testcase 642:
SELECT to_number(a, '99G999G999') FROM to_number_tbl;
--Testcase 643:
DELETE FROM to_number_tbl;
--Testcase 644:
INSERT INTO to_number_tbl VALUES ('-34,338,492.654,878');
--Testcase 645:
SELECT to_number(a, '99G999G999D999G999') FROM to_number_tbl;
--Testcase 646:
DELETE FROM to_number_tbl;
--Testcase 647:
INSERT INTO to_number_tbl VALUES ('<564646.654564>');
--Testcase 648:
SELECT to_number(a, '999999.999999PR') FROM to_number_tbl;
--Testcase 649:
DELETE FROM to_number_tbl;
--Testcase 650:
INSERT INTO to_number_tbl VALUES ('0.00001-');
--Testcase 651:
SELECT to_number(a, '9.999999S') FROM to_number_tbl;
--Testcase 652:
DELETE FROM to_number_tbl;
--Testcase 653:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 654:
SELECT to_number(a, 'FM9.999999S') FROM to_number_tbl;
--Testcase 655:
DELETE FROM to_number_tbl;
--Testcase 656:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 657:
SELECT to_number(a, 'FM9.999999MI') FROM to_number_tbl;
--Testcase 658:
DELETE FROM to_number_tbl;
--Testcase 659:
INSERT INTO to_number_tbl VALUES ('5 4 4 4 4 8 . 7 8');
--Testcase 660:
SELECT to_number(a, '9 9 9 9 9 9 . 9 9') FROM to_number_tbl;
--Testcase 661:
DELETE FROM to_number_tbl;
--Testcase 662:
INSERT INTO to_number_tbl VALUES ('.01');
--Testcase 663:
SELECT to_number(a, 'FM9.99') FROM to_number_tbl;
--Testcase 664:
DELETE FROM to_number_tbl;
--Testcase 665:
INSERT INTO to_number_tbl VALUES ('.0');
--Testcase 666:
SELECT to_number(a, '99999999.99999999') FROM to_number_tbl;
--Testcase 667:
DELETE FROM to_number_tbl;
--Testcase 668:
INSERT INTO to_number_tbl VALUES ('0');
--Testcase 669:
SELECT to_number(a, '99.99') FROM to_number_tbl;
--Testcase 670:
DELETE FROM to_number_tbl;
--Testcase 671:
INSERT INTO to_number_tbl VALUES ('.-01');
--Testcase 672:
SELECT to_number(a, 'S99.99') FROM to_number_tbl;
--Testcase 673:
DELETE FROM to_number_tbl;
--Testcase 674:
INSERT INTO to_number_tbl VALUES ('.01-');
--Testcase 675:
SELECT to_number(a, '99.99S') FROM to_number_tbl;
--Testcase 676:
DELETE FROM to_number_tbl;
--Testcase 677:
INSERT INTO to_number_tbl VALUES (' . 0 1-');
--Testcase 678:
SELECT to_number(a, ' 9 9 . 9 9 S') FROM to_number_tbl;
--Testcase 679:
DELETE FROM to_number_tbl;
--Testcase 680:
INSERT INTO to_number_tbl VALUES ('34,50');
--Testcase 681:
SELECT to_number(a,'999,99') FROM to_number_tbl;
--Testcase 682:
DELETE FROM to_number_tbl;
--Testcase 683:
INSERT INTO to_number_tbl VALUES ('123,000');
--Testcase 684:
SELECT to_number(a,'999G') FROM to_number_tbl;
--Testcase 685:
DELETE FROM to_number_tbl;
--Testcase 686:
INSERT INTO to_number_tbl VALUES ('123456');
--Testcase 687:
SELECT to_number(a,'999G999') FROM to_number_tbl;
--Testcase 688:
DELETE FROM to_number_tbl;
--Testcase 689:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 690:
SELECT to_number(a,'L9,999.99') FROM to_number_tbl;
--Testcase 691:
DELETE FROM to_number_tbl;
--Testcase 692:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 693:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 694:
DELETE FROM to_number_tbl;
--Testcase 695:
INSERT INTO to_number_tbl VALUES ('$1,234.56');
--Testcase 696:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 697:
DELETE FROM to_number_tbl;
--Testcase 698:
INSERT INTO to_number_tbl VALUES ('1234.56');
--Testcase 699:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 700:
DELETE FROM to_number_tbl;
--Testcase 701:
INSERT INTO to_number_tbl VALUES ('1,234.56');
--Testcase 702:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 703:
DELETE FROM to_number_tbl;
--Testcase 704:
INSERT INTO to_number_tbl VALUES ('42nd');
--Testcase 705:
SELECT to_number(a, '99th') FROM to_number_tbl;
--Testcase 1212:
RESET lc_numeric;
--
-- Input syntax
--
--Testcase 706:
CREATE FOREIGN TABLE num_input_test (n1 numeric) SERVER sqlite_svr;
-- good inputs
--Testcase 551:
INSERT INTO num_input_test(n1) VALUES (' 123');
--Testcase 552:
INSERT INTO num_input_test(n1) VALUES (' 3245874 ');
--Testcase 553:
INSERT INTO num_input_test(n1) VALUES (' -93853');
--Testcase 554:
INSERT INTO num_input_test(n1) VALUES ('555.50');
--Testcase 555:
INSERT INTO num_input_test(n1) VALUES ('-555.50');
--Testcase 556:
INSERT INTO num_input_test(n1) VALUES ('NaN ');
--Testcase 557:
INSERT INTO num_input_test(n1) VALUES (' nan');
--Testcase 1213:
INSERT INTO num_input_test(n1) VALUES (' inf ');
--Testcase 1214:
INSERT INTO num_input_test(n1) VALUES (' +inf ');
--Testcase 1215:
INSERT INTO num_input_test(n1) VALUES (' -inf ');
--Testcase 1216:
INSERT INTO num_input_test(n1) VALUES (' Infinity ');
--Testcase 1217:
INSERT INTO num_input_test(n1) VALUES (' +inFinity ');
--Testcase 1218:
INSERT INTO num_input_test(n1) VALUES (' -INFINITY ');
-- bad inputs
--Testcase 558:
INSERT INTO num_input_test(n1) VALUES (' ');
--Testcase 559:
INSERT INTO num_input_test(n1) VALUES (' 1234 %');
--Testcase 560:
INSERT INTO num_input_test(n1) VALUES ('xyz');
--Testcase 561:
INSERT INTO num_input_test(n1) VALUES ('- 1234');
--Testcase 562:
INSERT INTO num_input_test(n1) VALUES ('5 . 0');
--Testcase 563:
INSERT INTO num_input_test(n1) VALUES ('5. 0 ');
--Testcase 564:
INSERT INTO num_input_test(n1) VALUES ('');
--Testcase 565:
INSERT INTO num_input_test(n1) VALUES (' N aN ');
--Testcase 1219:
INSERT INTO num_input_test(n1) VALUES ('+ infinity');
--Testcase 566:
SELECT * FROM num_input_test;
--
-- Test precision and scale typemods
--
--Testcase 1557:
CREATE FOREIGN TABLE num_typemod_test (
millions numeric(3, -6),
thousands numeric(3, -3),
units numeric(3, 0),
thousandths numeric(3, 3),
millionths numeric(3, 6)
) SERVER sqlite_svr;
--Testcase 1558:
\d num_typemod_test
-- rounding of valid inputs
--Testcase 1559:
INSERT INTO num_typemod_test VALUES (123456, 123, 0.123, 0.000123, 0.000000123);
--Testcase 1560:
INSERT INTO num_typemod_test VALUES (654321, 654, 0.654, 0.000654, 0.000000654);
--Testcase 1561:
INSERT INTO num_typemod_test VALUES (2345678, 2345, 2.345, 0.002345, 0.000002345);
--Testcase 1562:
INSERT INTO num_typemod_test VALUES (7654321, 7654, 7.654, 0.007654, 0.000007654);
--Testcase 1563:
INSERT INTO num_typemod_test VALUES (12345678, 12345, 12.345, 0.012345, 0.000012345);
--Testcase 1564:
INSERT INTO num_typemod_test VALUES (87654321, 87654, 87.654, 0.087654, 0.000087654);
--Testcase 1565:
INSERT INTO num_typemod_test VALUES (123456789, 123456, 123.456, 0.123456, 0.000123456);
--Testcase 1566:
INSERT INTO num_typemod_test VALUES (987654321, 987654, 987.654, 0.987654, 0.000987654);
--Testcase 1567:
INSERT INTO num_typemod_test VALUES ('NaN', 'NaN', 'NaN', 'NaN', 'NaN');
--Testcase 1568:
SELECT scale(millions), * FROM num_typemod_test ORDER BY millions;
-- invalid inputs
--Testcase 1569:
INSERT INTO num_typemod_test (millions) VALUES ('inf');
--Testcase 1570:
INSERT INTO num_typemod_test (millions) VALUES (999500000);
--Testcase 1571:
INSERT INTO num_typemod_test (thousands) VALUES (999500);
--Testcase 1572:
INSERT INTO num_typemod_test (units) VALUES (999.5);
--Testcase 1573:
INSERT INTO num_typemod_test (thousandths) VALUES (0.9995);
--Testcase 1574:
INSERT INTO num_typemod_test (millionths) VALUES (0.0009995);
--
-- Test some corner cases for multiplication
--
--Testcase 707:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 708:
INSERT INTO num_tmp VALUES (4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 709:
SELECT n1 * n2 FROM num_tmp;
--Testcase 710:
DELETE FROM num_tmp;
--Testcase 711:
INSERT INTO num_tmp VALUES (4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 712:
SELECT n1 * n2 FROM num_tmp;
--Testcase 713:
DELETE FROM num_tmp;
--Testcase 714:
INSERT INTO num_tmp VALUES (4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 715:
SELECT n1 * n2 FROM num_tmp;
--Testcase 716:
DELETE FROM num_tmp;
--Testcase 717:
INSERT INTO num_tmp VALUES (4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 718:
SELECT n1 * n2 FROM num_tmp;
--Testcase 1525:
DELETE FROM num_tmp;
--Testcase 1526:
INSERT INTO num_tmp VALUES ((0.1 - 2e-16383), (0.1 - 3e-16383));
--Testcase 1527:
SELECT trim_scale(n1 * n2) FROM num_tmp;
--
-- Test some corner cases for division
--
--Testcase 719:
DELETE FROM num_tmp;
--Testcase 720:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 721:
SELECT n1::numeric / n2 FROM num_tmp;
--Testcase 722:
DELETE FROM num_tmp;
--Testcase 723:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 724:
SELECT div(n1::numeric, n2) FROM num_tmp;
--Testcase 725:
SELECT mod(n1::numeric, n2) FROM num_tmp;
--Testcase 726:
SELECT div(-n1::numeric, n2) FROM num_tmp;
--Testcase 727:
SELECT mod(-n1::numeric, n2) FROM num_tmp;
--Testcase 728:
select div(-n1::numeric,n2)*n2 + mod(-n1::numeric,n2) FROM num_tmp;
--Testcase 729:
DELETE FROM num_tmp;
--Testcase 730:
INSERT INTO num_tmp VALUES (70.0,70);
--Testcase 731:
select mod (n1, n2) FROM num_tmp;
--Testcase 732:
select div (n1, n2) FROM num_tmp;
--Testcase 733:
select n1 / n2 FROM num_tmp;
--Testcase 734:
DELETE FROM num_tmp;
--Testcase 735:
INSERT INTO num_tmp VALUES (12345678901234567890, 123);
--Testcase 736:
select n1 % n2 FROM num_tmp;
--Testcase 737:
select n1 / n2 FROM num_tmp;
--Testcase 738:
select div(n1, n2) FROM num_tmp;
--Testcase 739:
select div(n1, n2) * n2 + n1 % n2 FROM num_tmp;
--
-- Test some corner cases for square root
--
--Testcase 740:
DELETE FROM num_tmp;
--Testcase 741:
INSERT INTO num_tmp VALUES (1.000000000000003::numeric);
--Testcase 742:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 743:
DELETE FROM num_tmp;
--Testcase 744:
INSERT INTO num_tmp VALUES (1.000000000000004::numeric);
--Testcase 745:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 746:
DELETE FROM num_tmp;
--Testcase 747:
INSERT INTO num_tmp VALUES (96627521408608.56340355805::numeric);
--Testcase 748:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 749:
DELETE FROM num_tmp;
--Testcase 750:
INSERT INTO num_tmp VALUES (96627521408608.56340355806::numeric);
--Testcase 751:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 752:
DELETE FROM num_tmp;
--Testcase 753:
INSERT INTO num_tmp VALUES (515549506212297735.073688290367::numeric);
--Testcase 754:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 755:
DELETE FROM num_tmp;
--Testcase 756:
INSERT INTO num_tmp VALUES (515549506212297735.073688290368::numeric);
--Testcase 757:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 758:
DELETE FROM num_tmp;
--Testcase 759:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900306::numeric);
--Testcase 760:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 761:
DELETE FROM num_tmp;
--Testcase 762:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900307::numeric);
--Testcase 763:
SELECT sqrt(n1) FROM num_tmp;
--
-- Test code path for raising to integer powers
--
--Testcase 764:
DELETE FROM num_tmp;
--Testcase 765:
INSERT INTO num_tmp VALUES (10.0, -2147483648);
--Testcase 766:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 767:
DELETE FROM num_tmp;
--Testcase 768:
INSERT INTO num_tmp VALUES (10.0, -2147483647);
--Testcase 769:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 770:
DELETE FROM num_tmp;
--Testcase 771:
INSERT INTO num_tmp VALUES (10.0, 2147483647);
--Testcase 772:
SELECT n1 ^ n2 as overflows FROM num_tmp;
--Testcase 773:
DELETE FROM num_tmp;
--Testcase 774:
INSERT INTO num_tmp VALUES (117743296169.0, -1000000000);
--Testcase 775:
SELECT n1 ^ n2 as overflows FROM num_tmp;
-- cases that used to return inaccurate results
--Testcase 776:
DELETE FROM num_tmp;
--Testcase 777:
INSERT INTO num_tmp VALUES (3.789, 21);
--Testcase 778:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 779:
DELETE FROM num_tmp;
--Testcase 780:
INSERT INTO num_tmp VALUES (3.789, 35);
--Testcase 781:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 782:
DELETE FROM num_tmp;
--Testcase 783:
INSERT INTO num_tmp VALUES (1.2, 345);
--Testcase 784:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 785:
DELETE FROM num_tmp;
--Testcase 786:
INSERT INTO num_tmp VALUES (0.12, (-20));
--Testcase 787:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1220:
DELETE FROM num_tmp;
--Testcase 1221:
INSERT INTO num_tmp VALUES (1.000000000123, (-2147483648));
--Testcase 1222:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1528:
DELETE FROM num_tmp;
--Testcase 1529:
INSERT INTO num_tmp VALUES (0.9999999999, 23300000000000);
--Testcase 1530:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
--Testcase 1575:
DELETE FROM num_tmp;
--Testcase 1576:
INSERT INTO num_tmp VALUES ((1 - 1.500012345678e-1000), 1.45e1003);
--Testcase 1577:
SELECT round(((1 - 1.500012345678e-1000) ^ 1.45e1003) * 1e1000) FROM num_tmp;
-- cases that used to error out
--Testcase 788:
DELETE FROM num_tmp;
--Testcase 789:
INSERT INTO num_tmp VALUES (0.12, (-25));
--Testcase 790:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 791:
DELETE FROM num_tmp;
--Testcase 792:
INSERT INTO num_tmp VALUES (0.5678, (-85));
--Testcase 793:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1531:
DELETE FROM num_tmp;
--Testcase 1532:
INSERT INTO num_tmp VALUES (0.9999999999, 70000000000000);
--Testcase 1533:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
-- negative base to integer powers
--Testcase 1534:
DELETE FROM num_tmp;
--Testcase 1535:
INSERT INTO num_tmp VALUES ((-1.0), 2147483646);
--Testcase 1536:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1537:
DELETE FROM num_tmp;
--Testcase 1538:
INSERT INTO num_tmp VALUES ((-1.0), 2147483647);
--Testcase 1539:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1540:
DELETE FROM num_tmp;
--Testcase 1541:
INSERT INTO num_tmp VALUES ((-1.0), 2147483648);
--Testcase 1542:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1543:
DELETE FROM num_tmp;
--Testcase 1544:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000000);
--Testcase 1545:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1546:
DELETE FROM num_tmp;
--Testcase 1547:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000001);
--Testcase 1548:
SELECT n1 ^ n2 FROM num_tmp;
--
-- Tests for raising to non-integer powers
--
-- special cases
--Testcase 794:
DELETE FROM num_tmp;
--Testcase 795:
INSERT INTO num_tmp VALUES (0.0, 0.0);
--Testcase 796:
select n1 ^ n2 FROM num_tmp;
--Testcase 797:
DELETE FROM num_tmp;
--Testcase 798:
INSERT INTO num_tmp VALUES ((-12.34), 0.0);
--Testcase 799:
select n1 ^ n2 FROM num_tmp;
--Testcase 800:
DELETE FROM num_tmp;
--Testcase 801:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 802:
select n1 ^ n2 FROM num_tmp;
--Testcase 803:
DELETE FROM num_tmp;
--Testcase 804:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 805:
select n1 ^ n2 FROM num_tmp;
-- NaNs
--Testcase 806:
DELETE FROM num_tmp;
--Testcase 807:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 'NaN'::numeric);
--Testcase 808:
select n1 ^ n2 FROM num_tmp;
--Testcase 809:
DELETE FROM num_tmp;
--Testcase 810:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 0);
--Testcase 811:
select n1 ^ n2 FROM num_tmp;
--Testcase 812:
DELETE FROM num_tmp;
--Testcase 813:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 1);
--Testcase 814:
select n1 ^ n2 FROM num_tmp;
--Testcase 815:
DELETE FROM num_tmp;
--Testcase 816:
INSERT INTO num_tmp VALUES (0, 'NaN'::numeric);
--Testcase 817:
select n1 ^ n2 FROM num_tmp;
--Testcase 818:
DELETE FROM num_tmp;
--Testcase 819:
INSERT INTO num_tmp VALUES (1, 'NaN'::numeric);
--Testcase 820:
select n1 ^ n2 FROM num_tmp;
-- invalid inputs
--Testcase 821:
DELETE FROM num_tmp;
--Testcase 822:
INSERT INTO num_tmp VALUES (0.0, (-12.34));
--Testcase 823:
select n1 ^ n2 FROM num_tmp;
--Testcase 824:
DELETE FROM num_tmp;
--Testcase 825:
INSERT INTO num_tmp VALUES ((-12.34), 1.2);
--Testcase 826:
select n1 ^ n2 FROM num_tmp;
-- cases that used to generate inaccurate results
--Testcase 827:
DELETE FROM num_tmp;
--Testcase 828:
INSERT INTO num_tmp VALUES (32.1, 9.8);
--Testcase 829:
select n1 ^ n2 FROM num_tmp;
--Testcase 830:
DELETE FROM num_tmp;
--Testcase 831:
INSERT INTO num_tmp VALUES (32.1, (-9.8));
--Testcase 832:
select n1 ^ n2 FROM num_tmp;
--Testcase 833:
DELETE FROM num_tmp;
--Testcase 834:
INSERT INTO num_tmp VALUES (12.3, 45.6);
--Testcase 835:
select n1 ^ n2 FROM num_tmp;
--Testcase 836:
DELETE FROM num_tmp;
--Testcase 837:
INSERT INTO num_tmp VALUES (12.3, (-45.6));
--Testcase 838:
select n1 ^ n2 FROM num_tmp;
-- big test
--Testcase 839:
DELETE FROM num_tmp;
--Testcase 840:
INSERT INTO num_tmp VALUES (1.234, 5678);
--Testcase 841:
select n1 ^ n2 FROM num_tmp;
--
-- Tests for EXP()
--
-- special cases
--Testcase 842:
DELETE FROM num_tmp;
--Testcase 843:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 844:
select exp(n1) from num_tmp;
--Testcase 845:
DELETE FROM num_tmp;
--Testcase 846:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 847:
select exp(n1) from num_tmp;
--Testcase 848:
DELETE FROM num_tmp;
--Testcase 849:
INSERT INTO num_tmp VALUES (1.0::numeric(71,70));
--Testcase 850:
select exp(n1) from num_tmp;
--Testcase 1223:
DELETE FROM num_tmp;
--Testcase 1224:
INSERT INTO num_tmp VALUES ('nan'::numeric);
--Testcase 1225:
select exp(n1) from num_tmp;
--Testcase 1226:
DELETE FROM num_tmp;
--Testcase 1227:
INSERT INTO num_tmp VALUES ('inf'::numeric);
--Testcase 1228:
select exp(n1) from num_tmp;
--Testcase 1229:
DELETE FROM num_tmp;
--Testcase 1230:
INSERT INTO num_tmp VALUES ('-inf'::numeric);
--Testcase 1231:
select exp(n1) from num_tmp;
--Testcase 1549:
DELETE FROM num_tmp;
--Testcase 1550:
INSERT INTO num_tmp VALUES ('-5000'::numeric);
--Testcase 1551:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
--Testcase 1552:
DELETE FROM num_tmp;
--Testcase 1553:
INSERT INTO num_tmp VALUES ('-10000'::numeric);
--Testcase 1554:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
-- cases that used to generate inaccurate results
--Testcase 851:
DELETE FROM num_tmp;
--Testcase 852:
INSERT INTO num_tmp VALUES (32.999);
--Testcase 853:
select exp(n1) from num_tmp;
--Testcase 854:
DELETE FROM num_tmp;
--Testcase 855:
INSERT INTO num_tmp VALUES (-32.999);
--Testcase 856:
select exp(n1) from num_tmp;
--Testcase 857:
DELETE FROM num_tmp;
--Testcase 858:
INSERT INTO num_tmp VALUES (123.456);
--Testcase 859:
select exp(n1) from num_tmp;
--Testcase 860:
DELETE FROM num_tmp;
--Testcase 861:
INSERT INTO num_tmp VALUES (-123.456);
--Testcase 862:
select exp(n1) from num_tmp;
-- big test
--Testcase 863:
DELETE FROM num_tmp;
--Testcase 864:
INSERT INTO num_tmp VALUES (1234.5678);
--Testcase 865:
select exp(n1) from num_tmp;
--
-- Tests for generate_series
--
--Testcase 866:
DELETE FROM num_tmp;
--Testcase 867:
INSERT INTO num_tmp select * from generate_series(0.0::numeric, 4.0::numeric);
--Testcase 868:
SELECT n1 FROM num_tmp;
--Testcase 869:
DELETE FROM num_tmp;
--Testcase 870:
INSERT INTO num_tmp select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric);
--Testcase 871:
SELECT n1 FROM num_tmp;
--Testcase 872:
DELETE FROM num_tmp;
--Testcase 873:
INSERT INTO num_tmp select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric);
--Testcase 874:
SELECT n1 FROM num_tmp;
-- Trigger errors
--Testcase 875:
DELETE FROM num_tmp;
--Testcase 876:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 0::numeric);
--Testcase 877:
SELECT n1 FROM num_tmp;
--Testcase 878:
DELETE FROM num_tmp;
--Testcase 879:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric);
--Testcase 880:
SELECT n1 FROM num_tmp;
--Testcase 881:
DELETE FROM num_tmp;
--Testcase 882:
INSERT INTO num_tmp select * from generate_series('nan'::numeric, 100::numeric, 10::numeric);
--Testcase 883:
SELECT n1 FROM num_tmp;
--Testcase 884:
DELETE FROM num_tmp;
--Testcase 885:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric);
--Testcase 886:
SELECT n2 FROM num_tmp;
--Testcase 1232:
DELETE FROM num_tmp;
--Testcase 1233:
INSERT INTO num_tmp select * from generate_series('inf'::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1234:
SELECT n2 FROM num_tmp;
--Testcase 1235:
DELETE FROM num_tmp;
--Testcase 1236:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1237:
SELECT n2 FROM num_tmp;
--Testcase 1238:
DELETE FROM num_tmp;
--Testcase 1239:
INSERT INTO num_tmp select * from generate_series(0::numeric, '42'::numeric, '-inf'::numeric);
--Testcase 1240:
SELECT n2 FROM num_tmp;
-- Checks maximum, output is truncated
--Testcase 887:
DELETE FROM num_tmp;
--Testcase 888:
INSERT INTO num_tmp select (i / (10::numeric ^ 131071))::numeric(1,0)
from generate_series(6 * (10::numeric ^ 131071),
9 * (10::numeric ^ 131071),
10::numeric ^ 131071) i;
--Testcase 889:
SELECT n1 FROM num_tmp;
-- Check usage with variables
--Testcase 890:
DELETE FROM num_tmp;
--Testcase 891:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
--Testcase 892:
SELECT n1, n2 FROM num_tmp;
--Testcase 893:
DELETE FROM num_tmp;
--Testcase 894:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
--Testcase 895:
SELECT n1, n2 FROM num_tmp;
--Testcase 896:
DELETE FROM num_tmp;
--Testcase 897:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
--Testcase 898:
SELECT n1, n2 FROM num_tmp;
--
-- Tests for LN()
--
-- Invalid inputs
--Testcase 899:
DELETE FROM num_tmp;
--Testcase 900:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 901:
select ln(n1) from num_tmp;
--Testcase 902:
DELETE FROM num_tmp;
--Testcase 903:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 904:
select ln(n1) from num_tmp;
-- Some random tests
--Testcase 905:
DELETE FROM num_tmp;
--Testcase 906:
INSERT INTO num_tmp VALUES (1.2345678e-28);
--Testcase 907:
select ln(n1) from num_tmp;
--Testcase 908:
DELETE FROM num_tmp;
--Testcase 909:
INSERT INTO num_tmp VALUES (0.0456789);
--Testcase 910:
select ln(n1) from num_tmp;
--Testcase 911:
DELETE FROM num_tmp;
--Testcase 912:
INSERT INTO num_tmp VALUES (0.349873948359354029493948309745709580730482050975);
--Testcase 913:
select ln(n1) from num_tmp;
--Testcase 914:
DELETE FROM num_tmp;
--Testcase 915:
INSERT INTO num_tmp VALUES (0.99949452);
--Testcase 916:
select ln(n1) from num_tmp;
--Testcase 917:
DELETE FROM num_tmp;
--Testcase 918:
INSERT INTO num_tmp VALUES (1.00049687395);
--Testcase 919:
select ln(n1) from num_tmp;
--Testcase 920:
DELETE FROM num_tmp;
--Testcase 921:
INSERT INTO num_tmp VALUES (1234.567890123456789);
--Testcase 922:
select ln(n1) from num_tmp;
--Testcase 923:
DELETE FROM num_tmp;
--Testcase 924:
INSERT INTO num_tmp VALUES (5.80397490724e5);
--Testcase 925:
select ln(n1) from num_tmp;
--Testcase 926:
DELETE FROM num_tmp;
--Testcase 927:
INSERT INTO num_tmp VALUES (9.342536355e34);
--Testcase 928:
select ln(n1) from num_tmp;
--
-- Tests for LOG() (base 10)
--
-- invalid inputs
--Testcase 929:
DELETE FROM num_tmp;
--Testcase 930:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 931:
select log(n1) from num_tmp;
--Testcase 932:
DELETE FROM num_tmp;
--Testcase 933:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 934:
select log(n1) from num_tmp;
-- some random tests
--Testcase 935:
DELETE FROM num_tmp;
--Testcase 936:
INSERT INTO num_tmp VALUES (1.234567e-89);
--Testcase 937:
select log(n1) from num_tmp;
--Testcase 938:
DELETE FROM num_tmp;
--Testcase 939:
INSERT INTO num_tmp VALUES (3.4634998359873254962349856073435545);
--Testcase 940:
select log(n1) from num_tmp;
--Testcase 941:
DELETE FROM num_tmp;
--Testcase 942:
INSERT INTO num_tmp VALUES (9.999999999999999999);
--Testcase 943:
select log(n1) from num_tmp;
--Testcase 944:
DELETE FROM num_tmp;
--Testcase 945:
INSERT INTO num_tmp VALUES (10.00000000000000000);
--Testcase 946:
select log(n1) from num_tmp;
--Testcase 947:
DELETE FROM num_tmp;
--Testcase 948:
INSERT INTO num_tmp VALUES (10.00000000000000001);
--Testcase 949:
select log(n1) from num_tmp;
--Testcase 950:
DELETE FROM num_tmp;
--Testcase 951:
INSERT INTO num_tmp VALUES (590489.45235237);
--Testcase 952:
select log(n1) from num_tmp;
--
-- Tests for LOG() (arbitrary base)
--
-- invalid inputs
--Testcase 953:
DELETE FROM num_tmp;
--Testcase 954:
INSERT INTO num_tmp VALUES (-12.34, 56.78);
--Testcase 955:
select log(n1, n2) from num_tmp;
--Testcase 956:
DELETE FROM num_tmp;
--Testcase 957:
INSERT INTO num_tmp VALUES (-12.34, -56.78);
--Testcase 958:
select log(n1, n2) from num_tmp;
--Testcase 959:
DELETE FROM num_tmp;
--Testcase 960:
INSERT INTO num_tmp VALUES (12.34, -56.78);
--Testcase 961:
select log(n1, n2) from num_tmp;
--Testcase 962:
DELETE FROM num_tmp;
--Testcase 963:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 964:
select log(n1, n2) from num_tmp;
--Testcase 965:
DELETE FROM num_tmp;
--Testcase 966:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 967:
select log(n1, n2) from num_tmp;
--Testcase 968:
DELETE FROM num_tmp;
--Testcase 969:
INSERT INTO num_tmp VALUES (.0, 12.34);
--Testcase 970:
select log(n1, n2) from num_tmp;
-- some random tests
--Testcase 971:
DELETE FROM num_tmp;
--Testcase 972:
INSERT INTO num_tmp VALUES (1.23e-89, 6.4689e45);
--Testcase 973:
select log(n1, n2) from num_tmp;
--Testcase 974:
DELETE FROM num_tmp;
--Testcase 975:
INSERT INTO num_tmp VALUES (0.99923, 4.58934e34);
--Testcase 976:
select log(n1, n2) from num_tmp;
--Testcase 977:
DELETE FROM num_tmp;
--Testcase 978:
INSERT INTO num_tmp VALUES (1.000016, 8.452010e18);
--Testcase 979:
select log(n1, n2) from num_tmp;
--Testcase 980:
DELETE FROM num_tmp;
--Testcase 981:
INSERT INTO num_tmp VALUES (3.1954752e47, 9.4792021e-73);
--Testcase 982:
select log(n1, n2) from num_tmp;
--
-- Tests for scale()
--
--Testcase 983:
DELETE FROM num_tmp;
--Testcase 984:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 985:
select scale(n1) from num_tmp;
--Testcase 1241:
DELETE FROM num_tmp;
--Testcase 1242:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1243:
select scale(n1) from num_tmp;
--Testcase 986:
DELETE FROM num_tmp;
--Testcase 987:
INSERT INTO num_tmp VALUES (NULL::numeric);
--Testcase 988:
select scale(n1) from num_tmp;
--Testcase 989:
DELETE FROM num_tmp;
--Testcase 990:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 991:
select scale(n1) from num_tmp;
--Testcase 992:
DELETE FROM num_tmp;
--Testcase 993:
INSERT INTO num_tmp VALUES (0);
--Testcase 994:
select scale(n1) from num_tmp;
--Testcase 995:
DELETE FROM num_tmp;
--Testcase 996:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 997:
select scale(n1) from num_tmp;
--Testcase 998:
DELETE FROM num_tmp;
--Testcase 999:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1000:
select scale(n1) from num_tmp;
--Testcase 1001:
DELETE FROM num_tmp;
--Testcase 1002:
INSERT INTO num_tmp VALUES (110123.12475871856128);
--Testcase 1003:
select scale(n1) from num_tmp;
--Testcase 1004:
DELETE FROM num_tmp;
--Testcase 1005:
INSERT INTO num_tmp VALUES (-1123.12471856128);
--Testcase 1006:
select scale(n1) from num_tmp;
--Testcase 1007:
DELETE FROM num_tmp;
--Testcase 1008:
INSERT INTO num_tmp VALUES (-13.000000000000000);
--Testcase 1009:
select scale(n1) from num_tmp;
--
-- Tests for min_scale()
--
--Testcase 1010:
DELETE FROM num_tmp;
--Testcase 1011:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1012:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1244:
DELETE FROM num_tmp;
--Testcase 1245:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1246:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1013:
DELETE FROM num_tmp;
--Testcase 1014:
INSERT INTO num_tmp VALUES (0);
--Testcase 1015:
select min_scale(n1) from num_tmp; -- no digits
--Testcase 1016:
DELETE FROM num_tmp;
--Testcase 1017:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1018:
select min_scale(n1) from num_tmp; -- no digits again
--Testcase 1019:
DELETE FROM num_tmp;
--Testcase 1020:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 1021:
select min_scale(n1) from num_tmp; -- no scale
--Testcase 1022:
DELETE FROM num_tmp;
--Testcase 1023:
INSERT INTO num_tmp VALUES (1.1);
--Testcase 1024:
select min_scale(n1) from num_tmp; -- scale 1
--Testcase 1025:
DELETE FROM num_tmp;
--Testcase 1026:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 1027:
select min_scale(n1) from num_tmp; -- scale 2
--Testcase 1028:
DELETE FROM num_tmp;
--Testcase 1029:
INSERT INTO num_tmp VALUES (1.123);
--Testcase 1030:
select min_scale(n1) from num_tmp; -- scale 3
--Testcase 1031:
DELETE FROM num_tmp;
--Testcase 1032:
INSERT INTO num_tmp VALUES (1.1234);
--Testcase 1033:
select min_scale(n1) from num_tmp; -- scale 4, filled digit
--Testcase 1034:
DELETE FROM num_tmp;
--Testcase 1035:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1036:
select min_scale(n1) from num_tmp; -- scale 5, 2 NDIGITS
--Testcase 1037:
DELETE FROM num_tmp;
--Testcase 1038:
INSERT INTO num_tmp VALUES (1.1000);
--Testcase 1039:
select min_scale(n1) from num_tmp; -- 1 pos in NDIGITS
--Testcase 1040:
DELETE FROM num_tmp;
--Testcase 1041:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1042:
select min_scale(n1) from num_tmp; -- very big number
--
-- Tests for trim_scale()
--
--Testcase 1043:
DELETE FROM num_tmp;
--Testcase 1044:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1045:
select trim_scale(n1) from num_tmp;
--Testcase 1247:
DELETE FROM num_tmp;
--Testcase 1248:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1249:
select trim_scale(n1) from num_tmp;
--Testcase 1046:
DELETE FROM num_tmp;
--Testcase 1047:
INSERT INTO num_tmp VALUES (1.120);
--Testcase 1048:
select trim_scale(n1) from num_tmp;
--Testcase 1049:
DELETE FROM num_tmp;
--Testcase 1050:
INSERT INTO num_tmp VALUES (0);
--Testcase 1051:
select trim_scale(n1) from num_tmp;
--Testcase 1052:
DELETE FROM num_tmp;
--Testcase 1053:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1054:
select trim_scale(n1) from num_tmp;
--Testcase 1055:
DELETE FROM num_tmp;
--Testcase 1056:
INSERT INTO num_tmp VALUES (1.1234500);
--Testcase 1057:
select trim_scale(n1) from num_tmp;
--Testcase 1058:
DELETE FROM num_tmp;
--Testcase 1059:
INSERT INTO num_tmp VALUES (110123.12475871856128000);
--Testcase 1060:
select trim_scale(n1) from num_tmp;
--Testcase 1061:
DELETE FROM num_tmp;
--Testcase 1062:
INSERT INTO num_tmp VALUES (-123.124718561280000000);
--Testcase 1063:
select trim_scale(n1) from num_tmp;
--Testcase 1064:
DELETE FROM num_tmp;
--Testcase 1065:
INSERT INTO num_tmp VALUES (-13.00000000000000000000);
--Testcase 1066:
select trim_scale(n1) from num_tmp;
--Testcase 1067:
DELETE FROM num_tmp;
--Testcase 1068:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1069:
select trim_scale(n1) from num_tmp;
--
-- Tests for SUM()
--
-- cases that need carry propagation
--Testcase 1070:
DELETE FROM num_tmp;
--Testcase 1071:
INSERT INTO num_tmp SELECT * FROM generate_series(1, 100000);
--Testcase 1072:
SELECT SUM(9999::numeric) FROM num_tmp;
--Testcase 1073:
SELECT SUM((-9999)::numeric) FROM num_tmp;
--
-- Tests for VARIANCE()
--
--Testcase 1578:
INSERT INTO num_variance VALUES (0);
--Testcase 1579:
INSERT INTO num_variance VALUES (3e-500);
--Testcase 1580:
INSERT INTO num_variance VALUES (-3e-500);
--Testcase 1581:
INSERT INTO num_variance VALUES (4e-500 - 1e-16383);
--Testcase 1582:
INSERT INTO num_variance VALUES (-4e-500 + 1e-16383);
-- variance is just under 12.5e-1000 and so should round down to 12e-1000
--Testcase 1583:
SELECT trim_scale(variance(a) * 1e1000) FROM num_variance;
-- check that parallel execution produces the same result
BEGIN;
-- ALTER TABLE num_variance SET (parallel_workers = 4);
SET LOCAL parallel_setup_cost = 0;
SET LOCAL max_parallel_workers_per_gather = 4;
--Testcase 1584:
SELECT trim_scale(variance(a) * 1e1000) FROM num_variance;
ROLLBACK;
-- case where sum of squares would overflow but variance does not
--Testcase 1585:
DELETE FROM num_variance;
--Testcase 1586:
INSERT INTO num_variance SELECT 9e131071 + x FROM generate_series(1, 5) x;
--Testcase 1587:
SELECT variance(a) FROM num_variance;
-- check that parallel execution produces the same result
BEGIN;
-- ALTER TABLE num_variance SET (parallel_workers = 4);
SET LOCAL parallel_setup_cost = 0;
SET LOCAL max_parallel_workers_per_gather = 4;
--Testcase 1588:
SELECT variance(a) FROM num_variance;
ROLLBACK;
--
-- Tests for GCD()
--
--Testcase 1074:
DELETE FROM num_tmp;
--Testcase 1075:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1076:
SELECT n1 as a, n2 as b, gcd(n1, n2), gcd(n1, -n2), gcd(-n2, n1), gcd(-n2, -n1) FROM num_tmp;
--
-- Tests for LCM()
--
--Testcase 1077:
DELETE FROM num_tmp;
--Testcase 1078:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1079:
SELECT n1 as a, n2 as b, lcm(n1, n2), lcm(n1, -n2), lcm(-n2, n1), lcm(-n2, -n1) FROM num_tmp;
--Testcase 1080:
DELETE FROM num_tmp;
--Testcase 1081:
INSERT INTO num_tmp VALUES (10::numeric, 131068);
--Testcase 1082:
SELECT lcm(9999 * (n1)^n2 + (n1^n2 - 1), 2) FROM num_tmp; -- overflow
--
-- Tests for factorial
--
--Testcase 1250:
DELETE FROM num_tmp;
--Testcase 1251:
INSERT INTO num_tmp VALUES (4);
--Testcase 1252:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1253:
DELETE FROM num_tmp;
--Testcase 1254:
INSERT INTO num_tmp VALUES (15);
--Testcase 1255:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1256:
DELETE FROM num_tmp;
--Testcase 1257:
INSERT INTO num_tmp VALUES (100000);
--Testcase 1258:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1259:
DELETE FROM num_tmp;
--Testcase 1260:
INSERT INTO num_tmp VALUES (0);
--Testcase 1261:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1262:
DELETE FROM num_tmp;
--Testcase 1263:
INSERT INTO num_tmp VALUES (-4);
--Testcase 1264:
SELECT factorial(n1::int4) FROM num_tmp;
--
-- Tests for pg_lsn()
--
--Testcase 1265:
DELETE FROM num_tmp;
--Testcase 1266:
INSERT INTO num_tmp VALUES (23783416::numeric);
--Testcase 1267:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1268:
DELETE FROM num_tmp;
--Testcase 1269:
INSERT INTO num_tmp VALUES (0::numeric);
--Testcase 1270:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1271:
DELETE FROM num_tmp;
--Testcase 1272:
INSERT INTO num_tmp VALUES (18446744073709551615::numeric);
--Testcase 1273:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1274:
DELETE FROM num_tmp;
--Testcase 1275:
INSERT INTO num_tmp VALUES (-1::numeric);
--Testcase 1276:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1277:
DELETE FROM num_tmp;
--Testcase 1278:
INSERT INTO num_tmp VALUES (18446744073709551616::numeric);
--Testcase 1279:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1280:
DELETE FROM num_tmp;
--Testcase 1281:
INSERT INTO num_tmp VALUES ('NaN'::numeric);
--Testcase 1282:
SELECT pg_lsn(n1) FROM num_tmp;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 1083:
DROP SERVER sqlite_svr;
--Testcase 1084:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/out_of_range.sql
================================================
--
-- INT4 + INT2
--
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 01:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 02:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 03:
DELETE FROM INT4_TMP;
--Testcase 04:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 05:
INSERT INTO INT4_TMP VALUES (x'7FFFFFFF'::int8 + 1, 0);
--Testcase 06:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 07:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 08:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 09:
DELETE FROM INT4_TMP;
--Testcase 10:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 11:
INSERT INTO INT4_TMP VALUES (-(x'7FFFFFFF'::int8) - 2, 0);
--Testcase 12:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 13:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 14:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 15:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 16:
CREATE FOREIGN TABLE INT2_TMP(f1 int2, f2 int2, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 17:
DELETE FROM INT2_TMP;
--Testcase 18:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 19:
INSERT INTO INT2_TMP VALUES (x'7FFF'::int8 + 1, 0);
--Testcase 20:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 21:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 22:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 23:
DELETE FROM INT2_TMP;
--Testcase 24:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 25:
INSERT INTO INT2_TMP VALUES (-(x'7FFF'::int8) - 2, 0);
--Testcase 26:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 27:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 28:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 29:
CREATE FOREIGN TABLE INT8_TBL(q1 int8 OPTIONS (key 'true'), q2 int8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 31:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 32:
INSERT INTO INT8_TBL VALUES (-9223372036854775810, 0);
--Testcase 33:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 34:
SELECT * FROM INT8_TBL; -- NO overflow
--Testcase 35:
SELECT q1 FROM INT8_TBL; -- NO overflow
--Testcase 36:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 37:
DELETE FROM INT8_TBL WHERE q1 = -9223372036854775810;
--Testcase 38:
INSERT INTO INT8_TBL VALUES (9223372036854775809, 0);
--Testcase 39:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 40:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 41:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 42:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 43:
DELETE FROM INT8_TBL WHERE q1 = 9223372036854775809;
--Testcase 44:
INSERT INTO INT8_TBL VALUES (10 * -9223372036854775810, 0);
--Testcase 45:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 46:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 47:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 48:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 49:
DELETE FROM INT8_TBL WHERE q1 = 10 * -9223372036854775810;
--Testcase 50:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 003:
DROP SERVER sqlite_svr CASCADE;
--Testcase 004:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/timestamp.sql
================================================
--
-- TIMESTAMP
--
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 3:
CREATE FOREIGN TABLE dates1 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number timestamp without time zone OPTIONS (column_type 'INT'))
SERVER sqlite_svr
OPTIONS (table 'dates');
--Testcase 4:
CREATE FOREIGN TABLE dates2 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number double precision)
SERVER sqlite_svr
OPTIONS (table 'dates');
-- Showing timestamp column from SQLite value as TEXT and as INTEGER/FLOAT has same value
--Testcase 5:
SELECT name,
to_char(date_as_text, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_text,
to_char(date_as_number, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_number
FROM dates1;
--Testcase 6:
SELECT * FROM dates2;
-- Comparing exact values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 7:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 8:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 9:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 10:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
-- Comparing greater values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 11:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 12:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 13:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 14:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 15:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 16:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 17:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 18:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--- Comparing without using to_timestamp
--Testcase 19:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 20:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 21:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 22:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 23:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 24:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 25:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
--Testcase 26:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
-- Comparing greater values without using to_timestamp
--Testcase 27:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 28:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 29:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 30:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 31:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 32:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 33:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 34:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 35:
DROP FOREIGN TABLE dates1;
--Testcase 36:
DROP FOREIGN TABLE dates2;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/types/uuid.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_UUID"( "i" int OPTIONS (key 'true'), "u" uuid) SERVER sqlite_svr OPTIONS (table 'type_UUID');
--Testcase 010:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE text;
--Testcase 011:
INSERT INTO "type_UUID" ("i", "u") VALUES (1, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 012:
INSERT INTO "type_UUID" ("i", "u") VALUES (2, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 013:
INSERT INTO "type_UUID" ("i", "u") VALUES (3, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 014:
INSERT INTO "type_UUID" ("i", "u") VALUES (4, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 015:
INSERT INTO "type_UUID" ("i", "u") VALUES (5, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 016:
INSERT INTO "type_UUID" ("i", "u") VALUES (6, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 017:
INSERT INTO "type_UUID" ("i", "u") VALUES (7, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 018:
INSERT INTO "type_UUID" ("i", "u") VALUES (8, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 019:
INSERT INTO "type_UUID" ("i", "u") VALUES (9, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 020:
INSERT INTO "type_UUID" ("i", "u") VALUES (10, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 021:
INSERT INTO "type_UUID" ("i", "u") VALUES (11, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 022:
INSERT INTO "type_UUID" ("i", "u") VALUES (12, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 023:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 024:
INSERT INTO "type_UUID" ("i", "u") VALUES (13, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 025:
INSERT INTO "type_UUID" ("i", "u") VALUES (14, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 026:
INSERT INTO "type_UUID" ("i", "u") VALUES (15, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 027:
INSERT INTO "type_UUID" ("i", "u") VALUES (16, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 029:
INSERT INTO "type_UUID" ("i", "u") VALUES (17, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 030:
INSERT INTO "type_UUID" ("i", "u") VALUES (18, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 031:
INSERT INTO "type_UUID" ("i", "u") VALUES (19, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 032:
INSERT INTO "type_UUID" ("i", "u") VALUES (20, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 033:
INSERT INTO "type_UUID" ("i", "u") VALUES (21, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 034:
INSERT INTO "type_UUID" ("i", "u") VALUES (22, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 035:
INSERT INTO "type_UUID" ("i", "u") VALUES (23, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 036:
INSERT INTO "type_UUID" ("i", "u") VALUES (24, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 037:
INSERT INTO "type_UUID" ("i", "u") VALUES (25, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 038:
INSERT INTO "type_UUID" ("i", "u") VALUES (26, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 039:
INSERT INTO "type_UUID" ("i", "u") VALUES (27, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 040:
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 041:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 042:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (ADD column_type 'BLOB');
--Testcase 043:
INSERT INTO "type_UUID" ("i", "u") VALUES (29, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 044:
INSERT INTO "type_UUID" ("i", "u") VALUES (30, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 045:
INSERT INTO "type_UUID" ("i", "u") VALUES (31, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 046:
INSERT INTO "type_UUID" ("i", "u") VALUES (32, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 047:
INSERT INTO "type_UUID" ("i", "u") VALUES (33, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 048:
INSERT INTO "type_UUID" ("i", "u") VALUES (34, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 049:
INSERT INTO "type_UUID" ("i", "u") VALUES (35, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 050:
INSERT INTO "type_UUID" ("i", "u") VALUES (36, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 051:
INSERT INTO "type_UUID" ("i", "u") VALUES (37, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 052:
INSERT INTO "type_UUID" ("i", "u") VALUES (38, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 053:
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 054:
INSERT INTO "type_UUID" ("i", "u") VALUES (40, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 056:
CREATE FOREIGN TABLE "type_UUID+"( "i" int OPTIONS (key 'true'), "u" uuid, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_UUID+');
--Testcase 057:
SELECT * FROM "type_UUID+";
--Testcase 058:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 059:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 060:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 061:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 062:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 063:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 064:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 065:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 066:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 067:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 068:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 069:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 071:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 072:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 073:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 074:
SELECT * FROM "type_UUID+";
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11';
--Testcase 076:
SELECT * FROM "type_UUID+";
--Testcase 077:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 077:
SELECT * FROM "type_UUID+";
--Testcase 078:
INSERT INTO "type_UUID" ("i", "u") VALUES (41, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}');
--Testcase 079:
SELECT * FROM "type_UUID+" WHERE "i" = 41;
--Testcase 080:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 081:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 082:
SELECT * FROM "type_UUID+";
--Testcase 083:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}';
--Testcase 085:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 086:
INSERT INTO "type_UUID" ("i", "u") VALUES (42, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11f1', 'hex'));
--Testcase 087:
INSERT INTO "type_UUID" ("i", "u") VALUES (43, decode('b0eebc999c0b4ef8bb6d6bb9bd380a', 'hex'));
--Testcase 088:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 089:
SELECT * FROM "type_UUID+" WHERE "i" = 42;
--Testcase 090:
SELECT * FROM "type_UUID+" WHERE "i" = 43;
--Testcase 091:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 092:
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 093:
INSERT INTO "type_UUID" ("i", "u") VALUES (44, NULL);
--Testcase 094:
SELECT * FROM "type_UUID+";
--Testcase 095:
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 096:
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 100:
CREATE FOREIGN TABLE "type_UUIDpk" (col uuid OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 101:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (ADD column_type 'TEXT');
--Testcase 102:
INSERT INTO "type_UUIDpk" VALUES ('{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 103:
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 104:
SELECT * FROM "type_UUIDpk";
--Testcase 105: ERR - primary key
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 106:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 107: NO ERR, but the same semantics!
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 108:
SELECT * FROM "type_UUIDpk";
--Testcase 109:
DELETE FROM "type_UUIDpk";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/with_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/with_gis_support/postgis.sql
================================================
--Testcase 2:
CREATE EXTENSION sqlite_fdw;
--Testcase 3:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 4:
CREATE EXTENSION IF NOT EXISTS postgis;
--Testcase 5:
CREATE EXTENSION postgis_raster;
--Testcase 6:
CREATE EXTENSION postgis_topology;
-- TEST GIS DATA FROM UNION ASTRONOMIQUE INTERNATIONAL (国際天文学連合): MARS, Olympus mons
--Testcase 11:
CREATE SCHEMA "♂";
--Testcase 12:
CREATE TABLE "♂"."テスト" (
id int4 NULL,
"UAI" varchar(254) NULL,
"⌖" public.geometry(point, 104904) NULL,
geom public.geometry(geometry, 104904) NULL,
"t₀" date NULL,
"class" text NULL,
"URL" varchar(80) NULL
);
--Testcase 13: ETC...
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(991, 'Olympus Mons', 'SRID=104904;POINT (226.19749330952843 18.652758890345698)'::geometry, 'SRID=104904;MULTIPOLYGON (((223.78717231750488 23.3314151763916, 224.22803688049316 23.324007034301758, 224.32436180114746 23.5648136138916, 224.7186985015869 23.593564987182617, 224.79486274719238 23.45737648010254, 225.06530570983887 23.238798141479492, 225.67255210876465 23.437196731567383, 226.2211856842041 23.6611385345459, 226.5472011566162 23.65372657775879, 227.6215763092041 23.435148239135742, 228.19009590148926 23.390283584594727, 228.753023147583 23.24955177307129, 228.90711784362793 23.1943416595459, 229.23219108581543 23.004926681518555, 229.5288143157959 22.75514030456543, 229.87227058410645 22.442903518676758, 230.2469539642334 22.14628028869629, 230.7309169769287 21.927717208862305, 231.30854988098145 21.64670753479004, 231.85495948791504 21.084684371948242, 232.19841957092285 19.88258171081543, 231.88618278503418 18.47752571105957, 231.30854988098145 17.743772506713867, 231.21887397766113 17.218599319458008, 231.17812156677246 16.751802444458008, 230.97346687316895 16.353670120239258, 230.8327350616455 15.947111129760742, 230.62945365905762 15.478002548217773, 230.4574489593506 15.352907180786133, 230.20748329162598 15.29954719543457, 229.99631309509277 15.036508560180664, 229.72586631774902 14.640104293823242, 229.41096305847168 14.377065658569336, 228.98862266540527 14.10291862487793, 228.74040412902832 13.854700088500977, 228.5107135772705 13.83247184753418, 228.31806755065918 13.962137222290039, 227.93990516662598 13.929948806762695, 227.36133766174316 13.883039474487305, 227.04734230041504 13.813947677612305, 226.68895149230957 13.851762771606445, 226.4101276397705 13.839879989624023, 226.06347465515137 13.632848739624023, 225.7766170501709 13.617597579956055, 225.32925987243652 13.481771469116211, 224.76723670959473 13.591054916381836, 224.15838050842285 13.731557846069336, 223.12800407409668 14.106241226196289, 222.39425468444824 14.402864456176758, 221.67611503601074 14.918050765991211, 221.434663772583 15.403280258178711, 221.30129432678223 16.051607131958008, 221.0864200592041 16.410966873168945, 221.09012413024902 16.6591854095459, 221.1975612640381 17.09263801574707, 220.9971103668213 17.32316017150879, 220.75670051574707 17.422361373901367, 220.82338523864746 17.844701766967773, 221.18475532531738 18.073732376098633, 221.3567600250244 18.5584774017334, 221.40367317199707 19.10576820373535, 221.3567600250244 19.90325355529785, 221.42725563049316 20.59361457824707, 221.778959274292 21.40439796447754, 222.34188652038574 22.201879501342773, 223.01658821105957 23.272138595581055, 223.3759479522705 23.668546676635742, 223.3722438812256 23.675954818725586, 223.57600212097168 23.675954818725586, 223.70566749572754 23.542585372924805, 223.78717231750488 23.3314151763916)))'::geometry, '1973-01-01', 'mo', 'http://planetarynames.wr.usgs.gov/Feature/4453');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(248, 'Karzok', 'SRID=104904;POINT (228.262902951161 18.4035270924109)'::geometry, 'SRID=104904;MULTIPOLYGON (((228.269330978394 18.2748584747314, 228.266962051392 18.2748394012451, 228.264589309692 18.2748584747314, 228.26222038269 18.2749156951904, 228.259851455688 18.2750148773193, 228.257482528687 18.2751522064209, 228.255121231079 18.2753276824951, 228.252759933472 18.2755451202393, 228.250402450562 18.2757968902588, 228.248052597046 18.2760906219482, 228.245706558228 18.2764263153076, 228.243368148804 18.2767963409424, 228.241037368774 18.2772083282471, 228.23871421814 18.2776546478271, 228.236398696899 18.2781429290771, 228.234094619751 18.2786655426025, 228.231798171997 18.2792301177979, 228.229513168335 18.2798328399658, 228.227239608765 18.2804698944092, 228.224977493286 18.2811489105225, 228.222726821899 18.2818622589111, 228.220491409302 18.2826137542725, 228.218271255493 18.2833995819092, 228.216066360474 18.2842235565186, 228.213872909546 18.2850856781006, 228.211698532104 18.285982131958, 228.209539413452 18.2869167327881, 228.207399368286 18.2878856658936, 228.205278396606 18.2888889312744, 228.203172683716 18.2899265289307, 228.201089859009 18.2910022735596, 228.199026107788 18.2921085357666, 228.196981430054 18.2932529449463, 228.194959640503 18.2944278717041, 228.192956924438 18.2956371307373, 228.190980911255 18.2968769073486, 228.189023971558 18.2981548309326, 228.187093734741 18.2994594573975, 228.185186386108 18.3007984161377, 228.183305740356 18.3021678924561, 228.181447982788 18.3035678863525, 228.179616928101 18.3050022125244, 228.177812576294 18.3064632415771, 228.176038742065 18.307954788208, 228.174287796021 18.3094730377197, 228.172567367554 18.3110218048096, 228.170873641968 18.3126010894775, 228.16921043396 18.3142032623291, 228.16757774353 18.3158359527588, 228.165975570679 18.3174953460693, 228.164403915405 18.3191814422607, 228.162858963013 18.320894241333, 228.161352157593 18.3226299285889, 228.159872055054 18.3243923187256, 228.158430099487 18.3261775970459, 228.157014846802 18.3279857635498, 228.155637741089 18.3298168182373, 228.154294967651 18.3316707611084, 228.152982711792 18.3335475921631, 228.151708602905 18.3354473114014, 228.150468826294 18.337366104126, 228.149263381958 18.3393039703369, 228.148092269897 18.3412647247314, 228.14695930481 18.343240737915, 228.145864486694 18.3452396392822, 228.144804000854 18.3472537994385, 228.143781661987 18.3492832183838, 228.142793655396 18.3513317108154, 228.141847610474 18.3533954620361, 228.140939712524 18.3554744720459, 228.140066146851 18.3575687408447, 228.139234542847 18.3596782684326, 228.138441085815 18.3617992401123, 228.137685775757 18.3639354705811, 228.136972427368 18.3660831451416, 228.136297225952 18.3682422637939, 228.135660171509 18.3704090118408, 228.135065078735 18.3725872039795, 228.134511947632 18.37477684021, 228.133996963501 18.376974105835, 228.133520126343 18.3791828155518, 228.133085250854 18.3813953399658, 228.132692337036 18.3836154937744, 228.132341384888 18.3858432769775, 228.132028579712 18.3880748748779, 228.131757736206 18.3903102874756, 228.13152885437 18.3925533294678, 228.131341934204 18.39479637146, 228.131196975708 18.3970432281494, 228.131090164185 18.3992938995361, 228.131025314331 18.4015445709229, 228.131002426147 18.4037952423096, 228.131021499634 18.4060459136963, 228.13108253479 18.408296585083, 228.131185531616 18.4105472564697, 228.131326675415 18.4127941131592, 228.131513595581 18.4150371551514, 228.13173866272 18.4172801971436, 228.132005691528 18.4195156097412, 228.132314682007 18.4217510223389, 228.132661819458 18.4239749908447, 228.133054733276 18.4261989593506, 228.13348197937 18.4284114837646, 228.133955001831 18.4306163787842, 228.134466171265 18.4328174591064, 228.135019302368 18.4350070953369, 228.135610580444 18.4371852874756, 228.13624382019 18.4393558502197, 228.136919021606 18.4415149688721, 228.137628555298 18.4436626434326, 228.138380050659 18.4457988739014, 228.13917350769 18.4479236602783, 228.140001296997 18.4500331878662, 228.140871047974 18.452127456665, 228.141775131226 18.4542064666748, 228.142721176147 18.4562740325928, 228.143705368042 18.4583225250244, 228.144723892212 18.460355758667, 228.145784378052 18.4623699188232, 228.146879196167 18.4643688201904, 228.148008346558 18.4663486480713, 228.149175643921 18.4683094024658, 228.150381088257 18.4702472686768, 228.151620864868 18.4721698760986, 228.152894973755 18.4740695953369, 228.154203414917 18.4759464263916, 228.155546188354 18.47780418396, 228.156923294067 18.4796352386475, 228.158334732056 18.4814472198486, 228.159776687622 18.4832363128662, 228.161256790161 18.4849987030029, 228.162763595581 18.4867343902588, 228.164304733276 18.4884471893311, 228.16587638855 18.4901371002197, 228.167478561401 18.4917964935303, 228.169115066528 18.49342918396, 228.170778274536 18.4950351715088, 228.172468185425 18.4966144561768, 228.174192428589 18.4981670379639, 228.175939559937 18.4996891021729, 228.177717208862 18.5011806488037, 228.179521560669 18.5026454925537, 228.181352615356 18.5040760040283, 228.183210372925 18.5054798126221, 228.185094833374 18.5068492889404, 228.187002182007 18.5081920623779, 228.188936233521 18.50950050354, 228.190893173218 18.5107746124268, 228.192869186401 18.5120182037354, 228.194871902466 18.5132274627686, 228.196897506714 18.5144062042236, 228.198942184448 18.5155506134033, 228.201009750366 18.5166568756104, 228.203096389771 18.5177326202393, 228.205202102661 18.5187740325928, 228.207326889038 18.5197811126709, 228.209466934204 18.5207500457764, 228.211629867554 18.5216846466064, 228.213804244995 18.5225811004639, 228.21600151062 18.5234432220459, 228.218210220337 18.5242710113525, 228.220434188843 18.5250568389893, 228.22266960144 18.5258121490479, 228.224924087524 18.5265254974365, 228.227186203003 18.5272045135498, 228.229463577271 18.5278415679932, 228.23175239563 18.5284442901611, 228.234052658081 18.5290088653564, 228.236360549927 18.5295352935791, 228.238679885864 18.5300235748291, 228.241006851196 18.5304698944092, 228.243341445923 18.5308818817139, 228.245683670044 18.5312557220459, 228.248029708862 18.531587600708, 228.250383377075 18.5318813323975, 228.252744674683 18.5321369171143, 228.255109786987 18.5323505401611, 228.257474899292 18.5325298309326, 228.259847640991 18.5326671600342, 228.262216567993 18.5327663421631, 228.26459312439 18.5328235626221, 228.266965866089 18.5328426361084, 228.269342422485 18.5328235626221, 228.271715164185 18.5327625274658, 228.274087905884 18.5326671600342, 228.276456832886 18.5325298309326, 228.278825759888 18.5323505401611, 228.281187057495 18.5321369171143, 228.283548355103 18.5318813323975, 228.285902023315 18.531587600708, 228.288251876831 18.5312519073486, 228.290594100952 18.5308818817139, 228.292928695679 18.5304698944092, 228.295255661011 18.5300197601318, 228.297574996948 18.5295352935791, 228.299882888794 18.5290088653564, 228.302179336548 18.5284442901611, 228.304468154907 18.5278415679932, 228.306745529175 18.5272006988525, 228.309011459351 18.5265254974365, 228.311262130737 18.5258083343506, 228.313501358032 18.5250568389893, 228.315725326538 18.5242671966553, 228.317934036255 18.5234432220459, 228.320127487183 18.5225811004639, 228.322305679321 18.5216808319092, 228.324464797974 18.5207462310791, 228.326608657837 18.5197772979736, 228.328733444214 18.5187702178955, 228.330839157104 18.5177326202393, 228.332925796509 18.5166568756104, 228.334989547729 18.5155467987061, 228.337034225464 18.5144023895264, 228.339059829712 18.5132274627686, 228.341062545776 18.5120143890381, 228.343042373657 18.5107707977295, 228.344995498657 18.5094966888428, 228.346929550171 18.5081882476807, 228.348836898804 18.5068454742432, 228.350721359253 18.5054759979248, 228.352579116821 18.5040721893311, 228.354410171509 18.5026416778564, 228.356214523315 18.5011768341064, 228.357992172241 18.4996852874756, 228.359739303589 18.4981632232666, 228.361463546753 18.4966106414795, 228.363153457642 18.4950313568115, 228.364816665649 18.4934253692627, 228.366449356079 18.491792678833, 228.368055343628 18.4901294708252, 228.369626998901 18.4884433746338, 228.371168136597 18.4867305755615, 228.372674942017 18.4849910736084, 228.374151229858 18.4832286834717, 228.375597000122 18.4814434051514, 228.37700843811 18.4796314239502, 228.378385543823 18.4778003692627, 228.379728317261 18.4759426116943, 228.381036758423 18.4740619659424, 228.38231086731 18.4721660614014, 228.383550643921 18.4702434539795, 228.38475227356 18.4683017730713, 228.385919570923 18.4663410186768, 228.387052536011 18.4643650054932, 228.388147354126 18.462366104126, 228.389204025269 18.4603481292725, 228.390226364136 18.4583187103271, 228.391206741333 18.4562664031982, 228.392152786255 18.4542026519775, 228.393060684204 18.4521198272705, 228.393926620483 18.4500255584717, 228.394758224487 18.4479160308838, 228.395547866821 18.4457950592041, 228.396299362183 18.4436588287354, 228.397012710571 18.4415111541748, 228.39768409729 18.4393520355225, 228.398317337036 18.4371814727783, 228.398908615112 18.4349994659424, 228.399461746216 18.4328098297119, 228.399972915649 18.4306125640869, 228.40044593811 18.4284076690674, 228.400876998901 18.4261913299561, 228.401266098022 18.4239711761475, 228.401613235474 18.4217433929443, 228.401922225952 18.4195117950439, 228.402189254761 18.417272567749, 228.402414321899 18.4150333404541, 228.402597427368 18.4127864837646, 228.402742385864 18.4105396270752, 228.40284538269 18.4082927703857, 228.402902603149 18.406042098999, 228.402921676636 18.403787612915, 228.402898788452 18.4015369415283, 228.402837753296 18.3992862701416, 228.402730941772 18.3970394134521, 228.402585983276 18.3947887420654, 228.402395248413 18.3925457000732, 228.402166366577 18.3903064727783, 228.401895523071 18.3880672454834, 228.401586532593 18.385835647583, 228.401231765747 18.3836116790771, 228.400838851929 18.3813877105713, 228.40040397644 18.3791751861572, 228.399930953979 18.3769702911377, 228.399415969849 18.3747730255127, 228.398859024048 18.3725833892822, 228.398263931274 18.3704051971436, 228.397626876831 18.3682346343994, 228.396951675415 18.3660755157471, 228.396238327026 18.3639316558838, 228.395483016968 18.361795425415, 228.394689559937 18.3596744537354, 228.393857955933 18.3575649261475, 228.392988204956 18.3554706573486, 228.39207649231 18.3533916473389, 228.391130447388 18.3513278961182, 228.390146255493 18.3492794036865, 228.389120101929 18.3472461700439, 228.388063430786 18.3452320098877, 228.386964797974 18.3432369232178, 228.385831832886 18.3412609100342, 228.384660720825 18.3393001556396, 228.383455276489 18.3373622894287, 228.382215499878 18.3354434967041, 228.380941390991 18.3335437774658, 228.379629135132 18.3316669464111, 228.378286361694 18.32981300354, 228.376905441284 18.3279819488525, 228.375494003296 18.3261699676514, 228.374048233032 18.3243846893311, 228.37257194519 18.3226261138916, 228.371061325073 18.3208866119385, 228.369520187378 18.3191776275635, 228.367948532104 18.3174915313721, 228.366346359253 18.3158321380615, 228.364709854126 18.3141994476318, 228.363046646118 18.3125972747803, 228.361356735229 18.3110179901123, 228.359636306763 18.3094692230225, 228.357885360718 18.3079509735107, 228.356107711792 18.3064594268799, 228.354303359985 18.3049983978271, 228.352472305298 18.3035640716553, 228.350618362427 18.3021640777588, 228.348733901978 18.3007946014404, 228.346826553345 18.2994556427002, 228.344896316528 18.2981510162354, 228.342943191528 18.2968769073486, 228.340963363647 18.29563331604, 228.33896446228 18.2944240570068, 228.336938858032 18.293249130249, 228.334897994995 18.2921085357666, 228.332830429077 18.2909984588623, 228.33074760437 18.2899265289307, 228.328645706177 18.2888851165771, 228.3265209198 18.2878818511963, 228.324380874634 18.2869129180908, 228.322221755981 18.285982131958, 228.32004737854 18.2850856781006, 228.31785774231 18.2842235565186, 228.315649032593 18.2833995819092, 228.313428878784 18.2826099395752, 228.311193466187 18.2818584442139, 228.3089427948 18.2811450958252, 228.306684494019 18.2804698944092, 228.304410934448 18.2798290252686, 228.302125930786 18.2792301177979, 228.299829483032 18.2786655426025, 228.297521591187 18.2781391143799, 228.295206069946 18.2776546478271, 228.292882919312 18.2772045135498, 228.290552139282 18.2767963409424, 228.288213729858 18.2764225006104, 228.28586769104 18.2760906219482, 228.283517837524 18.2757968902588, 228.281160354614 18.2755451202393, 228.278802871704 18.2753276824951, 228.276437759399 18.2751522064209, 228.274072647095 18.2750148773193, 228.271703720093 18.2749156951904, 228.269330978394 18.2748584747314)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14144');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(249, 'Pangboche', 'SRID=104904;POINT (226.595873773026 17.2783598670807)'::geometry, 'SRID=104904;MULTIPOLYGON (((226.601442337036 17.1929302215576, 226.599878311157 17.1929187774658, 226.598310470581 17.1929302215576, 226.596746444702 17.1929721832275, 226.595178604126 17.1930370330811, 226.593618392944 17.1931285858154, 226.592054367065 17.1932430267334, 226.590497970581 17.1933879852295, 226.588941574097 17.1935558319092, 226.587385177612 17.193754196167, 226.585836410522 17.1939754486084, 226.58429145813 17.1942195892334, 226.582754135132 17.1944942474365, 226.581216812134 17.1947917938232, 226.57968711853 17.1951160430908, 226.578165054321 17.195463180542, 226.576650619507 17.195837020874, 226.57513999939 17.1962375640869, 226.573637008667 17.1966648101807, 226.572145462036 17.197114944458, 226.570657730103 17.1975879669189, 226.569181442261 17.1980876922607, 226.567712783813 17.1986103057861, 226.566255569458 17.1991596221924, 226.564809799194 17.1997318267822, 226.563371658325 17.2003269195557, 226.561948776245 17.20094871521, 226.56053352356 17.2015933990479, 226.559129714966 17.2022609710693, 226.557741165161 17.2029514312744, 226.556364059448 17.2036647796631, 226.555002212524 17.2044010162354, 226.553651809692 17.2051601409912, 226.552316665649 17.2059421539307, 226.550992965698 17.2067432403564, 226.549688339233 17.2075710296631, 226.54839515686 17.2084178924561, 226.547121047974 17.2092876434326, 226.545862197876 17.2101764678955, 226.544618606567 17.211088180542, 226.543394088745 17.2120189666748, 226.542184829712 17.2129688262939, 226.540990829468 17.2139415740967, 226.539819717407 17.2149333953857, 226.538663864136 17.2159404754639, 226.537527084351 17.2169704437256, 226.536409378052 17.2180194854736, 226.535310745239 17.219087600708, 226.534231185913 17.2201709747314, 226.533174514771 17.2212734222412, 226.532133102417 17.2223949432373, 226.531118392944 17.2235317230225, 226.530118942261 17.2246875762939, 226.529146194458 17.2258586883545, 226.528188705444 17.2270450592041, 226.527257919312 17.2282466888428, 226.526346206665 17.2294635772705, 226.525461196899 17.2306995391846, 226.52459526062 17.2319469451904, 226.523752212524 17.2332057952881, 226.522932052612 17.2344837188721, 226.522138595581 17.2357730865479, 226.521364212036 17.2370738983154, 226.520616531372 17.2383899688721, 226.519891738892 17.2397136688232, 226.519193649292 17.2410526275635, 226.518518447876 17.2424030303955, 226.517869949341 17.2437648773193, 226.517244338989 17.245138168335, 226.516641616821 17.2465190887451, 226.516069412231 17.2479114532471, 226.515520095825 17.2493152618408, 226.514993667603 17.2507228851318, 226.514497756958 17.2521419525146, 226.514024734497 17.253568649292, 226.513578414917 17.2550029754639, 226.513158798218 17.2564449310303, 226.512765884399 17.2578945159912, 226.512399673462 17.2593479156494, 226.512060165405 17.2608089447021, 226.511747360229 17.2622776031494, 226.511461257935 17.2637462615967, 226.511201858521 17.2652225494385, 226.510969161987 17.2667026519775, 226.510766983032 17.2681865692139, 226.510587692261 17.2696743011475, 226.51043510437 17.2711620330811, 226.510313034058 17.2726535797119, 226.510217666626 17.27414894104, 226.510149002075 17.2756404876709, 226.510107040405 17.277135848999, 226.510091781616 17.2786350250244, 226.510103225708 17.2801303863525, 226.510145187378 17.2816257476807, 226.510213851929 17.2831211090088, 226.510305404663 17.2846164703369, 226.510431289673 17.2861080169678, 226.510580062866 17.2875957489014, 226.51075553894 17.289083480835, 226.510957717896 17.2905673980713, 226.511190414429 17.2920475006104, 226.511449813843 17.2935237884521, 226.51173210144 17.2949924468994, 226.512044906616 17.2964611053467, 226.512384414673 17.2979221343994, 226.51275062561 17.2993755340576, 226.513139724731 17.3008251190186, 226.513559341431 17.302267074585, 226.514001846313 17.3037014007568, 226.514474868774 17.3051280975342, 226.514970779419 17.306547164917, 226.515493392944 17.3079586029053, 226.516042709351 17.309362411499, 226.51661491394 17.310754776001, 226.517213821411 17.3121356964111, 226.517839431763 17.3135089874268, 226.518487930298 17.3148708343506, 226.519163131714 17.3162212371826, 226.519861221313 17.3175601959229, 226.520586013794 17.3188877105713, 226.521333694458 17.3202037811279, 226.522104263306 17.3215045928955, 226.522897720337 17.3227939605713, 226.523717880249 17.3240718841553, 226.524557113647 17.3253345489502, 226.525423049927 17.3265819549561, 226.52631187439 17.3278141021729, 226.527219772339 17.3290348052979, 226.528150558472 17.3302364349365, 226.529108047485 17.3314228057861, 226.530080795288 17.3325939178467, 226.531076431274 17.3337497711182, 226.532094955444 17.3348903656006, 226.533132553101 17.3360080718994, 226.53419303894 17.3371143341064, 226.535272598267 17.3381977081299, 226.536371231079 17.3392658233643, 226.537488937378 17.3403148651123, 226.538625717163 17.341344833374, 226.539781570435 17.3423557281494, 226.540952682495 17.3433475494385, 226.542146682739 17.3443202972412, 226.543355941772 17.3452739715576, 226.544580459595 17.3462047576904, 226.545824050903 17.3471164703369, 226.547082901001 17.3480052947998, 226.548360824585 17.3488750457764, 226.549654006958 17.3497219085693, 226.550958633423 17.350549697876, 226.552282333374 17.351354598999, 226.553617477417 17.3521366119385, 226.554967880249 17.3528957366943, 226.55633354187 17.3536319732666, 226.557710647583 17.3543453216553, 226.559099197388 17.3550395965576, 226.560503005981 17.3557071685791, 226.561918258667 17.356351852417, 226.563344955444 17.356969833374, 226.564783096313 17.3575687408447, 226.566232681274 17.3581409454346, 226.56768989563 17.3586902618408, 226.569158554077 17.3592128753662, 226.570634841919 17.359712600708, 226.572122573853 17.3601894378662, 226.573617935181 17.3606395721436, 226.575120925903 17.36106300354, 226.576631546021 17.3614635467529, 226.578149795532 17.361837387085, 226.579675674438 17.3621883392334, 226.581205368042 17.362512588501, 226.58274269104 17.3628101348877, 226.584283828735 17.3630847930908, 226.585828781128 17.3633289337158, 226.587377548218 17.3635501861572, 226.588933944702 17.363748550415, 226.590490341187 17.3639163970947, 226.592050552368 17.3640613555908, 226.593614578247 17.3641757965088, 226.595178604126 17.3642673492432, 226.596746444702 17.3643321990967, 226.598314285278 17.3643741607666, 226.599882125854 17.3643856048584, 226.601449966431 17.3643741607666, 226.603017807007 17.3643321990967, 226.604581832886 17.3642673492432, 226.606145858765 17.3641757965088, 226.607709884644 17.3640613555908, 226.609270095825 17.3639163970947, 226.610830307007 17.3637447357178, 226.612382888794 17.3635501861572, 226.613931655884 17.3633289337158, 226.615480422974 17.3630809783936, 226.617021560669 17.3628101348877, 226.618558883667 17.362512588501, 226.620088577271 17.3621883392334, 226.621610641479 17.361837387085, 226.623128890991 17.3614635467529, 226.624639511108 17.36106300354, 226.626142501831 17.3606395721436, 226.627637863159 17.3601856231689, 226.629125595093 17.359712600708, 226.630601882935 17.3592128753662, 226.632070541382 17.3586902618408, 226.633531570435 17.3581409454346, 226.634977340698 17.3575687408447, 226.636415481567 17.356969833374, 226.637842178345 17.3563480377197, 226.63925743103 17.3557033538818, 226.640661239624 17.3550357818604, 226.642049789429 17.3543453216553, 226.643426895142 17.3536319732666, 226.644792556763 17.3528957366943, 226.646142959595 17.3521327972412, 226.647478103638 17.3513507843018, 226.648801803589 17.3505458831787, 226.650110244751 17.3497219085693, 226.651399612427 17.3488750457764, 226.652677536011 17.3480052947998, 226.653936386108 17.3471126556396, 226.655179977417 17.3462009429932, 226.656408309937 17.3452701568604, 226.65761756897 17.3443202972412, 226.658807754517 17.3433475494385, 226.659982681274 17.3423557281494, 226.661138534546 17.341344833374, 226.662275314331 17.3403148651123, 226.66339302063 17.3392658233643, 226.664487838745 17.3381977081299, 226.665567398071 17.3371105194092, 226.666627883911 17.3360080718994, 226.667665481567 17.3348865509033, 226.668684005737 17.3337459564209, 226.669679641724 17.3325939178467, 226.670656204224 17.3314228057861, 226.67160987854 17.3302326202393, 226.672540664673 17.3290309906006, 226.673448562622 17.3278141021729, 226.674337387085 17.3265781402588, 226.675203323364 17.3253307342529, 226.676042556763 17.324068069458, 226.676862716675 17.3227939605713, 226.677656173706 17.3215007781982, 226.678426742554 17.3201999664307, 226.679174423218 17.318883895874, 226.679899215698 17.3175563812256, 226.680597305298 17.3162174224854, 226.681272506714 17.3148670196533, 226.681921005249 17.3135051727295, 226.682546615601 17.3121318817139, 226.683145523071 17.3107509613037, 226.683717727661 17.3093585968018, 226.684267044067 17.307954788208, 226.684789657593 17.3065433502197, 226.685285568237 17.3051242828369, 226.685754776001 17.3036975860596, 226.686201095581 17.3022632598877, 226.686616897583 17.3008213043213, 226.687009811401 17.2993717193604, 226.687376022339 17.2979183197021, 226.687715530396 17.2964572906494, 226.688024520874 17.2949886322021, 226.688310623169 17.2935199737549, 226.688570022583 17.2920436859131, 226.688798904419 17.290563583374, 226.689004898071 17.2890796661377, 226.689180374146 17.2875919342041, 226.689329147339 17.2861042022705, 226.689451217651 17.2846126556396, 226.689546585083 17.2831172943115, 226.689615249634 17.2816219329834, 226.689653396606 17.2801265716553, 226.689668655396 17.2786312103271, 226.689653396606 17.277135848999, 226.689611434937 17.2756366729736, 226.689542770386 17.2741451263428, 226.689443588257 17.2726497650146, 226.689321517944 17.2711582183838, 226.689168930054 17.2696704864502, 226.688993453979 17.2681827545166, 226.688787460327 17.2666988372803, 226.688554763794 17.2652187347412, 226.68829536438 17.2637424468994, 226.688009262085 17.2622737884521, 226.687696456909 17.2608051300049, 226.687356948853 17.2593441009521, 226.686990737915 17.2578907012939, 226.686597824097 17.256441116333, 226.686178207397 17.2549991607666, 226.685731887817 17.2535648345947, 226.685258865356 17.2521381378174, 226.684762954712 17.2507190704346, 226.684236526489 17.2493114471436, 226.683687210083 17.2479076385498, 226.683115005493 17.2465152740479, 226.682512283325 17.2451343536377, 226.681886672974 17.2437610626221, 226.681238174438 17.2424030303955, 226.680562973022 17.2410526275635, 226.679864883423 17.2397136688232, 226.679140090942 17.2383861541748, 226.678392410278 17.2370700836182, 226.677618026733 17.2357692718506, 226.676824569702 17.2344799041748, 226.67600440979 17.2332057952881, 226.675161361694 17.2319431304932, 226.674295425415 17.2306957244873, 226.673410415649 17.2294635772705, 226.672498703003 17.2282428741455, 226.671564102173 17.2270412445068, 226.670610427856 17.2258548736572, 226.669637680054 17.2246837615967, 226.66863822937 17.2235317230225, 226.6676197052 17.22239112854, 226.666582107544 17.2212734222412, 226.665525436401 17.2201709747314, 226.664445877075 17.2190837860107, 226.663347244263 17.2180194854736, 226.662229537964 17.2169704437256, 226.661092758179 17.2159404754639, 226.659936904907 17.2149295806885, 226.658761978149 17.2139377593994, 226.657571792603 17.2129650115967, 226.656362533569 17.2120151519775, 226.655138015747 17.2110843658447, 226.653894424438 17.2101726531982, 226.652635574341 17.2092838287354, 226.651357650757 17.2084140777588, 226.650068283081 17.2075672149658, 226.648759841919 17.2067432403564, 226.647439956665 17.2059383392334, 226.646104812622 17.2051563262939, 226.64475440979 17.2043972015381, 226.643388748169 17.2036609649658, 226.642011642456 17.2029476165771, 226.640623092651 17.2022571563721, 226.639223098755 17.2015895843506, 226.637807846069 17.2009449005127, 226.636381149292 17.2003269195557, 226.63494682312 17.1997318267822, 226.633497238159 17.1991558074951, 226.632040023804 17.1986103057861, 226.630575180054 17.1980838775635, 226.629095077515 17.1975879669189, 226.627611160278 17.1971111297607, 226.62611579895 17.1966609954834, 226.624616622925 17.1962375640869, 226.623106002808 17.195837020874, 226.621587753296 17.195463180542, 226.620065689087 17.1951160430908, 226.618535995483 17.1947917938232, 226.617002487183 17.1944942474365, 226.615461349487 17.1942195892334, 226.613916397095 17.1939716339111, 226.612367630005 17.1937503814697, 226.610815048218 17.1935558319092, 226.609258651733 17.1933879852295, 226.607698440552 17.1932430267334, 226.60613822937 17.1931285858154, 226.604574203491 17.1930370330811, 226.603010177612 17.1929721832275, 226.601442337036 17.1929302215576)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14145');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1849, 'Hermes Patera', 'SRID=104904;POINT (226.57 18.33)'::geometry, 'SRID=104904;POLYGON ((226.27743530274 18.067016601562, 226.25820922852 18.135681152343, 226.255462646485 18.216705322265124, 226.26507568359813 18.293609619139627, 226.25614929199594 18.331375122069314, 226.26095581055 18.369140624999, 226.28842163086 18.465270996093, 226.35159301758 18.528442382812, 226.44772338867 18.577880859374, 226.48480224609438 18.594360351561626, 226.52462768555 18.6026000976555, 226.57955932617 18.608093261718, 226.68118286133 18.586120605468, 226.70590209961 18.569641113281, 226.74435424805 18.539428710937, 226.78555297852 18.514709472656, 226.83224487305 18.498229980468, 226.86932373046687 18.488616943359126, 226.89404296875 18.4721374511715, 226.90090942383 18.451538085937, 226.90640258789 18.410339355468, 226.91189575195 18.380126953124, 226.92013549805 18.322448730468, 226.90640258789 18.251037597656, 226.87344360352 18.187866210937, 226.82949829102 18.146667480468, 226.79379272461 18.113708496093, 226.77456665039 18.102722167968, 226.72787475586 18.119201660156, 226.68392944336 18.141174316406, 226.63723754883125 18.15490722656175, 226.58779907226562 18.14254760742125, 226.56033325195 18.121948242187, 226.52188110352 18.088989257812, 226.48617553711 18.067016601562, 226.45321655274 18.083496093749, 226.38729858399 18.086242675781, 226.32412719727 18.078002929687, 226.27743530274 18.067016601562))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15690');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1688, 'Olympus Rupes', 'SRID=104904;POINT (226.43548539543502 18.401964175317982)'::geometry, 'SRID=104904;MULTILINESTRING ((227.42951774597168 22.934080123901367, 227.93671226501465 22.65593910217285, 228.34573936462402 22.4268856048584, 228.52571296691895 22.295995712280273, 228.67296028137207 22.099660873413086, 228.96746253967285 22.099660873413086, 229.62190437316895 21.739717483520508, 230.1290988922119 21.477941513061523, 230.35815620422363 21.26524543762207, 230.38258171081543 21.086992263793945, 230.2117748260498 20.55558967590332, 230.71787071228027 19.182798385620117, 230.8653507232666 18.500219345092773, 230.8653507232666 18.058469772338867, 230.8653507232666 17.96030616760254, 230.88171195983887 16.978639602661133, 230.9144344329834 16.635053634643555, 230.73446083068848 16.389638900756836, 230.6690158843994 16.242387771606445, 230.55448722839355 15.980611801147461, 230.45632362365723 15.816999435424805, 230.35815620422363 15.506139755249023, 230.0472927093506 15.457056045532227, 229.83220100402832 15.140348434448242, 229.54010200500488 14.73716926574707, 229.22923851013184 14.442667007446289, 228.86929512023926 14.213613510131836, 228.5420742034912 14.05000114440918, 228.2148494720459 14.148168563842773, 227.8221836090088 14.148168563842773, 227.2168254852295 13.984556198120117, 226.85687828063965 13.968194961547852, 226.49693489074707 14.05000114440918, 226.0879077911377 13.77186393737793, 225.80977058410645 13.755502700805664, 225.55567741394043 13.881429672241211, 225.3911952972412 14.058565139770508, 224.9426326751709 14.73716926574707, 224.76265907287598 14.73716926574707, 224.36999320983887 14.573556900024414, 223.97732734680176 14.802610397338867, 223.29015922546387 15.12983512878418, 222.70116233825684 15.391611099243164, 222.4393825531006 15.40797233581543, 221.93218803405762 15.40797233581543, 221.57224464416504 15.66975212097168, 221.4413547515869 16.09514045715332, 221.3431911468506 16.700498580932617, 221.39227104187012 17.07680320739746, 221.16321754455566 17.404027938842773, 220.89009284973145 17.53165626525879, 220.90144157409668 17.84577751159668, 221.14274787902832 17.76296043395996, 221.52316093444824 17.61672019958496, 221.86674308776855 18.074831008911133, 222.06307792663574 18.614748001098633, 221.8994655609131 18.860166549682617, 221.6376895904541 19.252832412719727, 221.62132835388184 19.59641456604004, 221.7358570098877 20.185415267944336, 221.94854927062988 20.774412155151367, 222.079439163208 21.26524543762207, 222.48846626281738 21.854246139526367, 222.99566078186035 22.508691787719727, 223.43741035461426 22.934080123901367, 223.78099250793457 23.13041114807129, 224.04277229309082 23.064966201782227, 224.3045482635498 22.999521255493164, 224.72993659973145 22.934080123901367, 224.9917163848877 22.88499641418457, 225.2862148284912 22.934080123901367, 225.72796440124512 23.01588249206543, 226.2351589202881 23.146772384643555, 226.61146354675293 23.27766227722168, 227.05321311950684 23.097688674926758, 227.42951774597168 22.934080123901367))'::geometry, '1976-01-01', 'ru', 'http://planetarynames.wr.usgs.gov/Feature/4454');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1847, 'Zeus Patera', 'SRID=104904;POINT (227.07 18.39)'::geometry, 'SRID=104904;POLYGON ((226.50457763673 18.675384521485, 226.51556396485 18.70834350586, 226.55401611329 18.766021728516, 226.6254272461 18.820953369141, 226.71881103516 18.853912353516, 226.82043457032 18.886871337891, 226.91107177735 18.886871337891, 226.99621582032 18.875885009766, 227.03741455079 18.873138427735, 226.99346923829 18.831939697266, 226.97973632813 18.77426147461, 226.99896240235 18.702850341797, 227.06213378907 18.631439208985, 227.15002441407 18.584747314454, 227.23516845704 18.568267822266, 227.30383300781875 18.59024047851625, 227.33404541016 18.628692626954, 227.34503173829 18.658905029297, 227.39721679688 18.587493896485, 227.42742919923 18.494110107422, 227.42193603516 18.408966064454, 227.39996337891 18.315582275391, 227.39172363282 18.227691650391, 227.34228515626 18.123321533204, 227.29559326173 18.018951416016, 227.21319580079 17.942047119141, 227.15551757813 17.903594970704, 227.09783935548 17.876129150391, 227.00170898438 17.845916748047, 226.9330444336 17.840423583985, 226.88635253907 17.840423583985, 226.90832519532 17.876129150391, 226.91381835938 17.925567626954, 226.90283203126 17.972259521485, 226.87536621094 18.021697998047, 226.82318115235 18.062896728516, 226.77923583985 18.098602294922, 226.83691406251 18.156280517579, 226.88360595704 18.233184814454, 226.91107177735 18.315582275391, 226.8890991211 18.40072631836, 226.88085937501 18.474884033204, 226.83142089844 18.507843017579, 226.72430419923 18.546295166016, 226.67761230469 18.584747314454, 226.6254272461 18.614959716797, 226.58972167969 18.617706298829, 226.62817382813 18.645172119141, 226.67761230469 18.650665283204, 226.61993408204 18.661651611329, 226.56500244141 18.64242553711, 226.4935913086 18.653411865235, 226.50457763673 18.675384521485))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15689');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1848, 'Athena Patera', 'SRID=104904;POINT (227.18 18.74)'::geometry, 'SRID=104904;POLYGON ((227.0290374756 18.766021728515, 227.04002380372 18.807220458984, 227.06062316896 18.840179443359, 227.08259582521 18.867645263671, 227.12928771974 18.880004882812, 227.17597961427 18.877258300781, 227.22541809083 18.866271972656, 227.28172302247 18.825073242187, 227.31605529786 18.775634765624, 227.328414917 18.731689453124, 227.33116149903 18.691864013671, 227.30369567872 18.656158447265, 227.2844696045 18.619079589843, 227.23915100099 18.599853515624, 227.18147277833 18.599853515624, 227.10594177247 18.624572753906, 227.05513000489 18.665771484374, 227.02491760255 18.705596923828, 227.0207977295 18.744049072265, 227.0290374756 18.766021728515))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15693');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1850, 'Apollo Patera', 'SRID=104904;POINT (226.45 17.94)'::geometry, 'SRID=104904;POLYGON ((226.28540039064 17.909774780272, 226.27441406252 17.938613891601, 226.26754760744 17.981185913085, 226.27716064455 18.027877807616, 226.30325317385 18.074569702147, 226.35818481447 18.091049194335, 226.40075683596 18.091049194335, 226.46804809572 18.073196411132, 226.52572631838 18.045730590819, 226.56967163088 18.023757934569, 226.63146972658 17.946853637694, 226.63558959963 17.878189086913, 226.62185668947 17.83836364746, 226.61911010744 17.806777954101, 226.59439086916 17.788925170897, 226.52847290041 17.780685424804, 226.45980834963 17.808151245116, 226.40899658205 17.832870483397, 226.37878417971 17.841110229491, 226.33758544924 17.864456176757, 226.30462646486 17.887802124022, 226.28540039064 17.909774780272))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15694');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1851, 'Olympus Paterae', 'SRID=104904;POINT (226.81 18.32)'::geometry, 'SRID=104904;POLYGON ((226.14367675781 18.452911376953, 226.16564941406 18.513336181641, 226.2041015625 18.554534912109, 226.23431396484 18.592987060547, 226.30572509766 18.625946044922, 226.36889648438 18.650665283203, 226.42108154297 18.653411865234, 226.45678710938 18.642425537109, 226.49249267578 18.700103759766, 226.54193115234 18.755035400391, 226.58312988281 18.809967041016, 226.65454101563 18.845672607422, 226.72320556641 18.870391845703, 226.82757568359 18.895111083984, 226.88525390625 18.911590576172, 226.96545410157 18.900604248046, 227.0121459961 18.900604248046, 227.04785156251 18.889617919921, 227.08355712891 18.906097412109, 227.13299560548 18.917083740234, 227.21813964844 18.911590576171, 227.28405761719 18.875885009765, 227.33349609376 18.829193115234, 227.37194824219 18.771514892578, 227.37744140626 18.735809326171, 227.38156127930375 18.711776733397812, 227.3808746337928 18.69255065917931, 227.37469482423 18.675384521484, 227.40216064454 18.620452880859, 227.43237304688 18.571014404296, 227.4515991211 18.496856689453, 227.45709228516 18.441925048828, 227.44885253907 18.38150024414, 227.44061279298 18.323822021484, 227.43237304688 18.277130126953, 227.41589355469 18.202972412109, 227.38018798829 18.120574951171, 227.34448242188 18.05191040039, 227.31701660157 17.999725341796, 227.26757812501 17.950286865234, 227.22088623048 17.911834716796, 227.17419433594 17.870635986328, 227.12475585938 17.848663330078, 227.03686523438 17.821197509765, 226.97918701173 17.801971435546, 226.88580322266 17.815704345703, 226.85009765626 17.790985107421, 226.81439208985 17.769012451171, 226.7484741211 17.741546630859, 226.68530273438 17.733306884765, 226.62762451173 17.738800048828, 226.57543945313 17.736053466796, 226.50128173829 17.72232055664, 226.39416503907 17.758026123046, 226.32550048829 17.78823852539, 226.29803466798 17.823944091796, 226.27056884766 17.843170166015, 226.21289062501 17.89810180664, 226.20465087891 17.966766357421, 226.22937011719 18.035430908203, 226.20465087891 18.084869384765, 226.18267822266 18.13980102539, 226.17169189454 18.18374633789, 226.17993164063 18.20571899414, 226.15795898438 18.252410888671, 226.13873291016 18.318328857421, 226.13049316407 18.389739990234, 226.14367675781 18.452911376953))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15695');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1870, 'Dionysus Patera', 'SRID=104904;POINT (226.77 17.96)'::geometry, 'SRID=104904;POLYGON ((226.53973388672 18.046417236328, 226.564453125 18.082122802735, 226.60015869141 18.11508178711, 226.64410400391 18.134307861328, 226.71826171875 18.117828369141, 226.77868652344 18.09310913086, 226.83361816406 18.043670654297, 226.87756347656 17.988739013672, 226.89129638672 17.936553955078, 226.8720703125 17.870635986328, 226.828125 17.82943725586, 226.7484741211 17.799224853516, 226.68530273438 17.793731689453, 226.64959716797 17.78549194336, 226.61389160156 17.782745361328, 226.63037109375 17.848663330078, 226.63037109375 17.914581298828, 226.62213134766 17.972259521485, 226.58093261719 18.021697998047, 226.53973388672 18.046417236328))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15692');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1871, 'Hera Patera', 'SRID=104904;POINT (226.23 18.45)'::geometry, 'SRID=104904;POLYGON ((226.21000671387 18.244171142578, 226.18116760254063 18.30047607421875, 226.17567443848188 18.347167968749623, 226.17155456543125 18.41445922851525, 226.19902038575 18.489990234375377, 226.24021911621563 18.549041748046875, 226.32124328613438 18.602600097655873, 226.37892150879125 18.616333007812376, 226.44209289551 18.61083984375, 226.396774292 18.582000732422, 226.3610687255875 18.55316162109375, 226.31986999512 18.511962890625, 226.2827911377 18.474884033203, 226.27043151856 18.428192138672, 226.24845886231 18.367767333984, 226.24021911621 18.21533203125, 226.21000671387 18.244171142578))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15691');
-- TEST GIS DATA FROM OPENSTREETMAP: EARTH, Ancienne Sylvie
--Testcase 14:
CREATE TABLE "♁" (
geom public.geometry NOT NULL,
osm_type varchar(16) NOT NULL,
osm_id int8 NOT NULL,
ver int2 NOT NULL,
arr _int8 NULL,
t json NULL
);
--Testcase 15: ETC...
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4596087 59.6907755)'::geometry, 'node', 1621246531, 4, NULL, '{"drain":"disperse"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601391 59.6904673)'::geometry, 'node', 1621246620, 24, NULL, '{"access":"yes","addr:housenumber":"20 литВЕ","addr:street":"Садовая улица","architect":"Ж.-Ф. Тома де Томон","barrier":"gate","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6458/","historic":"yes","locked":"no","name":"Ворота памятника Любезным родителям","ref:okn":"781610399040286","start_date":"1807","tourism":"attraction","wikidata":"Q118122048"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617098 59.6910199)'::geometry, 'node', 1632220259, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617672 59.6909141)'::geometry, 'node', 1632220283, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461757 59.6909696)'::geometry, 'node', 1632220292, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614802 59.6907676)'::geometry, 'node', 1632220315, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615866 59.6907823)'::geometry, 'node', 1632220319, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611444 59.6908848)'::geometry, 'node', 1632220350, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611916 59.6908345)'::geometry, 'node', 1632220355, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.46127 59.6907954)'::geometry, 'node', 1632220358, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611342 59.6909402)'::geometry, 'node', 1632220359, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614212 59.6910868)'::geometry, 'node', 1632220364, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611621 59.6909941)'::geometry, 'node', 1632220366, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616766 59.6908145)'::geometry, 'node', 1632220378, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616314 59.691059)'::geometry, 'node', 1632220590, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613148 59.6910721)'::geometry, 'node', 1632220686, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613385 59.6907988)'::geometry, 'node', 1632497609, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6476/","historic":"yes","historic:start_date":"1794","int_name":"Euterpe","material":"metal","name":"Эвтерпа","name:el":"Εὐτέρπη","name:la":"Euterpē","name:uk":"Евтерпа","name:zh":"欧忒耳佩","note":"Ошибочно подписано «Clio»","ref":"П-61/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614438 59.6907856)'::geometry, 'node', 1632497610, 30, NULL, '{"alt_name:el":"Χλωρίς","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1796","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6475/","historic":"yes","historic:start_date":"1796","int_name":"Flore","material":"metal","name":"Флора","name:el":"Φλόρα","name:en":"Flora","ref":"П-62/1","ref:okn":"781610399040456","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461244 59.690833)'::geometry, 'node', 1632497611, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6470/","historic":"yes","historic:start_date":"1795","int_name":"Melpomene","material":"metal","name":"Мельпомена","name:el":"Μελπομένη","name:en":"Melpomene","name:la":"Melpomenē","name:uk":"Мельпомена","name:zh":"墨爾波墨涅","ref":"П-60/1","ref:okn":"781610399040376","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617227 59.6909514)'::geometry, 'node', 1632497612, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6468/","historic":"yes","historic:start_date":"1793","int_name":"Caliope","material":"metal","name":"Калиопа","name:el":"Καλλιόπη","name:la":"Calliopē","name:uk":"Калліопа","name:zh":"卡利俄佩","ref":"П-65/1","start_date":"1798","tourism":"artwork","wikidata":"Q120979306"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615805 59.6907985)'::geometry, 'node', 1632497613, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6474/","historic":"yes","historic:start_date":"1795","int_name":"Uranie","material":"metal","name":"Урания","name:el":"Οὐρανία","name:la":"Ūrania","ref":"П-63/1","ref:okn":"78161039904044","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616825 59.6908428)'::geometry, 'node', 1632497614, 29, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6469/","historic":"yes","historic:start_date":"1794","material":"metal","name":"Клио","name:el":"Κλειώ","name:la":"Clīō","note":"Подписано «Euterpe»","ref":"П-64/1","ref:okn":"781610399040466","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614541 59.6909278)'::geometry, 'node', 1632497615, 34, NULL, '{"alt_name":"Аполлон Бельведерский","artist_name":"Леохар;модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1782","artwork_type":"statue","description":"Иконография Бельведерского типа. В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6466/","historic":"yes","historic:start_date":"1782","material":"metal","name":"Аполлон","name:en":"Apollo","name:zh":"阿波罗神像","ref":"П-71/1","ref:okn":"781610399040386","start_date":"1817","tourism":"artwork","wikidata":"Q118122062"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616021 59.6910564)'::geometry, 'node', 1632497616, 26, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1780","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","historic":"yes","historic:start_date":"1780","material":"metal","name":"Венера Каллипиги","ref":"П-67/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616651 59.6910293)'::geometry, 'node', 1632497617, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6471/","historic":"yes","historic:start_date":"1793","int_name":"Polymnia","material":"metal","name":"Полигимния","name:el":"Πολύμνια","name:la":"Polyhymnia","name:uk":"Полігімнія","name:zh":"波吕许谟尼亚","ref":"П-66/1","ref:okn":"781610399040726","start_date":"1798","tourism":"artwork","wikidata":"Q121395079"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614666 59.6910732)'::geometry, 'node', 1632497618, 30, NULL, '{"alt_name":"Гермес Флорентийский","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6467/","historic":"yes","historic:start_date":"1794","int_name":"Hermes","material":"metal","name":"Меркурий","name:en":"Mercury","ref":"П-68/1","ref:okn":"781610399040396","start_date":"1810","tourism":"artwork","wikidata":"Q121395060"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613231 59.6910597)'::geometry, 'node', 1632497619, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_subject:wikidata":"Q104413","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6477/","historic":"yes","historic:start_date":"1793","int_name":"Erato","material":"metal","name":"Эрато","name:el":"Ἐρατώ","name:ka":"ერატო","name:ko":"에라토","name:la":"Eratō","name:uk":"Ерато","name:zh":"厄剌托","ref":"П-69/1","ref:okn":"781610399040476","start_date":"1798","tourism":"artwork","wikidata":"Q121395110"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612077 59.691005)'::geometry, 'node', 1632497620, 31, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6473/","historic":"yes","historic:start_date":"1794","int_name":"Terpsichore","material":"metal","name":"Терпсихора","name:el":"Τερψιχόρη","name:en":"Terpsichore","name:la":"Terpsichore","ref":"П-70/1","ref:okn":"781610399040436","start_date":"1798","tourism":"artwork","wikidata":"Q121395096"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611782 59.690902)'::geometry, 'node', 1632497621, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1792","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6472/","historic":"yes","historic:start_date":"1792","int_name":"Thalie","material":"metal","name":"Талия","name:el":"Θαλία","name:la":"Thalīa","name:uk":"Талія","name:zh":"塔利亚","ref":"П-59/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612041 59.6907321)'::geometry, 'node', 1632503254, 6, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.462536 59.6908707)'::geometry, 'node', 1652587953, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4619277 59.6908578)'::geometry, 'node', 1652587958, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617256 59.6909215)'::geometry, 'node', 3177639362, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612018 59.6909805)'::geometry, 'node', 3188928044, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613001 59.6906759)'::geometry, 'node', 3218618266, 4, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614144 59.6907882)'::geometry, 'node', 4912277772, 4, NULL, '{"board_type":"history","information":"board","name":"Флора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615482 59.6907937)'::geometry, 'node', 4912277773, 4, NULL, '{"board_type":"history","information":"board","name":"Урания","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613145 59.6908057)'::geometry, 'node', 4912277774, 4, NULL, '{"board_type":"history","information":"board","name":"Эвтерпа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616653 59.6908341)'::geometry, 'node', 4912277775, 4, NULL, '{"board_type":"history","information":"board","name":"Клио","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612216 59.6908451)'::geometry, 'node', 4912277776, 4, NULL, '{"board_type":"history","information":"board","name":"Мельпомена","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611751 59.690919)'::geometry, 'node', 4912277777, 4, NULL, '{"board_type":"history","information":"board","name":"Талия","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617272 59.6909351)'::geometry, 'node', 4912277778, 4, NULL, '{"board_type":"history","information":"board","name":"Калиопа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612298 59.691015)'::geometry, 'node', 4912277779, 4, NULL, '{"board_type":"history","information":"board","name":"Терпсихора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616819 59.6910157)'::geometry, 'node', 4912277780, 4, NULL, '{"board_type":"history","information":"board","name":"Полигимния","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461621 59.6910498)'::geometry, 'node', 4912277781, 4, NULL, '{"board_type":"history","information":"board","name":"Венера Каллипиги","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613548 59.6910624)'::geometry, 'node', 4912277782, 4, NULL, '{"board_type":"history","information":"board","name":"Эрато","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615016 59.6910712)'::geometry, 'node', 4912277783, 4, NULL, '{"board_type":"history","information":"board","name":"Меркурий","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608954 59.6897746)'::geometry, 'node', 5251698420, 25, NULL, '{"access":"permissive","addr:housenumber":"20 литББ","addr:street":"Садовая улица","architect":"Винченцо Бренна","barrier":"gate","description:access":"Ворота можно закрывать и открывать руками","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6459/","historic":"yes","locked":"no","name":"Большие Старосильвийские ворота","ref":"1","ref:okn":"781620399040626","start_date":"1786..1793","tourism":"attraction","website":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","wheelchair":"yes","wikidata":"Q118122050"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460198 59.6905729)'::geometry, 'node', 6758903438, 6, NULL, '{"artist_name":"И.П. Мартос","artwork_type":"sculpture","height":"4","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4625734 59.6908311)'::geometry, 'node', 8331430683, 3, NULL, '{"inlet":"grate","manhole":"drain","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614743 59.690923)'::geometry, 'node', 8530936200, 1, NULL, '{"board_type":"history","information":"board","name":"Аполлон","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4597619 59.6907527)'::geometry, 'node', 9140565043, 1, NULL, '{"ford":"yes"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4606891 59.6906687)'::geometry, 'node', 9140576937, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608515 59.6907117)'::geometry, 'node', 9140576938, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613945 59.6911519)'::geometry, 'node', 9143069530, 5, NULL, '{"drain":"no","source:direction":"survey"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('POINT (30.4615903 59.6911716)'::geometry, 'node', 9143069534, 1, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460339 59.6906064)'::geometry, 'node', 9143093777, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601191 59.6906349)'::geometry, 'node', 9143093778, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610445 59.6908345)'::geometry, 'node', 9143093802, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610243 59.6909861)'::geometry, 'node', 9143093804, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612126 59.691117)'::geometry, 'node', 9143093806, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460445 59.6910504)'::geometry, 'node', 9656736571, 2, NULL, '{"colour":"#4e3a39","description":"Веломаршрут №4","height":"4","information":"guidepost","material":"metal","start_date":"2021-03..2021-10","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4608056 59.6895935, 30.4608954 59.6897746, 30.4609447 59.6898691, 30.4614541 59.6909278)'::geometry, 'way', 30995960, 42, '{9140727117,5251698420,1518870630,1632497615}', '{"highway":"footway","historic":"yes","name":"Центральная аллея","ref":"VII","source:name":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605616 59.6906319, 30.4597619 59.6907527, 30.4596087 59.6907755)'::geometry, 'way', 149099000, 6, '{1621246509,9140565043,1621246531}', '{"intermittent":"yes","source:direction":"isoline","start_date":"1786","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604741 59.6903357, 30.4604598 59.6904575, 30.4604646 59.6905099, 30.4604784 59.6905443, 30.4604933 59.6905665, 30.4605321 59.6905996, 30.4605616 59.6906319)'::geometry, 'way', 149099004, 8, '{1621246503,9140576877,1621246482,1621246465,1621246454,9140576939,1621246509}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601177 59.6905796, 30.4600903 59.6905709, 30.4600721 59.6905605, 30.4600579 59.6905458, 30.4600519 59.6905296, 30.4600545 59.6905133, 30.4600656 59.6904979, 30.4600844 59.6904845, 30.4601095 59.690474, 30.4601391 59.6904673, 30.460169 59.6904648, 30.4601991 59.6904661, 30.4602277 59.6904711, 30.4602498 59.6904787, 30.4602686 59.6904892, 30.4602829 59.6905018, 30.4602918 59.6905174, 30.4602917 59.6905327, 30.4602881 59.6905462, 30.4602793 59.6905579)'::geometry, 'way', 149099028, 5, '{9140576951,9140576902,9140576952,1621246602,1621246607,1621246668,1621246614,1621246615,1621246618,1621246620,1621246630,1621246244,1621246631,1621246224,1621246250,1621246635,1621246647,9140576950,9140576903,9140576949}', '{"barrier":"fence","colour":"green","fence_type":"wood","height":"2"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4603352 59.6911039, 30.460353 59.6910638, 30.4603719 59.6910414, 30.4603979 59.691021, 30.4604807 59.6909761, 30.460577 59.6909284, 30.4606406 59.6908886, 30.460669 59.6908562, 30.460673 59.6908234, 30.4606633 59.6907504, 30.4606582 59.6907286, 30.4606491 59.6907025, 30.4606314 59.690668, 30.460609 59.690636, 30.4605858 59.6906064, 30.4605578 59.6905735, 30.4605362 59.6905385, 30.4605214 59.6905022, 30.4605119 59.6904644, 30.4605095 59.6904098, 30.460512 59.6903499, 30.4605096 59.6903011)'::geometry, 'way', 149099029, 36, '{9140727237,4260007753,9140727241,8650331583,1621246592,1621246588,1621246578,1652603857,9140727240,8650331584,1621246577,9143093738,1621246419,9140576875,1652603906,9140576876,1621246542,8650331586,9140576874,8650331585,1621246403,9140576873,1239612684}', '{"alt_name":"Окружная дорожка","highway":"footway","historic":"yes","name":"Круговая дорожка","start_date":"1789.1793","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610979 59.6907799, 30.4608515 59.6907117)'::geometry, 'way', 149099034, 9, '{1632503255,9140576938}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4629005 59.6913411, 30.4614541 59.6909278)'::geometry, 'way', 150294524, 8, '{1239612692,1632497615}', '{"highway":"footway","historic":"yes","ref":"III","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613148 59.6910721, 30.4613667 59.6910818, 30.4614212 59.6910868, 30.4614766 59.6910869, 30.4615311 59.6910822, 30.4615833 59.6910728, 30.4616314 59.691059, 30.461674 59.6910412, 30.4617098 59.6910199, 30.4617378 59.6909958, 30.461757 59.6909696, 30.4617669 59.6909421, 30.4617672 59.6909141, 30.4617579 59.6908866, 30.4617393 59.6908603, 30.4617119 59.690836, 30.4616766 59.6908145, 30.4616343 59.6907964, 30.4615866 59.6907823, 30.4615347 59.6907726, 30.4614802 59.6907676, 30.4614248 59.6907674, 30.4613703 59.6907721, 30.4613181 59.6907815, 30.46127 59.6907954, 30.4612274 59.6908132, 30.4611916 59.6908345, 30.4611636 59.6908586, 30.4611444 59.6908848, 30.4611345 59.6909123, 30.4611342 59.6909402, 30.4611435 59.6909678, 30.4611621 59.6909941, 30.4611895 59.6910184, 30.4612248 59.6910399, 30.461267 59.6910579, 30.4613148 59.6910721)'::geometry, 'way', 150294525, 6, '{1632220686,9143093824,1632220364,9143093807,1632220588,9143093808,1632220590,9143093809,1632220259,9143093810,1632220292,9143093811,1632220283,9143093812,1632220296,9143093813,1632220378,9143093814,1632220319,9143093815,1632220315,9143093816,1632220323,9143093817,1632220358,9143093818,1632220355,9143093819,1632220350,9143093820,1632220359,9143093821,1632220366,9143093822,1632220374,9143093823,1632220686}', '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.460726 59.6910052, 30.460614 59.6910145, 30.4605241 59.69102, 30.4604597 59.691022, 30.4603979 59.691021)'::geometry, 'way', 150294532, 30, '{1632497615,1632220252,9140727238,9140727242,9140727239,1621246592}', '{"highway":"footway","historic":"yes","name":"луч домика Крик","ref":"X","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605096 59.6903011, 30.4614541 59.6909278)'::geometry, 'way', 150294541, 8, '{1239612684,1632497615}', '{"highway":"footway","historic":"yes","ref":"VIII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4617339 59.6901702)'::geometry, 'way', 150294547, 9, '{1632497615,1518870645}', '{"highway":"footway","historic":"yes","ref":"VI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461819 59.6910085, 30.4618473 59.6909863, 30.4618928 59.6909647, 30.461951 59.6909401, 30.4620356 59.6909251, 30.462536 59.6908707)'::geometry, 'way', 152440395, 6, '{1652587944,1652587948,1652587950,9143093800,1652587952,1652587953}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613063 59.6907075, 30.4612631 59.6907161, 30.4612041 59.6907321)'::geometry, 'way', 152442436, 10, '{1652605207,9143204222,1632503254}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4617627 59.6907689, 30.4618218 59.6907946, 30.4618794 59.6908253, 30.4619277 59.6908578)'::geometry, 'way', 152442438, 8, '{1652605205,1652605201,1652605200,1652587958}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4612018 59.6909805, 30.4617256 59.6909215, 30.4625734 59.6908311, 30.4628306 59.6908088)'::geometry, 'way', 311975108, 20, '{3188928044,3177639362,8331430683,7911801321}', '{"layer":"-1","name":"Старосильвийская дождевая канализация","source:direction":"survey","tunnel":"yes","waterway":"drain"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611708 59.6911018, 30.4611289 59.6910829, 30.4610793 59.6910531, 30.4610552 59.6910294, 30.4610432 59.6910153, 30.4610243 59.6909861)'::geometry, 'way', 313051687, 8, '{1632503180,9143069533,9143093805,9143069532,1632503185,9143093804}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061)'::geometry, 'way', 426269715, 5, '{4255746051,4255746033,9140576943,9140576942,9140576941,9140576940,4255746057,4255746007,9140576945,9140576946,9140576944,4255746054,4255745992,4255746051}', '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603979 59.691021, 30.4603224 59.6910067, 30.4602382 59.6909843, 30.4601137 59.6909482, 30.4600256 59.6909178, 30.4599203 59.6908773, 30.4597958 59.6908259, 30.4597422 59.6908088, 30.4596966 59.6907997, 30.4596501 59.6907961, 30.4596189 59.6907966, 30.4595885 59.6908005, 30.4595518 59.6908091, 30.4595101 59.6908241)'::geometry, 'way', 438780267, 20, '{1621246592,1621246561,1622496989,8850590008,1621246248,1621246252,8650331580,8849369897,9140576840,8650331579,9140576841,8650331578,9140576842,1622496957}', '{"highway":"footway","historic":"yes","loc_name":"Спуск у места домика Крик","name":"Криковская дорога","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4625498 59.6908065, 30.4614541 59.6909278)'::geometry, 'way', 750779153, 4, '{1632220250,1632497615}', '{"highway":"footway","historic":"yes","ref":"IV","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4631938 59.6918756)'::geometry, 'way', 750779155, 5, '{1632497615,1195120146}', '{"highway":"footway","historic":"yes","ref":"II","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4606491 59.6907025)'::geometry, 'way', 750779156, 5, '{1632497615,1621246419}', '{"highway":"footway","historic":"yes","ref":"IX","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4625914 59.6924527)'::geometry, 'way', 750779157, 4, '{1632497615,1652587960}', '{"highway":"footway","historic":"yes","ref":"I","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611165 59.6918779, 30.46118 59.6916919, 30.4614541 59.6909278)'::geometry, 'way', 750779158, 4, '{9159459639,1239612686,1632497615}', '{"highway":"footway","historic":"yes","ref":"XII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4596189 59.6907966, 30.4596712 59.6907865, 30.4597275 59.6907729, 30.459757 59.6907607, 30.4597619 59.6907527, 30.4597677 59.6907431, 30.4597919 59.6907269, 30.4598455 59.6907093, 30.459934 59.6906931, 30.4600118 59.6906782, 30.4600467 59.690666, 30.4600681 59.6906484, 30.4600725 59.6906275, 30.4600655 59.6906044, 30.4600295 59.6905552, 30.4600066 59.6905268, 30.4600031 59.690512, 30.4600111 59.6904995, 30.460044 59.6904799, 30.4600789 59.6904629, 30.4601241 59.6904473)'::geometry, 'way', 988944864, 2, '{9140576841,9140565053,9140565052,9140565051,9140565043,9140565050,9140565049,9140565048,9140565047,9140565046,9140565045,9140565044,1621246253,9140565042,1621246302,1621246323,9140576899,9140576892,9143093786,9143093785,1621246340}', '{"highway":"path","surface":"ground"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4607784 59.690696, 30.4606891 59.6906687)'::geometry, 'way', 988944880, 3, '{9140576936,9140576937}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601316 59.6905738, 30.4601383 59.6905745, 30.460144 59.6905725, 30.4601453 59.6905691, 30.4601415 59.6905663, 30.4601348 59.6905656, 30.4601291 59.6905676, 30.4601278 59.6905709, 30.4601316 59.6905738)'::geometry, 'way', 989184163, 1, '{9142788307,9142788306,9142788305,9142788304,9142788303,9142788302,9142788301,9142788300,9142788307}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601637 59.6905695, 30.4601704 59.6905701, 30.4601761 59.6905682, 30.4601774 59.6905648, 30.4601736 59.6905619, 30.4601668 59.6905613, 30.4601612 59.6905632, 30.4601599 59.6905666, 30.4601637 59.6905695)'::geometry, 'way', 989184166, 1, '{9142819031,9142819030,9142819029,9142819028,9142819027,9142819026,9142819025,9142819024,9142819031}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4615026 59.6911479, 30.4614481 59.6911519, 30.4613945 59.6911519)'::geometry, 'way', 989211851, 4, '{1652605211,9143069529,9143069530}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603719 59.6910414, 30.4597387 59.6911122)'::geometry, 'way', 989211857, 12, '{8650331583,4260007752}', '{"highway":"path","historic":"yes","name":"луч домика Крик","start_date":"1780.1785"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603446 59.6911727, 30.4603806 59.6910714, 30.4603967 59.691047, 30.4604235 59.6910376, 30.4604664 59.6910348, 30.4605415 59.6910308)'::geometry, 'way', 989211858, 1, '{9143069609,9143069608,9143069607,9143069606,9143069605,9143069604}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613583 59.6906799, 30.4614025 59.6907746, 30.461428 59.6907726, 30.4614548 59.6907726, 30.4614763 59.6907739)'::geometry, 'way', 989211859, 1, '{9143093728,9143093727,9143093726,9143093725,9143093724}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461314 59.6906832, 30.461361 59.6907794, 30.4613301 59.6907854, 30.4613033 59.6907929, 30.4612845 59.690799, 30.4609841 59.6905973)'::geometry, 'way', 989211860, 1, '{9143093729,9143093730,9143093731,9143093732,9143093734,9143093733}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611484 59.6909364, 30.4611471 59.6909174, 30.4611497 59.6909005, 30.4611578 59.6908836, 30.4611645 59.6908714, 30.4611739 59.6908606, 30.4606917 59.6907283, 30.460681 59.6907283, 30.460677 59.6907337, 30.460685 59.6907601, 30.4606891 59.6907817, 30.4606917 59.6908129, 30.4606944 59.6908426, 30.4606837 59.6908656, 30.4606596 59.6908927, 30.4606247 59.6909184, 30.460563 59.6909523, 30.460453 59.6910064)'::geometry, 'way', 989211861, 1, '{9143093739,9143093740,9143093741,9143093742,9143093743,9143093744,9143093755,9143093737,9143093736,9143093754,9143093753,9143093722,9143093721,9143093720,9143093719,9143093718,9143093717,9143069616}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605335 59.6903364, 30.4605335 59.6903946, 30.4605308 59.6904501, 30.4605348 59.6904813, 30.4605442 59.6905137, 30.4605576 59.6905394, 30.4605818 59.6905773, 30.4606193 59.6906247, 30.4606408 59.6906545, 30.4606596 59.6906856, 30.4606716 59.6906958, 30.4606958 59.6907039, 30.4611947 59.6908433, 30.4612155 59.6908301, 30.4612369 59.6908166, 30.461253 59.6908098, 30.4609492 59.6906112)'::geometry, 'way', 989211862, 1, '{9143093764,9143093763,9143093762,9143093748,9143093761,9143093760,9143093759,9143093758,9143093757,9143093756,9143093752,9143093751,9143093750,9143093747,9143093746,9143093745,9143093735}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604919 59.6903357, 30.4604919 59.690398, 30.4604892 59.6904494, 30.4604946 59.690486, 30.4605053 59.6905157, 30.4605161 59.6905387, 30.4605402 59.6905766, 30.4605778 59.690624, 30.4605992 59.6906538, 30.460626 59.6906931, 30.4606368 59.6907255, 30.4606448 59.6907574, 30.4606502 59.6907871, 30.4606542 59.6908196, 30.4606502 59.6908494, 30.4606327 59.6908751, 30.4606059 59.6908927, 30.4605496 59.6909266, 30.4604128 59.6909942)'::geometry, 'way', 989211863, 1, '{9143093776,9143093775,9143093774,9143093773,9143093749,9143093772,9143093771,9143093770,9143093769,9143093768,9143093767,9143093765,9143093766,9143069615,9143069610,9143069614,9143069613,9143069612,9143069611}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619893 59.6908956, 30.4620356 59.6909251)'::geometry, 'way', 989211867, 2, '{1652587955,1652587952}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610753 59.6908007, 30.4610979 59.6907799)'::geometry, 'way', 989211868, 4, '{9143093801,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611491 59.6907553, 30.4610979 59.6907799)'::geometry, 'way', 989211869, 4, '{1632503177,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461012 59.6909572, 30.4610056 59.6909157, 30.4610163 59.6908698, 30.4610445 59.6908345)'::geometry, 'way', 989211870, 4, '{1632503179,9143093803,1632503181,9143093802}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613456 59.6911475, 30.46131 59.6911438, 30.4612696 59.6911343, 30.4612126 59.691117)'::geometry, 'way', 989211871, 4, '{1652605209,9143069531,1632503237,9143093806}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4622826 59.6903796)'::geometry, 'way', 991343632, 2, '{1632497615,1518870652}', '{"highway":"footway","historic":"yes","ref":"V","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4620021 59.690877, 30.4617551 59.6909043, 30.4617579 59.690914, 30.4617593 59.6909255, 30.4617606 59.6909377)'::geometry, 'way', 991343633, 1, '{9159456550,9159456549,9159456545,9159456544,9159456543}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619941 59.6908547, 30.4617471 59.690882, 30.4617392 59.6908714, 30.4617298 59.6908606, 30.4617164 59.6908491)'::geometry, 'way', 991343634, 1, '{9159456552,9159456551,9159456548,9159456547,9159456546}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4602794 59.6911745, 30.4603083 59.6910871)'::geometry, 'way', 991343661, 1, '{9159459675,9159459674}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4614541 59.6909278)'::geometry, 'way', 1042527594, 11, '{9140727237,1632497615}', '{"highway":"footway","historic":"yes","name":"луч Амфитеатра","ref":"XI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4611342 59.6909402, 30.4611345 59.6909123, 30.4611444 59.6908848, 30.4611636 59.6908586, 30.4611916 59.6908345, 30.4612274 59.6908132, 30.46127 59.6907954, 30.4613181 59.6907815, 30.4613703 59.6907721, 30.4614248 59.6907674, 30.4614802 59.6907676, 30.4615347 59.6907726, 30.4615866 59.6907823, 30.4616343 59.6907964, 30.4616766 59.6908145, 30.4617119 59.690836, 30.4617393 59.6908603, 30.4617579 59.6908866, 30.4617672 59.6909141, 30.4617669 59.6909421, 30.461757 59.6909696, 30.4617378 59.6909958, 30.4617098 59.6910199, 30.461674 59.6910412, 30.4616314 59.691059, 30.4615833 59.6910728, 30.4615311 59.6910822, 30.4614766 59.6910869, 30.4614212 59.6910868, 30.4613667 59.6910818, 30.4613148 59.6910721, 30.461267 59.6910579, 30.4612248 59.6910399, 30.4611895 59.6910184, 30.4611621 59.6909941, 30.4611435 59.6909678, 30.4611342 59.6909402)))'::geometry, 'way', 150294525, 6, NULL, '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034)))'::geometry, 'way', 426269715, 5, NULL, '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601599 59.6905666, 30.4601612 59.6905632, 30.4601668 59.6905613, 30.4601736 59.6905619, 30.4601774 59.6905648, 30.4601761 59.6905682, 30.4601704 59.6905701, 30.4601637 59.6905695, 30.4601599 59.6905666)))'::geometry, 'way', 989184166, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text, gm1 geometry, gg1 geography) SERVER sqlite_svr;
--Testcase 41: ERR - raster
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, read PostGOS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49: ERR, no SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 50: ERR, no SRID
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 52:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 53: ERR damaged, but there is SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = (decode('0101000020e6100000bf72ce99fe76', 'hex')::geometry);
-- Insert PostGIS/GEOS BLOB, read SpatiaLite BLOB
--Testcase 54: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 55:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 56:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 57: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 58:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 59:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 60: ERR damaged geometry, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (3, decode('0101000020e6100000bf72ce99fe76', 'hex'), NULL, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 61: ERR damaged geography, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (4, NULL, decode('0101000020e6100000bf72ce99fe76', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 62:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 63:
INSERT INTO "♂" SELECT * FROM "♂"."テスト";
--Testcase 64:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 65:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 66:
SELECT * FROM "♂";
--Testcase 67:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 69:
SELECT * FROM "♂";
--Testcase 70:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL ,
osm_id bigint OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t text
) SERVER sqlite_svr OPTIONS (table '♁');
--Testcase 71: ERR - No SRID
INSERT INTO "♁ FDW" SELECT * FROM "♁";
--Testcase 72: OK
SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 73:
UPDATE "♁" SET geom = ST_SetSRID(geom, 4326);
--Testcase 74:
INSERT INTO "♁ FDW" SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 75:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE bytea;
--Testcase 76:
SELECT * FROM "♁ FDW";
--Testcase 77:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE geometry;
--Testcase 78:
SELECT * FROM "♁ FDW";
--Testcase 79:
DROP FOREIGN TABLE "♂";
--Testcase 80:
DROP FOREIGN TABLE "♁ FDW";
--Testcase 81:
DROP TABLE "♁";
--Testcase 82:
DROP TABLE "♂"."テスト";
--Testcase 83:
DROP SCHEMA "♂";
-- Test operators implemented in PostGIS 3.4.2, other are not tested
-- SELECT testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 100 -> TC 150 -> TC200 -> TC250
-- WHERE testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 300 -> TC 350 -> TC400 -> TC450
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ gm1 g FROM "types_PostGIS";
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && gm1 g FROM "types_PostGIS";
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << gm1 g FROM "types_PostGIS";
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> gm1 g FROM "types_PostGIS";
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< gm1 g FROM "types_PostGIS";
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> gm1 g FROM "types_PostGIS";
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| gm1 g FROM "types_PostGIS";
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> gm1 g FROM "types_PostGIS";
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| gm1 g FROM "types_PostGIS";
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> gm1 g FROM "types_PostGIS";
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= gm1 g FROM "types_PostGIS";
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm = gm1 g FROM "types_PostGIS";
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| gm1 g FROM "types_PostGIS";
--Testcase 115
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> gm1 g FROM "types_PostGIS";
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> gm1 g FROM "types_PostGIS";
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ gm1 g FROM "types_PostGIS";
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ gm1 g FROM "types_PostGIS";
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 157:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 159:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> gg1 g FROM "types_PostGIS";
--Testcase 201:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && gg1 g FROM "types_PostGIS";
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> gg1 g FROM "types_PostGIS";
--Testcase 203:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg = gg1 g FROM "types_PostGIS";
--Testcase 204
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != gg1 g FROM "types_PostGIS";
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 300:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ gm1 IS NOT NULL;
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && gm1 IS NOT NULL;
--Testcase 302:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << gm1 IS NOT NULL;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> gm1 IS NOT NULL;
--Testcase 304:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< gm1 IS NOT NULL;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> gm1 IS NOT NULL;
--Testcase 306:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| gm1 IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> gm1 IS NOT NULL;
--Testcase 308:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| gm1 IS NOT NULL;
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> gm1 IS NOT NULL;
--Testcase 310:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= gm1 IS NOT NULL;
--Testcase 311:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm = gm1 IS NOT NULL;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& gm1 IS NOT NULL;
--Testcase 313:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| gm1 IS NOT NULL;
--Testcase 314:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> gm1 IS NOT NULL;
--Testcase 315:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> gm1 IS NOT NULL;
--Testcase 316:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ gm1 IS NOT NULL;
--Testcase 317:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ gm1 IS NOT NULL;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 351:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 352:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 353:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 354:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 355:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 356:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 357:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 358:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 359:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 360:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 361:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 362:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 363:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 364:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 365:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 366:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 367:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 368:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 369:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 370:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 400:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> gg1 IS NOT NULL;
--Testcase 401:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && gg1 IS NOT NULL;
--Testcase 402:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 404:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg = gg1 IS NOT NULL;
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != gg1 IS NOT NULL;
--Testcase 450:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 451:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 452:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 453:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 454:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 500:
DROP FOREIGN TABLE "types_PostGIS";
--Testcase 501:
DROP EXTENSION sqlite_fdw CASCADE;
--Testcase 502:
DROP EXTENSION postgis CASCADE;
================================================
FILE: sql/15.7/with_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 47:
CREATE EXTENSION postgis;
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/without_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/without_gis_support/nogis.sql
================================================
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 10:
CREATE DOMAIN geometry AS bytea;
--Testcase 11:
CREATE DOMAIN geography AS bytea;
--Testcase 12:
CREATE DOMAIN addbandarg AS bytea;
--Testcase 13:
CREATE DOMAIN box2d AS bytea;
--Testcase 14:
CREATE DOMAIN box3d AS bytea;
--Testcase 15:
CREATE DOMAIN geometry_dump AS bytea;
--Testcase 16:
CREATE DOMAIN geomval AS bytea;
--Testcase 17:
CREATE DOMAIN getfaceedges_returntype AS bytea;
--Testcase 18:
CREATE DOMAIN rastbandarg AS bytea;
--Testcase 19:
CREATE DOMAIN raster AS bytea;
--Testcase 20:
CREATE DOMAIN reclassarg AS bytea;
--Testcase 21:
CREATE DOMAIN summarystats AS bytea;
--Testcase 22:
CREATE DOMAIN topoelement AS bytea;
--Testcase 23:
CREATE DOMAIN topoelementarray AS bytea;
--Testcase 24:
CREATE DOMAIN topogeometry AS bytea;
--Testcase 25:
CREATE DOMAIN unionarg AS bytea;
--Testcase 26:
CREATE DOMAIN validatetopology_returntype AS bytea;
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text) SERVER sqlite_svr;
--Testcase 41: ERR unable to convert to unsupported PostGIS specific data type
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, but CANNOT read PostGIS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: read the same BLOBs
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
--Testcase 50:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
-- Insert a BLOB, read SpatiaLite BLOB without any transformations
--Testcase 51: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 52:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 53:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 54: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 55:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 56:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 57:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 58:
SELECT * FROM "♂";
--Testcase 59:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 60:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 61:
INSERT INTO "♂" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
--Testcase 62:
SELECT * FROM "♂";
--Testcase 63:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL,
osm_id int OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t json
) SERVER sqlite_svr
OPTIONS (table '♁');
--Testcase 55:
INSERT INTO "♁ FDW" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 67:
SELECT * FROM "♁ FDW";
-- PostGIS specific data types, but SpatiaLite or sqlite_fdw unsupported
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box2d;
--Testcase 69: -- ERR
SELECT * FROM "♂";
--Testcase 70:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box3d;
--Testcase 71: -- ERR
SELECT * FROM "♂";
--Testcase 72:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry_dump;
--Testcase 73: -- ERR
SELECT * FROM "♂";
--Testcase 74:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geomval;
--Testcase 75: -- ERR
SELECT * FROM "♂";
--Testcase 76:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE getfaceedges_returntype;
--Testcase 77: -- ERR
SELECT * FROM "♂";
--Testcase 78:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE rastbandarg;
--Testcase 79: -- ERR
SELECT * FROM "♂";
--Testcase 80:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE raster;
--Testcase 81: -- ERR
SELECT * FROM "♂";
--Testcase 82:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE reclassarg;
--Testcase 83: -- ERR
SELECT * FROM "♂";
--Testcase 84:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE summarystats;
--Testcase 85: -- ERR
SELECT * FROM "♂";
--Testcase 86:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelement;
--Testcase 87: -- ERR
SELECT * FROM "♂";
--Testcase 88:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelementarray;
--Testcase 89: -- ERR
SELECT * FROM "♂";
--Testcase 90:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topogeometry;
--Testcase 91: -- ERR
SELECT * FROM "♂";
--Testcase 92:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE unionarg;
--Testcase 93: -- ERR
SELECT * FROM "♂";
--Testcase 94:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE validatetopology_returntype;
--Testcase 95: -- ERR
SELECT * FROM "♂";
-- PostGIS specific data types, not bytea mode, hence error
--Testcase 96:
ALTER DOMAIN geometry RENAME TO geom0;
--Testcase 97:
ALTER DOMAIN geography RENAME TO geog0;
--Testcase 98:
CREATE DOMAIN geometry AS text;
--Testcase 99:
CREATE DOMAIN geography AS text;
--Testcase 100:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 101: -- ERR
SELECT * FROM "♂";
--Testcase 102:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geography;
--Testcase 102: -- ERR
SELECT * FROM "♂";
--Testcase 103:
DROP DOMAIN geometry CASCADE;
--Testcase 104:
DROP DOMAIN geography CASCADE;
--Testcase 105:
DROP DOMAIN addbandarg;
--Testcase 106:
DROP DOMAIN box2d;
--Testcase 107:
DROP DOMAIN box3d;
--Testcase 108:
DROP DOMAIN geometry_dump;
--Testcase 109:
DROP DOMAIN geomval;
--Testcase 110:
DROP DOMAIN getfaceedges_returntype;
--Testcase 111:
DROP DOMAIN rastbandarg;
--Testcase 112:
DROP DOMAIN raster CASCADE;
--Testcase 113:
DROP DOMAIN reclassarg;
--Testcase 114:
DROP DOMAIN summarystats;
--Testcase 115:
DROP DOMAIN topoelement;
--Testcase 116:
DROP DOMAIN topoelementarray;
--Testcase 117:
DROP DOMAIN topogeometry;
--Testcase 118:
DROP DOMAIN unionarg;
--Testcase 119:
DROP DOMAIN validatetopology_returntype;
--Testcase 120:
DROP DOMAIN geom0 CASCADE;
--Testcase 121:
DROP DOMAIN geog0 CASCADE;
--Testcase 122:
DROP SERVER sqlite_svr CASCADE;
--Testcase 123:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/15.7/without_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/aggregate.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 18:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
-- test for aggregate pushdown
--Testcase 8:
DROP SERVER IF EXISTS sqlite_svr CASCADE;
--Testcase 9:
DROP EXTENSION IF EXISTS sqlite_fdw CASCADE;
--Testcase 10:
CREATE EXTENSION sqlite_fdw;
--Testcase 11:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 12:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 1:
explain (costs off, verbose) select count(distinct a) from multiprimary;
--Testcase 2:
explain (costs off, verbose) select sum(b),max(b), min(b), avg(b) from multiprimary;
--Testcase 3:
explain (costs off, verbose) select sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 4:
explain (costs off, verbose) select sum(a) from multiprimary group by b having sum(a) > 0;
--Testcase 5:
explain (costs off, verbose) select sum(a) from multiprimary group by b having avg(a^2) > 0 and sum(a) > 0;
-- stddev and variance are not pushed down
--Testcase 6:
explain (costs off, verbose) select stddev(a) from multiprimary;
--Testcase 7:
explain (costs off, verbose) select sum(a) from multiprimary group by b having variance(a) > 0;
--Testcase 13:
DROP FOREIGN TABLE multiprimary;
--Testcase 16:
CREATE FOREIGN TABLE limittest(id serial OPTIONS (key 'true'), x int, y text) SERVER sqlite_svr;
--Testcase 17:
INSERT INTO limittest(x, y) VALUES (1, 'x'), (2, 'x'), (3, 'x'), (4, 'x');
--Testcase 18:
INSERT INTO limittest(x, y) VALUES (1, 'y'), (2, 'y'), (3, 'y'), (4, 'y');
--Testcase 19:
INSERT INTO limittest(x, y) VALUES (1, 'z'), (2, 'z'), (3, 'z'), (4, 'z');
--Testcase 20:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 21:
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 22:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 23:
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 24:
EXPLAIN VERBOSE
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 25:
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 26:
EXPLAIN VERBOSE
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 27:
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 28:
DROP FOREIGN TABLE limittest;
--Testcase 14:
DROP SERVER sqlite_svr;
--Testcase 15:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/aggregates.sql
================================================
--
-- AGGREGATES
--
--Testcase 266:
CREATE EXTENSION sqlite_fdw;
--Testcase 267:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 268:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 269:
CREATE FOREIGN TABLE aggtest (
a int2,
b float4
) SERVER sqlite_svr;
--Testcase 270:
CREATE FOREIGN TABLE student (
name text,
age int4,
location point,
gpa float8
) SERVER sqlite_svr;
--Testcase 271:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 272:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 697:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 698:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 699:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 700:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 701:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 273:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 702:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 703:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 704:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 705:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 706:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 274:
CREATE FOREIGN TABLE multi_arg_agg (a int OPTIONS (key 'true'), b int, c text) SERVER sqlite_svr;
--Testcase 275:
CREATE FOREIGN TABLE VARCHAR_TBL(f1 varchar(4) OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 276:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 588:
SET extra_float_digits = 0;
--Testcase 1:
SELECT avg(four) AS avg_1 FROM onek;
--Testcase 2:
SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
--Testcase 707:
CREATE FOREIGN TABLE agg_tb(v int, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 708:
INSERT INTO agg_tb(v) VALUES(1), (2), (3);
--Testcase 709: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 710:
DELETE FROM agg_tb;
--Testcase 711:
INSERT INTO agg_tb(v) VALUES (NULL);
--Testcase 712: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 713:
DELETE FROM agg_tb;
--Testcase 714:
INSERT INTO agg_tb(v) VALUES (NULL), (1), (2);
--Testcase 715: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 716:
CREATE FOREIGN TABLE agg_tb2(v text) SERVER sqlite_svr;
--Testcase 717:
INSERT INTO agg_tb2(v) VALUES (array['hello', 'world']);
--Testcase 718: -- Pg 16+
SELECT any_value(v) FROM agg_tb2;
-- In 7.1, avg(float4) is computed using float8 arithmetic.
--Testcase 3:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 678:
SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest;
--Testcase 4:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 679:
SELECT avg(gpa)::numeric(10,3) AS avg_3_4 FROM ONLY student;
--Testcase 5:
SELECT sum(four) AS sum_1500 FROM onek;
--Testcase 6:
SELECT sum(a) AS sum_198 FROM aggtest;
--Testcase 7:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 680:
SELECT sum(b)::numeric(10,3) AS avg_431_773 FROM aggtest;
--Testcase 8:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 681:
SELECT sum(gpa)::numeric(10,3) AS avg_6_8 FROM ONLY student;
--Testcase 9:
SELECT max(four) AS max_3 FROM onek;
--Testcase 10:
SELECT max(a) AS max_100 FROM aggtest;
--Testcase 11:
SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
--Testcase 12:
SELECT max(student.gpa) AS max_3_7 FROM student;
--Testcase 13:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 682:
SELECT stddev_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 14:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 683:
SELECT stddev_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 15:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 684:
SELECT var_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 16:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 685:
SELECT var_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 17:
SELECT stddev_pop(b::numeric) FROM aggtest;
--Testcase 18:
SELECT stddev_samp(b::numeric) FROM aggtest;
--Testcase 19:
SELECT var_pop(b::numeric) FROM aggtest;
--Testcase 20:
SELECT var_samp(b::numeric) FROM aggtest;
-- population variance is defined for a single tuple, sample variance
-- is not
--Testcase 277:
CREATE FOREIGN TABLE agg_t3(a float8, b float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 278:
DELETE FROM agg_t3;
--Testcase 279:
INSERT INTO agg_t3 values (1.0::float8, 2.0::float8);
--Testcase 280:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 281:
DELETE FROM agg_t3;
--Testcase 282:
INSERT INTO agg_t3 values (3.0::float8, 4.0::float8);
--Testcase 283:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 284:
DELETE FROM agg_t3;
--Testcase 285:
INSERT INTO agg_t3 values ('inf'::float8, 'inf'::float8);
--Testcase 286:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 287:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 288:
DELETE FROM agg_t3;
--Testcase 289:
INSERT INTO agg_t3 values ('nan'::float8, 'nan'::float8);
--Testcase 290:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 291:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 292:
CREATE FOREIGN TABLE agg_t4(a float4, b float4, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 293:
DELETE FROM agg_t4;
--Testcase 294:
INSERT INTO agg_t4 values (1.0::float4, 2.0::float4);
--Testcase 295:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 296:
DELETE FROM agg_t4;
--Testcase 297:
INSERT INTO agg_t4 values (3.0::float4, 4.0::float4);
--Testcase 298:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 299:
DELETE FROM agg_t4;
--Testcase 300:
INSERT INTO agg_t4 values ('inf'::float4, 'inf'::float4);
--Testcase 301:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 302:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 303:
DELETE FROM agg_t4;
--Testcase 304:
INSERT INTO agg_t4 values ('nan'::float4, 'nan'::float4);
--Testcase 305:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 306:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 307:
CREATE FOREIGN TABLE agg_t5(a numeric, b numeric, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 308:
DELETE FROM agg_t5;
--Testcase 309:
INSERT INTO agg_t5 values (1.0::numeric, 2.0::numeric);
--Testcase 310:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 311:
DELETE FROM agg_t5;
--Testcase 312:
INSERT INTO agg_t5 values (3.0::numeric, 4.0::numeric);
--Testcase 313:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 597:
DELETE FROM agg_t5;
--Testcase 598:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 599:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 600:
DELETE FROM agg_t5;
--Testcase 601:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 602:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 314:
DELETE FROM agg_t5;
--Testcase 315:
INSERT INTO agg_t5 values ('nan'::numeric, 'nan'::numeric);
--Testcase 316:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 317:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
-- verify correct results for null and NaN inputs
--Testcase 318:
CREATE FOREIGN TABLE agg_t8(a text OPTIONS (key 'true'), b text) SERVER sqlite_svr;
--Testcase 319:
DELETE FROM agg_t8;
--Testcase 320:
INSERT INTO agg_t8 select * from generate_series(1,3);
--Testcase 321:
select sum(null::int4) from agg_t8;
--Testcase 322:
select sum(null::int8) from agg_t8;
--Testcase 323:
select sum(null::numeric) from agg_t8;
--Testcase 324:
select sum(null::float8) from agg_t8;
--Testcase 325:
select avg(null::int4) from agg_t8;
--Testcase 326:
select avg(null::int8) from agg_t8;
--Testcase 327:
select avg(null::numeric) from agg_t8;
--Testcase 328:
select avg(null::float8) from agg_t8;
--Testcase 329:
select sum('NaN'::numeric) from agg_t8;
--Testcase 330:
select avg('NaN'::numeric) from agg_t8;
-- verify correct results for infinite inputs
--Testcase 331:
DELETE FROM agg_t3;
--Testcase 332:
INSERT INTO agg_t3 VALUES ('1'::float8), ('infinity'::float8);
--Testcase 333:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 334:
DELETE FROM agg_t3;
--Testcase 335:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('1'::float8);
--Testcase 336:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 337:
DELETE FROM agg_t3;
--Testcase 338:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('infinity'::float8);
--Testcase 339:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 340:
DELETE FROM agg_t3;
--Testcase 341:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('infinity'::float8);
--Testcase 342:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 603:
DELETE FROM agg_t3;
--Testcase 604:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('-infinity'::float8);
--Testcase 605:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 606:
DELETE FROM agg_t3;
--Testcase 607:
INSERT INTO agg_t3 VALUES ('1'::numeric), ('infinity'::numeric);
--Testcase 608:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 609:
DELETE FROM agg_t3;
--Testcase 610:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('1'::numeric);
--Testcase 611:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 612:
DELETE FROM agg_t3;
--Testcase 613:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('infinity'::numeric);
--Testcase 614:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 615:
DELETE FROM agg_t3;
--Testcase 616:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('infinity'::numeric);
--Testcase 617:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 618:
DELETE FROM agg_t3;
--Testcase 619:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('-infinity'::numeric);
--Testcase 620:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
-- test accuracy with a large input offset
--Testcase 343:
CREATE FOREIGN TABLE agg_t6(a float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 344:
DELETE FROM agg_t6;
--Testcase 345:
INSERT INTO agg_t6 VALUES (100000003), (100000004), (100000006), (100000007);
--Testcase 346:
SELECT avg(a), var_pop(a) FROM agg_t6;
--Testcase 347:
DELETE FROM agg_t6;
--Testcase 348:
INSERT INTO agg_t6 VALUES (7000000000005), (7000000000007);
--Testcase 349:
SELECT avg(a), var_pop(a) FROM agg_t6;
-- SQL2003 binary aggregates
--Testcase 21:
SELECT regr_count(b, a) FROM aggtest;
--Testcase 22:
SELECT regr_sxx(b, a) FROM aggtest;
--Testcase 23:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 686:
SELECT regr_syy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 24:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 687:
SELECT regr_sxy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 25:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 688:
SELECT regr_avgx(b, a), regr_avgy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 26:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 689:
SELECT regr_r2(b, a)::numeric(20,10) FROM aggtest;
--Testcase 27:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 690:
SELECT regr_slope(b, a)::numeric(20,10), regr_intercept(b, a)::numeric(20,10) FROM aggtest;
--Testcase 28:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 691:
SELECT covar_pop(b, a)::numeric(20,10), covar_samp(b, a)::numeric(20,10) FROM aggtest;
--Testcase 29:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 692:
SELECT corr(b, a)::numeric(20,10) FROM aggtest;
-- check single-tuple behavior
--Testcase 350:
CREATE FOREIGN TABLE agg_t7(a float8, b float8, c float8, d float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 351:
DELETE FROM agg_t7;
--Testcase 352:
INSERT INTO agg_t7 VALUES (1, 2, 3, 4);
--Testcase 353:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 354:
DELETE FROM agg_t7;
--Testcase 355:
INSERT INTO agg_t7 VALUES (1, 'inf', 3, 'inf');
--Testcase 356:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 357:
DELETE FROM agg_t7;
--Testcase 358:
INSERT INTO agg_t7 VALUES (1, 'nan', 3, 'nan');
--Testcase 359:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
-- test accum and combine functions directly
--Testcase 360:
CREATE FOREIGN TABLE regr_test (x float8, y float8, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 361:
DELETE FROM regr_test;
--Testcase 362:
INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
--Testcase 363:
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);
--Testcase 364:
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 590:
EXPLAIN (VERBOSE, COSTS OFF)
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);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 365:
CREATE FOREIGN TABLE agg_t15 (a text, b int, c int, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 366:
delete from agg_t15;
--Testcase 367:
insert into agg_t15 values ('{4,140,2900}', 100);
--Testcase 368:
SELECT float8_accum(a::float8[], b) from agg_t15;
--Testcase 369:
delete from agg_t15;
--Testcase 370:
insert into agg_t15 values ('{4,140,2900,1290,83075,15050}', 200, 100);
--Testcase 371:
SELECT float8_regr_accum(a::float8[], b, c) from agg_t15;
--Testcase 372:
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);
--Testcase 373:
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);
--Testcase 374:
CREATE FOREIGN TABLE agg_t16 (a text, b text, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 375:
delete from agg_t16;
--Testcase 376:
insert into agg_t16 values ('{3,60,200}', '{0,0,0}');
--Testcase 377:
insert into agg_t16 values ('{0,0,0}', '{2,180,200}');
--Testcase 378:
insert into agg_t16 values ('{3,60,200}', '{2,180,200}');
--Testcase 379:
SELECT float8_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 380:
delete from agg_t16;
--Testcase 381:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{0,0,0,0,0,0}');
--Testcase 382:
insert into agg_t16 values ('{0,0,0,0,0,0}', '{2,180,200,740,57800,-3400}');
--Testcase 383:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{2,180,200,740,57800,-3400}');
--Testcase 384:
SELECT float8_regr_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 385:
DROP FOREIGN TABLE regr_test;
-- test count, distinct
--Testcase 30:
SELECT count(four) AS cnt_1000 FROM onek;
--Testcase 31:
SELECT count(DISTINCT four) AS cnt_4 FROM onek;
--Testcase 32:
select ten, count(*), sum(four) from onek
group by ten order by ten;
--Testcase 33:
select ten, count(four), sum(DISTINCT four) from onek
group by ten order by ten;
-- user-defined aggregates
--Testcase 386:
CREATE AGGREGATE newavg (
sfunc = int4_avg_accum, basetype = int4, stype = _int8,
finalfunc = int8_avg,
initcond1 = '{0,0}'
);
--Testcase 387:
CREATE AGGREGATE newsum (
sfunc1 = int4pl, basetype = int4, stype1 = int4,
initcond1 = '0'
);
--Testcase 388:
CREATE AGGREGATE newcnt (*) (
sfunc = int8inc, stype = int8,
initcond = '0', parallel = safe
);
--Testcase 389:
CREATE AGGREGATE newcnt ("any") (
sfunc = int8inc_any, stype = int8,
initcond = '0'
);
--Testcase 390:
CREATE AGGREGATE oldcnt (
sfunc = int8inc, basetype = 'ANY', stype = int8,
initcond = '0'
);
--Testcase 391:
create function sum3(int8,int8,int8) returns int8 as
'select $1 + $2 + $3' language sql strict immutable;
--Testcase 392:
create aggregate sum2(int8,int8) (
sfunc = sum3, stype = int8,
initcond = '0'
);
--Testcase 34:
SELECT newavg(four) AS avg_1 FROM onek;
--Testcase 35:
SELECT newsum(four) AS sum_1500 FROM onek;
--Testcase 36:
SELECT newcnt(four) AS cnt_1000 FROM onek;
--Testcase 37:
SELECT newcnt(*) AS cnt_1000 FROM onek;
--Testcase 38:
SELECT oldcnt(*) AS cnt_1000 FROM onek;
--Testcase 39:
SELECT sum2(q1,q2) FROM int8_tbl;
-- test for outer-level aggregates
-- this should work
--Testcase 40:
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
--Testcase 41:
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.
--Testcase 42:
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.
--Testcase 393:
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;
--Testcase 394:
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;
--Testcase 395:
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;
--Testcase 396:
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
--
--Testcase 397:
CREATE FOREIGN TABLE bitwise_test(
i2 INT2,
i4 INT4,
i8 INT8,
i INTEGER,
x INT2
) SERVER sqlite_svr;
-- empty case
--Testcase 43:
SELECT
BIT_AND(i2) AS "?",
BIT_OR(i4) AS "?",
BIT_XOR(i8) AS "?"
FROM bitwise_test;
--Testcase 44:
INSERT INTO bitwise_test VALUES
(1, 1, 1, 1, 1),
(3, 3, 3, null, 2),
(7, 7, 7, 3, 4);
--Testcase 45:
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_OR(i2) AS "7",
BIT_OR(i4) AS "7",
BIT_OR(i8) AS "7",
BIT_OR(i) AS "?",
BIT_OR(x) AS "7",
BIT_XOR(i2) AS "5",
BIT_XOR(i4) AS "5",
BIT_XOR(i8) AS "5",
BIT_XOR(i) AS "?",
BIT_XOR(x) AS "7"
FROM bitwise_test;
--
-- test boolean aggregates
--
-- first test all possible transition and final states
--Testcase 398:
CREATE FOREIGN TABLE bool_test_tmp(
b1 BOOL OPTIONS (key 'true'),
b2 BOOL OPTIONS (key 'true')
) SERVER sqlite_svr;
-- boolean and transitions
-- null because strict
BEGIN;
--Testcase 399:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 400:
SELECT booland_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- and actual computations
BEGIN;
--Testcase 401:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE);
--Testcase 402:
SELECT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 403:
INSERT INTO bool_test_tmp VALUES
(TRUE, FALSE),
(FALSE, TRUE),
(FALSE, FALSE);
--Testcase 404:
SELECT NOT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
-- boolean or transitions
-- null because strict
BEGIN;
--Testcase 405:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 406:
SELECT boolor_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- actual computations
BEGIN;
--Testcase 407:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE),
(TRUE, FALSE),
(FALSE, TRUE);
--Testcase 408:
SELECT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 409:
INSERT INTO bool_test_tmp VALUES
(FALSE, FALSE);
--Testcase 410:
SELECT NOT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
--Testcase 411:
CREATE FOREIGN TABLE bool_test(
b1 BOOL,
b2 BOOL,
b3 BOOL,
b4 BOOL
) SERVER sqlite_svr;
-- empty case
--Testcase 46:
SELECT
BOOL_AND(b1) AS "n",
BOOL_OR(b3) AS "n"
FROM bool_test;
--Testcase 47:
INSERT INTO bool_test VALUES
(TRUE, null, FALSE, null),
(FALSE, TRUE, null, null),
(null, TRUE, FALSE, null);
--Testcase 48:
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;
--Testcase 49:
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;
--Testcase 50:
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
--Testcase 51:
explain (costs off)
select min(unique1) from tenk1;
--Testcase 52:
select min(unique1) from tenk1;
--Testcase 53:
explain (costs off)
select max(unique1) from tenk1;
--Testcase 54:
select max(unique1) from tenk1;
--Testcase 55:
explain (costs off)
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 56:
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 57:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42;
--Testcase 58:
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;
--Testcase 628:
set local max_parallel_workers_per_gather = 0;
--Testcase 59:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42000;
--Testcase 60:
select max(unique1) from tenk1 where unique1 > 42000;
rollback;
-- multi-column index (uses tenk1_thous_tenthous)
--Testcase 61:
explain (costs off)
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 62:
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 63:
explain (costs off)
select min(tenthous) from tenk1 where thousand = 33;
--Testcase 64:
select min(tenthous) from tenk1 where thousand = 33;
-- check parameter propagation into an indexscan subquery
--Testcase 65:
explain (costs off)
select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
from int4_tbl;
--Testcase 66:
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
--Testcase 67:
explain (costs off)
select distinct max(unique2) from tenk1;
--Testcase 68:
select distinct max(unique2) from tenk1;
--Testcase 69:
explain (costs off)
select max(unique2) from tenk1 order by 1;
--Testcase 70:
select max(unique2) from tenk1 order by 1;
--Testcase 71:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2);
--Testcase 72:
select max(unique2) from tenk1 order by max(unique2);
--Testcase 73:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 74:
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 75:
explain (costs off)
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
--Testcase 76:
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
-- interesting corner case: constant gets optimized into a seqscan
--Testcase 77:
explain (costs off)
select max(100) from tenk1;
--Testcase 78:
select max(100) from tenk1;
-- try it on an inheritance tree
--Testcase 412:
create foreign table minmaxtest(f1 int) server sqlite_svr;
--Testcase 413:
create table minmaxtest1() inherits (minmaxtest);
--Testcase 414:
create table minmaxtest2() inherits (minmaxtest);
--Testcase 415:
create table minmaxtest3() inherits (minmaxtest);
--Testcase 416:
create index minmaxtest1i on minmaxtest1(f1);
--Testcase 417:
create index minmaxtest2i on minmaxtest2(f1 desc);
--Testcase 418:
create index minmaxtest3i on minmaxtest3(f1) where f1 is not null;
--Testcase 79:
insert into minmaxtest values(11), (12);
--Testcase 80:
insert into minmaxtest1 values(13), (14);
--Testcase 81:
insert into minmaxtest2 values(15), (16);
--Testcase 82:
insert into minmaxtest3 values(17), (18);
--Testcase 83:
explain (costs off)
select min(f1), max(f1) from minmaxtest;
--Testcase 84:
select min(f1), max(f1) from minmaxtest;
-- DISTINCT doesn't do anything useful here, but it shouldn't fail
--Testcase 85:
explain (costs off)
select distinct min(f1), max(f1) from minmaxtest;
--Testcase 86:
select distinct min(f1), max(f1) from minmaxtest;
-- check for correct detection of nested-aggregate errors
--Testcase 87:
select max(min(unique1)) from tenk1;
--Testcase 88:
select (select max(min(unique1)) from int8_tbl) from tenk1;
--Testcase 719:
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
--
--Testcase 419:
create foreign table agg_t1 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int, d int) server sqlite_svr;
--Testcase 420:
create foreign table agg_t2 (x int OPTIONS (key 'true'), y int OPTIONS (key 'true'), z int) server sqlite_svr;
--Testcase 421:
create foreign table agg_t9 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int) server sqlite_svr;
-- Non-primary-key columns can be removed from GROUP BY
--Testcase 89:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- No removal can happen if the complete PK is not present in GROUP BY
--Testcase 90:
explain (costs off) select a,c from agg_t1 group by a,c,d;
-- Test removal across multiple relations
--Testcase 91:
explain (costs off) select *
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.y,agg_t2.z;
-- Test case where agg_t1 can be optimized but not agg_t2
--Testcase 92:
explain (costs off) select agg_t1.*,agg_t2.x,agg_t2.z
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.z;
-- Cannot optimize when PK is deferrable
--Testcase 422:
explain (costs off) select * from agg_t9 group by a,b,c;
--Testcase 423:
create temp table t1c () inherits (agg_t1);
-- Ensure we don't remove any columns when t1 has a child table
--Testcase 424:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- Okay to remove columns if we're only querying the parent.
--Testcase 425:
explain (costs off) select * from only agg_t1 group by a,b,c,d;
-- Skip this test, sqlite_fdw does not support partition table
--create foreign table p_t1 (
-- a int options (key 'true'),
-- b int options (key 'true'),
-- c int,
-- d int,
--) partition by list(a) server sqlite_svr;
--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
--
--Testcase 426:
create foreign table t1(f1 int, f2 int) server sqlite_svr;
--Testcase 427:
create foreign table t2(f1 bigint, f2 oid) server sqlite_svr;
--Testcase 428:
select f1 from t1 left join t2 using (f1) group by f1;
--Testcase 429:
select f1 from t1 left join t2 using (f1) group by t1.f1;
--Testcase 430:
select t1.f1 from t1 left join t2 using (f1) group by t1.f1;
-- only this one should fail:
--Testcase 431:
select t1.f1 from t1 left join t2 using (f1) group by f1;
-- check case where we have to inject nullingrels into coerced join alias
--Testcase 720:
select f1, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f1)) on (x0 = 0)
group by f1;
-- same, for a RelabelType coercion
--Testcase 721:
select f2, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f2)) on (x0 = 0)
group by f2;
--Testcase 432:
drop foreign table t1, t2;
--
-- Test planner's selection of pathkeys for ORDER BY aggregates
--
-- Ensure we order by four. This suits the most aggregate functions.
--Testcase 722:
explain (costs off)
select sum(two order by two),max(four order by four), min(four order by four)
from tenk1;
-- Ensure we order by two. It's a tie between ordering by two and four but
-- we tiebreak on the aggregate's position.
--Testcase 723:
explain (costs off)
select
sum(two order by two), max(four order by four),
min(four order by four), max(two order by two)
from tenk1;
-- Similar to above, but tiebreak on ordering by four
--Testcase 724:
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two)
from tenk1;
-- Ensure this one orders by ten since there are 3 aggregates that require ten
-- vs two that suit two and four.
--Testcase 725:
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two),
sum(ten order by ten), min(ten order by ten), max(ten order by ten)
from tenk1;
-- Try a case involving a GROUP BY clause where the GROUP BY column is also
-- part of an aggregate's ORDER BY clause. We want a sort order that works
-- for the GROUP BY along with the first and the last aggregate.
--Testcase 726:
explain (costs off)
select
sum(unique1 order by ten, two), sum(unique1 order by four),
sum(unique1 order by two, four)
from tenk1
group by ten;
-- Ensure that we never choose to provide presorted input to an Aggref with
-- a volatile function in the ORDER BY / DISTINCT clause. We want to ensure
-- these sorts are performed individually rather than at the query level.
--Testcase 727:
explain (costs off)
select
sum(unique1 order by two), sum(unique1 order by four),
sum(unique1 order by four, two), sum(unique1 order by two, random()),
sum(unique1 order by two, random(), random() + 1)
from tenk1
group by ten;
-- Ensure consecutive NULLs are properly treated as distinct from each other
--Testcase 728:
select array_agg(distinct val)
from (select null as val from generate_series(1, 2));
-- Ensure no ordering is requested when enable_presorted_aggregate is off
set enable_presorted_aggregate to off;
--Testcase 729:
explain (costs off)
select sum(two order by two) from tenk1;
reset enable_presorted_aggregate;
--
-- Test combinations of DISTINCT and/or ORDER BY
--
begin;
--Testcase 93:
delete from INT8_TBL;
--Testcase 94:
insert into INT8_TBL values (1,4),(2,3),(3,1),(4,2);
--Testcase 95:
select array_agg(q1 order by q2)
from INT8_TBL;
--Testcase 96:
select array_agg(q1 order by q1)
from INT8_TBL;
--Testcase 97:
select array_agg(q1 order by q1 desc)
from INT8_TBL;
--Testcase 98:
select array_agg(q2 order by q1 desc)
from INT8_TBL;
--Testcase 99:
delete from INT4_TBL;
--Testcase 100:
insert into INT4_TBL values (1),(2),(1),(3),(null),(2);
--Testcase 101:
select array_agg(distinct f1)
from INT4_TBL;
--Testcase 102:
select array_agg(distinct f1 order by f1)
from INT4_TBL;
--Testcase 103:
select array_agg(distinct f1 order by f1 desc)
from INT4_TBL;
--Testcase 104:
select array_agg(distinct f1 order by f1 desc nulls last)
from INT4_TBL;
rollback;
-- multi-arg aggs, strict/nonstrict, distinct/order by
--Testcase 433:
create type aggtype as (a integer, b integer, c text);
--Testcase 434:
create function aggf_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql strict immutable;
--Testcase 435:
create function aggfns_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql immutable;
--Testcase 436:
create aggregate aggfstr(integer,integer,text) (
sfunc = aggf_trans, stype = aggtype[],
initcond = '{}'
);
--Testcase 437:
create aggregate aggfns(integer,integer,text) (
sfunc = aggfns_trans, stype = aggtype[], sspace = 10000,
initcond = '{}'
);
begin;
--Testcase 105:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 106:
select aggfstr(a,b,c) from multi_arg_agg;
--Testcase 107:
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 108:
select aggfstr(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 109:
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 110:
select aggfstr(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 111:
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
-- test specific code paths
--Testcase 112:
select aggfns(distinct a,a,c order by c using ~<~,a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 113:
select aggfns(distinct a,a,c order by c using ~<~) from multi_arg_agg, generate_series(1,2) i;
--Testcase 114:
select aggfns(distinct a,a,c order by a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 115:
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
-- check node I/O via view creation and usage, also deparsing logic
--Testcase 438:
create view agg_view1 as
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 116:
select * from agg_view1;
--Testcase 117:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 439:
create or replace view agg_view1 as
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 118:
select * from agg_view1;
--Testcase 119:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 440:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 120:
select * from agg_view1;
--Testcase 121:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 441:
create or replace view agg_view1 as
select aggfns(a,b,c order by b+1) from multi_arg_agg;
--Testcase 122:
select * from agg_view1;
--Testcase 123:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 442:
create or replace view agg_view1 as
select aggfns(a,a,c order by b) from multi_arg_agg;
--Testcase 124:
select * from agg_view1;
--Testcase 125:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 443:
create or replace view agg_view1 as
select aggfns(a,b,c order by c using ~<~) from multi_arg_agg;
--Testcase 126:
select * from agg_view1;
--Testcase 127:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 444:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
--Testcase 128:
select * from agg_view1;
--Testcase 129:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 445:
drop view agg_view1;
rollback;
-- incorrect DISTINCT usage errors
--Testcase 130:
insert into multi_arg_agg values (1,1,'foo');
--Testcase 131:
select aggfns(distinct a,b,c order by i) from multi_arg_agg, generate_series(1,2) i;
--Testcase 132:
select aggfns(distinct a,b,c order by a,b+1) from multi_arg_agg, generate_series(1,2) i;
--Testcase 133:
select aggfns(distinct a,b,c order by a,b,i,c) from multi_arg_agg, generate_series(1,2) i;
--Testcase 134:
select aggfns(distinct a,a,c order by a,b) from multi_arg_agg, generate_series(1,2) i;
-- string_agg tests
begin;
--Testcase 135:
delete from varchar_tbl;
--Testcase 136:
insert into varchar_tbl values ('aaaa'),('bbbb'),('cccc');
--Testcase 137:
select string_agg(f1,',') from varchar_tbl;
--Testcase 138:
delete from varchar_tbl;
--Testcase 139:
insert into varchar_tbl values ('aaaa'),(null),('bbbb'),('cccc');
--Testcase 140:
select string_agg(f1,',') from varchar_tbl;
--Testcase 141:
delete from varchar_tbl;
--Testcase 142:
insert into varchar_tbl values (null),(null),('bbbb'),('cccc');
--Testcase 143:
select string_agg(f1,'AB') from varchar_tbl;
--Testcase 144:
delete from varchar_tbl;
--Testcase 145:
insert into varchar_tbl values (null),(null);
--Testcase 146:
select string_agg(f1,',') from varchar_tbl;
rollback;
-- check some implicit casting cases, as per bug #5564
--Testcase 147:
select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok
--Testcase 148:
select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok
--Testcase 149:
select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok
--Testcase 150:
select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok
-- string_agg bytea tests
--Testcase 446:
create foreign table bytea_test_table(v bytea) server sqlite_svr;
--Testcase 151:
select string_agg(v, '') from bytea_test_table;
--Testcase 152:
insert into bytea_test_table values(decode('ff','hex'));
--Testcase 153:
select string_agg(v, '') from bytea_test_table;
--Testcase 154:
insert into bytea_test_table values(decode('aa','hex'));
--Testcase 155:
select string_agg(v, '') from bytea_test_table;
--Testcase 156:
select string_agg(v, NULL) from bytea_test_table;
--Testcase 157:
select string_agg(v, decode('ee', 'hex')) from bytea_test_table;
--Testcase 447:
drop foreign table bytea_test_table;
-- Test parallel string_agg and array_agg
--Testcase 730:
create foreign table pagg_test (x int, y int) server sqlite_svr;
--Testcase 731:
insert into pagg_test
select (case x % 4 when 1 then null else x end), x % 10
from generate_series(1,5000) x;
set parallel_setup_cost TO 0;
set parallel_tuple_cost TO 0;
set parallel_leader_participation TO 0;
set min_parallel_table_scan_size = 0;
set bytea_output = 'escape';
set max_parallel_workers_per_gather = 2;
-- create a view as we otherwise have to repeat this query a few times.
--Testcase 732:
create view v_pagg_test AS
select
y,
min(t) AS tmin,max(t) AS tmax,count(distinct t) AS tndistinct,
min(b) AS bmin,max(b) AS bmax,count(distinct b) AS bndistinct,
min(a) AS amin,max(a) AS amax,count(distinct a) AS andistinct,
min(aa) AS aamin,max(aa) AS aamax,count(distinct aa) AS aandistinct
from (
select
y,
unnest(regexp_split_to_array(a1.t, ','))::int AS t,
unnest(regexp_split_to_array(a1.b::text, ',')) AS b,
unnest(a1.a) AS a,
unnest(a1.aa) AS aa
from (
select
y,
string_agg(x::text, ',') AS t,
string_agg(x::text::bytea, ',') AS b,
array_agg(x) AS a,
array_agg(ARRAY[x]) AS aa
from pagg_test
group by y
) a1
) a2
group by y;
-- Ensure results are correct.
--Testcase 733:
select * from v_pagg_test order by y;
-- Ensure parallel aggregation is actually being used.
--Testcase 734:
explain (costs off) select * from v_pagg_test order by y;
set max_parallel_workers_per_gather = 0;
-- Ensure results are the same without parallel aggregation.
--Testcase 735:
select * from v_pagg_test order by y;
-- Clean up
reset max_parallel_workers_per_gather;
reset bytea_output;
reset min_parallel_table_scan_size;
reset parallel_leader_participation;
reset parallel_tuple_cost;
reset parallel_setup_cost;
--Testcase 736:
drop view v_pagg_test;
--Testcase 737:
drop foreign table pagg_test;
-- FILTER tests
--Testcase 158:
select min(unique1) filter (where unique1 > 100) from tenk1;
--Testcase 159:
select sum(1/ten) filter (where ten > 0) from tenk1;
--Testcase 160:
select ten, sum(distinct four) filter (where four::text ~ '123') from onek a
group by ten;
--Testcase 161:
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);
--Testcase 448:
create foreign table agg_t17(foo text, bar text) server sqlite_svr;
--Testcase 449:
insert into agg_t17 values ('a', 'b');
--Testcase 450:
select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0')
from agg_t17;
--Testcase 738:
create foreign table agg_t170(v int) server sqlite_svr;
--Testcase 739:
insert into agg_t170(v) values (1), (2), (3);
--Testcase 740:
select any_value(v) filter (where v > 2) from agg_t170;
-- outer reference in FILTER (PostgreSQL extension)
--Testcase 451:
create foreign table agg_t18 (inner_c int) server sqlite_svr;
--Testcase 452:
create foreign table agg_t19 (outer_c int) server sqlite_svr;
--Testcase 453:
insert into agg_t18 values (1);
--Testcase 454:
insert into agg_t19 values (2), (3);
--Testcase 455:
select (select count(*)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 456:
select (select count(*) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- outer query is aggregation query
--Testcase 457:
select (select count(inner_c) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 162:
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)
--Testcase 163:
select sum(unique1) FILTER (WHERE
unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1;
-- exercise lots of aggregate parts with FILTER
begin;
--Testcase 164:
delete from multi_arg_agg;
--Testcase 165:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 166:
select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) from multi_arg_agg, generate_series(1,2) i;
rollback;
-- check handling of bare boolean Var in FILTER
--Testcase 672:
select max(0) filter (where b1) from bool_test;
--Testcase 673:
select (select max(0) filter (where b1)) from bool_test;
-- check for correct detection of nested-aggregate errors in FILTER
--Testcase 674:
select max(unique1) filter (where sum(ten) > 0) from tenk1;
--Testcase 675:
select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1;
--Testcase 676:
select max(unique1) filter (where bool_or(ten > 0)) from tenk1;
--Testcase 677:
select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1;
-- ordered-set aggregates
begin;
--Testcase 167:
delete from FLOAT8_TBL;
--Testcase 168:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 169:
select f1, percentile_cont(f1) within group (order by x::float8)
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 170:
delete from FLOAT8_TBL;
--Testcase 171:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 172:
select f1, percentile_cont(f1 order by f1) within group (order by x) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 173:
delete from FLOAT8_TBL;
--Testcase 174:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 175:
select f1, sum() within group (order by x::float8) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 176:
delete from FLOAT8_TBL;
--Testcase 177:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 178:
select f1, percentile_cont(f1,f1) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
--Testcase 179:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 693:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10) from aggtest;
--Testcase 180:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 694:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10), sum(b)::numeric(10,3) from aggtest;
--Testcase 181:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 695:
select percentile_cont(0.5) within group (order by thousand) from tenk1;
--Testcase 182:
select percentile_disc(0.5) within group (order by thousand) from tenk1;
begin;
--Testcase 183:
delete from INT4_TBL;
--Testcase 184:
insert into INT4_TBL values (1),(1),(2),(2),(3),(3),(4);
--Testcase 185:
select rank(3) within group (order by f1) from INT4_TBL;
--Testcase 186:
select cume_dist(3) within group (order by f1) from INT4_TBL;
--Testcase 187:
insert into INT4_TBL values (5);
--Testcase 458:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 696:
select (percent_rank(3) within group (order by f1))::numeric(20,10) from INT4_TBL;
--Testcase 459:
delete from INT4_TBL where f1 = 5;
--Testcase 188:
select dense_rank(3) within group (order by f1) from INT4_TBL;
rollback;
--Testcase 189:
select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand)
from tenk1;
--Testcase 190:
select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand)
from tenk1;
--Testcase 191:
select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand)
from tenk1;
--Testcase 460:
create foreign table agg_t21 (x int) server sqlite_svr;
begin;
--Testcase 248:
insert into agg_t21 select * from generate_series(1,6);
--Testcase 249:
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 agg_t21;
rollback;
--Testcase 192:
select ten, mode() within group (order by string4) from tenk1 group by ten;
--Testcase 461:
create foreign table agg_t20 (x text) server sqlite_svr;
begin;
--Testcase 462:
insert into agg_t20 values (unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]));
--Testcase 463:
select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) from agg_t20;
rollback;
-- check collation propagates up in suitable cases:
begin;
--Testcase 464:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 465:
select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) from agg_t20;
rollback;
-- ordered-set aggs created with CREATE AGGREGATE
--Testcase 466:
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
);
--Testcase 467:
create aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") (
stype = internal,
sfunc = ordered_set_transition_multi,
finalfunc = rank_final,
finalfunc_extra = true,
hypothetical
);
--Testcase 633:
alter aggregate my_percentile_disc(float8 ORDER BY anyelement)
rename to test_percentile_disc;
--Testcase 634:
alter aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any")
rename to test_rank;
begin;
--Testcase 468:
insert into agg_t21 values (1),(1),(2),(2),(3),(3),(4);
--Testcase 469:
select test_rank(3) within group (order by x) from agg_t21;
rollback;
--Testcase 193:
select test_percentile_disc(0.5) within group (order by thousand) from tenk1;
-- ordered-set aggs can't use ungrouped vars in direct args:
begin;
--Testcase 470:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 471:
select rank(x) within group (order by x) from agg_t21;
rollback;
-- outer-level agg can't use a grouped arg of a lower level, either:
begin;
--Testcase 472:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 473:
select array(select percentile_disc(a) within group (order by x)
from (values (0.3),(0.7)) v(a) group by a)
from agg_t21;
rollback;
-- agg in the direct args is a grouping violation, too:
begin;
--Testcase 474:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 475:
select rank(sum(x)) within group (order by x) from agg_t21;
rollback;
-- hypothetical-set type unification and argument-count failures:
begin;
--Testcase 264:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 265:
select rank(3) within group (order by x) from agg_t20;
rollback;
--Testcase 194:
select rank(3) within group (order by stringu1,stringu2) from tenk1;
begin;
--Testcase 476:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 477:
select rank('fred') within group (order by x) from agg_t21;
rollback;
begin;
--Testcase 478:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 479:
select rank('adam'::text collate "C") within group (order by x collate "POSIX")
from agg_t20;
rollback;
-- hypothetical-set type unification successes:
begin;
--Testcase 480:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 481:
select rank('adam'::varchar) within group (order by x) from agg_t20;
rollback;
begin;
--Testcase 482:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 483:
select rank('3') within group (order by x) from agg_t21;
rollback;
-- divide by zero check
begin;
--Testcase 484:
insert into agg_t21 select * from generate_series(1,0);
--Testcase 485:
select percent_rank(0) within group (order by x) from agg_t21;
rollback;
-- deparse and multiple features:
--Testcase 486:
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;
--Testcase 196:
select pg_get_viewdef('aggordview1');
--Testcase 197:
select * from aggordview1 order by ten;
--Testcase 487:
drop view aggordview1;
-- variadic aggregates
--Testcase 488:
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)';
--Testcase 489:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
--Testcase 490:
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)';
--Testcase 491:
create aggregate cleast_agg(variadic items anycompatiblearray) (
stype = anycompatible, sfunc = cleast_accum);
--Testcase 198:
select least_agg(q1,q2) from int8_tbl;
--Testcase 199:
select least_agg(variadic array[q1,q2]) from int8_tbl;
--Testcase 492:
select cleast_agg(q1,q2) from int8_tbl;
--Testcase 493:
select cleast_agg(4.5,f1) from int4_tbl;
--Testcase 494:
select cleast_agg(variadic array[4.5,f1]) from int4_tbl;
--Testcase 495:
select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl;
-- test aggregates with common transition functions share the same states
--Testcase 496:
create foreign table agg_t10(one int, id int options (key 'true')) server sqlite_svr;
--Testcase 497:
create foreign table agg_t11(one int, two int, id int options (key 'true')) server sqlite_svr;
--Testcase 498:
create foreign table agg_t12(a int, id int options (key 'true')) server sqlite_svr;
begin work;
--Testcase 499:
create type avg_state as (total bigint, count bigint);
--Testcase 500:
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;
--Testcase 501:
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;
--Testcase 502:
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;
--Testcase 503:
create aggregate my_avg(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn
);
--Testcase 504:
create aggregate my_sum(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn
);
-- aggregate state should be shared as aggs are the same.
--Testcase 505:
delete from agg_t10;
--Testcase 506:
insert into agg_t10 values (1), (3);
--Testcase 507:
select my_avg(one),my_avg(one) from agg_t10;
-- aggregate state should be shared as transfn is the same for both aggs.
--Testcase 508:
select my_avg(one),my_sum(one) from agg_t10;
-- same as previous one, but with DISTINCT, which requires sorting the input.
--Testcase 509:
delete from agg_t10;
--Testcase 510:
insert into agg_t10 values (1), (3), (1);
--Testcase 511:
select my_avg(distinct one),my_sum(distinct one) from agg_t10;
-- shouldn't share states due to the distinctness not matching.
--Testcase 512:
delete from agg_t10;
--Testcase 513:
insert into agg_t10 values (1), (3);
--Testcase 514:
select my_avg(distinct one),my_sum(one) from agg_t10;
-- shouldn't share states due to the filter clause not matching.
--Testcase 515:
select my_avg(one) filter (where one > 1),my_sum(one) from agg_t10;
-- this should not share the state due to different input columns.
--Testcase 516:
delete from agg_t11;
--Testcase 517:
insert into agg_t11 values (1,2),(3,4);
--Testcase 518:
select my_avg(one),my_sum(two) from agg_t11;
-- exercise cases where OSAs share state
--Testcase 519:
delete from agg_t12;
--Testcase 520:
insert into agg_t12 values (1), (3), (5), (7);
--Testcase 521:
select
percentile_cont(0.5) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
--Testcase 522:
select
percentile_cont(0.25) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
-- these can't share state currently
--Testcase 523:
select
rank(4) within group (order by a),
dense_rank(4) within group (order by a)
from agg_t12;
-- test that aggs with the same sfunc and initcond share the same agg state
--Testcase 524:
create aggregate my_sum_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn,
initcond = '(10,0)'
);
--Testcase 525:
create aggregate my_avg_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn,
initcond = '(10,0)'
);
--Testcase 526:
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
--Testcase 527:
delete from agg_t10;
--Testcase 528:
insert into agg_t10 values (1), (3);
--Testcase 529:
select my_sum_init(one),my_avg_init(one) from agg_t10;
-- Varying INITCONDs should cause the states not to be shared.
--Testcase 530:
select my_sum_init(one),my_avg_init2(one) from agg_t10;
rollback;
-- test aggregate state sharing to ensure it works if one aggregate has a
-- finalfn and the other one has none.
begin work;
--Testcase 531:
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;
--Testcase 532:
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;
--Testcase 533:
create aggregate my_sum(int4)
(
stype = int4,
sfunc = sum_transfn
);
--Testcase 534:
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
--Testcase 535:
delete from agg_t10;
--Testcase 536:
insert into agg_t10 values (1), (2), (3), (4);
--Testcase 537:
select my_sum(one),my_half_sum(one) from agg_t10;
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;
--Testcase 538:
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$$;
--Testcase 539:
CREATE AGGREGATE balk(int4)
(
SFUNC = balkifnull(int8, int4),
STYPE = int8,
PARALLEL = SAFE,
INITCOND = '0'
);
--Testcase 200:
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;
--Testcase 540:
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$$;
--Testcase 541:
CREATE AGGREGATE balk(int4)
(
SFUNC = int4_sum(int8, int4),
STYPE = int8,
COMBINEFUNC = balkifnull(int8, int8),
PARALLEL = SAFE,
INITCOND = '0'
);
-- force use of parallelism
-- Skip this test, cannot alter foreign table tenk1
-- ALTER FOREIGN 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 multiple usage of an aggregate whose finalfn returns a R/W datum
BEGIN;
--Testcase 741:
CREATE FUNCTION rwagg_sfunc(x anyarray, y anyarray) RETURNS anyarray
LANGUAGE plpgsql IMMUTABLE AS $$
BEGIN
RETURN array_fill(y[1], ARRAY[4]);
END;
$$;
--Testcase 742:
CREATE FUNCTION rwagg_finalfunc(x anyarray) RETURNS anyarray
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
DECLARE
res x%TYPE;
BEGIN
-- assignment is essential for this test, it expands the array to R/W
res := array_fill(x[1], ARRAY[4]);
RETURN res;
END;
$$;
--Testcase 743:
CREATE AGGREGATE rwagg(anyarray) (
STYPE = anyarray,
SFUNC = rwagg_sfunc,
FINALFUNC = rwagg_finalfunc
);
--Testcase 744:
CREATE FUNCTION eatarray(x real[]) RETURNS real[]
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
BEGIN
x[1] := x[1] + 1;
RETURN x;
END;
$$;
--Testcase 745:
CREATE FOREIGN TABLE float_tb(f real) SERVER sqlite_svr;
--Testcase 746:
INSERT INTO float_tb(f) VALUES (1.0);
--Testcase 747:
SELECT eatarray(rwagg(ARRAY[f::real])), eatarray(rwagg(ARRAY[f::real])) FROM float_tb;
ROLLBACK;
-- test coverage for aggregate combine/serial/deserial functions
BEGIN;
--Testcase 635:
SET parallel_setup_cost = 0;
--Testcase 636:
SET parallel_tuple_cost = 0;
--Testcase 637:
SET min_parallel_table_scan_size = 0;
--Testcase 638:
SET max_parallel_workers_per_gather = 4;
--Testcase 639:
SET parallel_leader_participation = off;
--Testcase 640:
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
--Testcase 542:
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;
--Testcase 543:
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
--Testcase 544:
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;
--Testcase 545:
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
--Testcase 546:
create foreign table agg_t13(x int, id int options (key 'true')) server sqlite_svr;
--Testcase 547:
insert into agg_t13 values (1),(1),(2),(2),(3),(3);
--Testcase 548:
SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM agg_t13 GROUP BY (x) ORDER BY 1;
--Testcase 549:
delete from agg_t13;
-- 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
--Testcase 550:
create foreign table agg_t14(x int, y int, id int options (key 'true')) server sqlite_svr;
--Testcase 551:
insert into agg_t14 values (1, NULL), (1, 2);
--Testcase 552:
SELECT min(x ORDER BY y) FROM agg_t14;
--Testcase 553:
SELECT min(x ORDER BY y) FROM agg_t14;
-- check collation-sensitive matching between grouping expressions
begin;
--Testcase 554:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 555:
select x||'a', case x||'a' when 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
begin;
--Testcase 556:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 557:
select x||'a', case when x||'a' = 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
-- 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
--Testcase 641:
set enable_memoize to off;
--Testcase 558:
explain (costs off)
select 1 from tenk1
where (hundred, thousand) in (select twothousand, twothousand from onek);
--Testcase 642:
reset enable_memoize;
--
-- Hash Aggregation Spill tests
--
--Testcase 643:
set enable_sort=false;
--Testcase 644:
set work_mem='64kB';
--Testcase 559:
select unique1, count(*), sum(twothousand) from tenk1
group by unique1
having sum(fivethous) > 4975
order by sum(twothousand);
--Testcase 645:
set work_mem to default;
--Testcase 646:
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.
--
--Testcase 647:
set work_mem='64kB';
--Testcase 560:
create foreign table agg_data_2k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 561:
create foreign table agg_data_20k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 562:
create foreign table agg_group_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 563:
create foreign table agg_group_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 564:
create foreign table agg_group_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 565:
create foreign table agg_group_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 566:
create foreign table agg_hash_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 567:
create foreign table agg_hash_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 568:
create foreign table agg_hash_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 569:
create foreign table agg_hash_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 570:
insert into agg_data_2k select g from generate_series(0, 1999) g;
--analyze agg_data_2k;
--Testcase 571:
insert into agg_data_20k select g from generate_series(0, 19999) g;
--analyze agg_data_20k;
-- Produce results with sorting.
--Testcase 648:
set enable_hashagg = false;
--Testcase 649:
set jit_above_cost = 0;
--Testcase 572:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 573:
insert into agg_group_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 574:
insert into agg_group_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 650:
set jit_above_cost to default;
--Testcase 575:
insert into agg_group_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 576:
insert into agg_group_4
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
--Testcase 651:
set enable_hashagg = true;
--Testcase 652:
set enable_sort = false;
--Testcase 653:
set jit_above_cost = 0;
--Testcase 577:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 578:
insert into agg_hash_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 579:
insert into agg_hash_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 654:
set jit_above_cost to default;
--Testcase 580:
insert into agg_hash_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 581:
insert into agg_hash_4
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 655:
set enable_sort = true;
--Testcase 656:
set work_mem to default;
-- Compare group aggregation results to hash aggregation results
--Testcase 582:
(select * from agg_hash_1 except select * from agg_group_1)
union all
(select * from agg_group_1 except select * from agg_hash_1);
--Testcase 583:
(select * from agg_hash_2 except select * from agg_group_2)
union all
(select * from agg_group_2 except select * from agg_hash_2);
--Testcase 584:
(select * from agg_hash_3 except select * from agg_group_3)
union all
(select * from agg_group_3 except select * from agg_hash_3);
--Testcase 585:
(select * from agg_hash_4 except select * from agg_group_4)
union all
(select * from agg_group_4 except select * from agg_hash_4);
--Testcase 748:
DELETE FROM INT4_TBL;
--Testcase 749:
DELETE FROM INT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 586:
DROP SERVER sqlite_svr CASCADE;
--Testcase 587:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/encodings.sql
================================================
-- tests for PR #76 github
-- see https://www.postgresql.org/docs/current/multibyte.html
-- EUC_CN, not tested
-- EUC_JP
-- EUC_JIS_2004, not tested
-- EUC_KR
-- EUC_TW, not tested
-- ISO_8859_5
-- ISO_8859_6
-- ISO_8859_7
-- ISO_8859_8
-- KOI8R, not tested
-- KOI8U, not tested
-- LATIN1
-- LATIN2
-- LATIN3
-- LATIN4
-- LATIN5
-- LATIN6
-- LATIN7
-- LATIN8
-- LATIN9
-- LATIN10
-- MULE_INTERNAL, not tested
-- SQL_ASCII
-- WIN866, not tested
-- WIN874, not tested
-- WIN1250
-- WIN1251
-- WIN1252
-- WIN1253
-- WIN1254
-- WIN1255
-- WIN1256
-- WIN1257
-- WIN1258, not tested
-- ================
-- check all data in UTF8
-- ================
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
SELECT * FROM "Unicode data";
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
-- euc_jp
CREATE DATABASE "contrib_regression_EUC_JP" ENCODING EUC_JP LC_CTYPE='ja_JP.eucjp' LC_COLLATE='ja_JP.eucjp' template template0;
\connect "contrib_regression_EUC_JP"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_JP";
-- ko_KR.euckr
CREATE DATABASE "contrib_regression_EUC_KR" ENCODING EUC_KR LC_CTYPE='ko_KR.euckr' LC_COLLATE='ko_KR.euckr' template template0;
\connect "contrib_regression_EUC_KR"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_KR";
-- ISO_8859_5
CREATE DATABASE "contrib_regression_ISO_8859_5" ENCODING ISO_8859_5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_5";
-- ISO_8859_6
CREATE DATABASE "contrib_regression_ISO_8859_6" ENCODING ISO_8859_6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_6";
-- ISO_8859_7
CREATE DATABASE "contrib_regression_ISO_8859_7" ENCODING ISO_8859_7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_7";
-- ISO_8859_8
CREATE DATABASE "contrib_regression_ISO_8859_8" ENCODING ISO_8859_8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_8";
-- ISO_8859_9
CREATE DATABASE "contrib_regression_ISO_8859_9" ENCODING ISO_8859_9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_9";
-- LATIN1
CREATE DATABASE "contrib_regression_LATIN1" ENCODING LATIN1 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN1"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN1";
-- LATIN2
CREATE DATABASE "contrib_regression_LATIN2" ENCODING LATIN2 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN2"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN2";
-- LATIN3
CREATE DATABASE "contrib_regression_LATIN3" ENCODING LATIN3 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN3"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN3";
-- LATIN4
CREATE DATABASE "contrib_regression_LATIN4" ENCODING LATIN4 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN4"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN4";
-- LATIN5
CREATE DATABASE "contrib_regression_LATIN5" ENCODING LATIN5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN5";
-- LATIN6
CREATE DATABASE "contrib_regression_LATIN6" ENCODING LATIN6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN6";
-- LATIN7
CREATE DATABASE "contrib_regression_LATIN7" ENCODING LATIN7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN7";
-- LATIN8
CREATE DATABASE "contrib_regression_LATIN8" ENCODING LATIN8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN8";
-- LATIN9
CREATE DATABASE "contrib_regression_LATIN9" ENCODING LATIN9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN9";
-- LATIN10
CREATE DATABASE "contrib_regression_LATIN10" ENCODING LATIN10 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN10"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN10";
-- cp1250
CREATE DATABASE "contrib_regression_WIN1250" ENCODING WIN1250 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1250"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1250";
-- cp1251
CREATE DATABASE "contrib_regression_WIN1251" ENCODING WIN1251 LC_CTYPE='bg_BG' LC_COLLATE='bg_BG' template template0;
\connect "contrib_regression_WIN1251"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1251";
-- cp1252
CREATE DATABASE "contrib_regression_WIN1252" ENCODING WIN1252 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1252"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1252";
-- cp1253
CREATE DATABASE "contrib_regression_WIN1253" ENCODING WIN1253 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1253"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1253";
-- cp1254
CREATE DATABASE "contrib_regression_WIN1254" ENCODING WIN1254 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1254"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1254";
-- cp1255
CREATE DATABASE "contrib_regression_WIN1255" ENCODING WIN1255 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1255"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1255";
-- cp1256
CREATE DATABASE "contrib_regression_WIN1256" ENCODING WIN1256 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1256"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1256";
-- cp1257
CREATE DATABASE "contrib_regression_WIN1257" ENCODING WIN1257 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1257"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1257";
-- SQL_ASCII
CREATE DATABASE "contrib_regression_SQL_ASCII" ENCODING SQL_ASCII LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_SQL_ASCII"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_SQL_ASCII";
================================================
FILE: sql/16.3/extra/insert.sql
================================================
--
-- insert with DEFAULT in the target_list
--
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 18:
CREATE FOREIGN TABLE inserttest01 (col1 int4, col2 int4 NOT NULL, col3 text default 'testing') SERVER sqlite_svr;
--Testcase 1:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT);
--Testcase 2:
insert into inserttest01 (col2, col3) values (3, DEFAULT);
--Testcase 3:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, 5, DEFAULT);
--Testcase 4:
insert into inserttest01 values (DEFAULT, 5, 'test');
--Testcase 5:
insert into inserttest01 values (DEFAULT, 7);
--Testcase 6:
select * from inserttest01;
--
-- insert with similar expression / target_list values (all fail)
--
--Testcase 7:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT);
--Testcase 8:
insert into inserttest01 (col1, col2, col3) values (1, 2);
--Testcase 9:
insert into inserttest01 (col1) values (1, 2);
--Testcase 10:
insert into inserttest01 (col1) values (DEFAULT, DEFAULT);
--Testcase 11:
select * from inserttest01;
--
-- VALUES test
--
--Testcase 12:
insert into inserttest01 values(10, 20, '40'), (-1, 2, DEFAULT),
((select 2), (select i from (values(3)) as foo (i)), 'values are fun!');
--Testcase 13:
select * from inserttest01;
--
-- TOASTed value test
--
--Testcase 14:
insert into inserttest01 values(30, 50, repeat('x', 10000));
--Testcase 15:
select col1, col2, char_length(col3) from inserttest01;
--
-- tuple larger than fillfactor
-- foreign table does not support 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;
-- skip, sqlite fdw does not support customized type
/*
-- 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
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;
*/
-- drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 19:
DROP SERVER sqlite_svr;
--Testcase 20:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/join.sql
================================================
--
-- JOIN
-- Test JOIN clauses
--
--Testcase 360:
CREATE EXTENSION sqlite_fdw;
--Testcase 361:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 362:
CREATE FOREIGN TABLE J1_TBL (
i integer,
j integer,
t text
) SERVER sqlite_svr;
--Testcase 363:
CREATE FOREIGN TABLE J2_TBL (
i integer,
k integer
) SERVER sqlite_svr;
--Testcase 364:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 365:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 366:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 632:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 633:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 634:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 635:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 636:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 367:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 637:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 638:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 639:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 640:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 641:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
--Testcase 368:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 642:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 643:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 644:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 645:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 646:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 369:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO J1_TBL VALUES (1, 4, 'one');
--Testcase 2:
INSERT INTO J1_TBL VALUES (2, 3, 'two');
--Testcase 3:
INSERT INTO J1_TBL VALUES (3, 2, 'three');
--Testcase 4:
INSERT INTO J1_TBL VALUES (4, 1, 'four');
--Testcase 5:
INSERT INTO J1_TBL VALUES (5, 0, 'five');
--Testcase 6:
INSERT INTO J1_TBL VALUES (6, 6, 'six');
--Testcase 7:
INSERT INTO J1_TBL VALUES (7, 7, 'seven');
--Testcase 8:
INSERT INTO J1_TBL VALUES (8, 8, 'eight');
--Testcase 9:
INSERT INTO J1_TBL VALUES (0, NULL, 'zero');
--Testcase 10:
INSERT INTO J1_TBL VALUES (NULL, NULL, 'null');
--Testcase 11:
INSERT INTO J1_TBL VALUES (NULL, 0, 'zero');
--Testcase 12:
INSERT INTO J2_TBL VALUES (1, -1);
--Testcase 13:
INSERT INTO J2_TBL VALUES (2, 2);
--Testcase 14:
INSERT INTO J2_TBL VALUES (3, -3);
--Testcase 15:
INSERT INTO J2_TBL VALUES (2, 4);
--Testcase 16:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 17:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 18:
INSERT INTO J2_TBL VALUES (0, NULL);
--Testcase 19:
INSERT INTO J2_TBL VALUES (NULL, NULL);
--Testcase 20:
INSERT INTO J2_TBL VALUES (NULL, 0);
-- useful in some tests below
--Testcase 370:
create temp table onerow();
--Testcase 371:
insert into onerow default values;
analyze onerow;
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
--Testcase 21:
SELECT *
FROM J1_TBL AS tx;
--Testcase 22:
SELECT *
FROM J1_TBL tx;
--Testcase 23:
SELECT *
FROM J1_TBL AS t1 (a, b, c);
--Testcase 24:
SELECT *
FROM J1_TBL t1 (a, b, c);
--Testcase 25:
SELECT *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
--Testcase 26:
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.
--
--Testcase 27:
SELECT *
FROM J1_TBL CROSS JOIN J2_TBL;
-- ambiguous column
--Testcase 28:
SELECT i, k, t
FROM J1_TBL CROSS JOIN J2_TBL;
-- resolve previous ambiguity by specifying the table name
--Testcase 29:
SELECT t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
--Testcase 30:
SELECT ii, tt, kk
FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
--Testcase 31:
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);
--Testcase 32:
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
--Testcase 33:
SELECT *
FROM J1_TBL INNER JOIN J2_TBL USING (i);
-- Same as above, slightly different syntax
--Testcase 34:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i);
--Testcase 35:
SELECT *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a)
ORDER BY a, d;
--Testcase 36:
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
--Testcase 489:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) WHERE J1_TBL.t = 'one'; -- ok
--Testcase 490:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok
--Testcase 491:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error
--Testcase 492:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok
--Testcase 493:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error
--Testcase 494:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint)
--Testcase 495:
SELECT *
FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error
--Testcase 496:
SELECT x.*
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 497:
SELECT ROW(x.*)
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 498:
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
--
--Testcase 37:
SELECT *
FROM J1_TBL NATURAL JOIN J2_TBL;
--Testcase 38:
SELECT *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
--Testcase 39:
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
--Testcase 40:
SELECT *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
--
-- Inner joins (equi-joins)
--
--Testcase 41:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
--Testcase 42:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
--
-- Non-equi-joins
--
--Testcase 43:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
--
-- Outer joins
-- Note that OUTER is a noise word
--
--Testcase 44:
SELECT *
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 45:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 46:
SELECT *
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
--Testcase 47:
SELECT *
FROM J1_TBL RIGHT JOIN J2_TBL USING (i);
--Testcase 48:
SELECT *
FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 49:
SELECT *
FROM J1_TBL FULL JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 50:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1);
--Testcase 51:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1);
--
-- semijoin selectivity for <>
--
--Testcase 52:
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
--
--Testcase 372:
CREATE FOREIGN TABLE t11 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 373:
CREATE FOREIGN TABLE t21 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 374:
CREATE FOREIGN TABLE t31 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 483:
CREATE FOREIGN TABLE onek (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 53:
INSERT INTO t11 VALUES ( 'bb', 11 );
--Testcase 54:
INSERT INTO t21 VALUES ( 'bb', 12 );
--Testcase 55:
INSERT INTO t21 VALUES ( 'cc', 22 );
--Testcase 56:
INSERT INTO t21 VALUES ( 'ee', 42 );
--Testcase 57:
INSERT INTO t31 VALUES ( 'bb', 13 );
--Testcase 58:
INSERT INTO t31 VALUES ( 'cc', 23 );
--Testcase 59:
INSERT INTO t31 VALUES ( 'dd', 33 );
--Testcase 60:
SELECT * FROM t11 FULL JOIN t21 USING (name) FULL JOIN t31 USING (name);
--
-- Test interactions of join syntax and subqueries
--
-- Basic cases (we expect planner to pull up the subquery here)
--Testcase 61:
SELECT * FROM
(SELECT * FROM t21) as s2
INNER JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 62:
SELECT * FROM
(SELECT * FROM t21) as s2
LEFT JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 63:
SELECT * FROM
(SELECT * FROM t21) as s2
FULL JOIN
(SELECT * FROM t31) s3
USING (name);
-- Cases with non-nullable expressions in subquery results;
-- make sure these go to null as expected
--Testcase 64:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 65:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL LEFT JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 66:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 67:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL INNER JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 68:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL FULL JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 69:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
--Testcase 70:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
-- Constants as join keys can also be problematic
--Testcase 375:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
FULL JOIN
(SELECT name, 2 as s2_n FROM t21) as s2
ON (s1_n = s2_n);
-- Test for propagation of nullability constraints into sub-joins
--Testcase 376:
create foreign table x (x1 int, x2 int) server sqlite_svr;
--Testcase 71:
insert into x values (1,11);
--Testcase 72:
insert into x values (2,22);
--Testcase 73:
insert into x values (3,null);
--Testcase 74:
insert into x values (4,44);
--Testcase 75:
insert into x values (5,null);
--Testcase 377:
create foreign table y (y1 int, y2 int) server sqlite_svr;
--Testcase 76:
insert into y values (1,111);
--Testcase 77:
insert into y values (2,222);
--Testcase 78:
insert into y values (3,333);
--Testcase 79:
insert into y values (4,null);
--Testcase 80:
select * from x;
--Testcase 81:
select * from y;
--Testcase 82:
select * from x left join y on (x1 = y1 and x2 is not null);
--Testcase 83:
select * from x left join y on (x1 = y1 and y2 is not null);
--Testcase 84:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1);
--Testcase 85:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and x2 is not null);
--Testcase 86:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and y2 is not null);
--Testcase 87:
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
--Testcase 88:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (x2 is not null);
--Testcase 89:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (y2 is not null);
--Testcase 90:
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
--
--Testcase 91:
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
--
--Testcase 92:
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;
--Testcase 499:
set geqo = on;
--Testcase 500:
set geqo_threshold = 2;
--Testcase 93:
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
--
--Testcase 378:
create table b (aa int, bb int);
--Testcase 379:
explain (costs off)
select aa, bb, unique1, unique1
from tenk1 right join b on aa = unique1
where bb < bb and bb is null;
--Testcase 380:
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
--
--Testcase 94:
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;
--Testcase 95:
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()
-- used to give an imprecise result, causing an assertion failure
--
--Testcase 96:
select count(*)
from
(select t31.tenthous as x1, coalesce(t11.stringu1, t21.stringu1) as x2
from tenk1 t11
left join tenk1 t21 on t11.unique1 = t21.unique1
join tenk1 t31 on t11.unique2 = t31.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
--
--Testcase 97:
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;
--Testcase 98:
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;
--
-- checks for correct handling of quals in multiway outer joins
--
--Testcase 545:
explain (costs off)
select t1.f1
from int4_tbl t1, int4_tbl t2
left join int4_tbl t3 on t3.f1 > 0
left join int4_tbl t4 on t3.f1 > 1
where t4.f1 is null;
--Testcase 546:
select t1.f1
from int4_tbl t1, int4_tbl t2
left join int4_tbl t3 on t3.f1 > 0
left join int4_tbl t4 on t3.f1 > 1
where t4.f1 is null;
--Testcase 547:
explain (costs off)
select *
from int4_tbl t1 left join int4_tbl t2 on true
left join int4_tbl t3 on t2.f1 > 0
left join int4_tbl t4 on t3.f1 > 0;
--Testcase 548:
explain (costs off)
select * from onek t1
left join onek t2 on t1.unique1 = t2.unique1
left join onek t3 on t2.unique1 != t3.unique1
left join onek t4 on t3.unique1 = t4.unique1;
--Testcase 549:
explain (costs off)
select * from int4_tbl t1
left join (select now() from int4_tbl t2
left join int4_tbl t3 on t2.f1 = t3.f1
left join int4_tbl t4 on t3.f1 = t4.f1) s on true
inner join int4_tbl t5 on true;
--Testcase 550:
explain (costs off)
select * from int4_tbl t1
left join int4_tbl t2 on true
left join int4_tbl t3 on true
left join int4_tbl t4 on t2.f1 = t3.f1;
--Testcase 551:
explain (costs off)
select * from int4_tbl t1
left join int4_tbl t2 on true
left join int4_tbl t3 on t2.f1 = t3.f1
left join int4_tbl t4 on t3.f1 != t4.f1;
--Testcase 552:
explain (costs off)
select * from int4_tbl t1
left join (int4_tbl t2 left join int4_tbl t3 on t2.f1 > 0) on t2.f1 > 1
left join int4_tbl t4 on t2.f1 > 2 and t3.f1 > 3
where t1.f1 = coalesce(t2.f1, 1);
--Testcase 553:
explain (costs off)
select * from int4_tbl t1
left join ((select t2.f1 from int4_tbl t2
left join int4_tbl t3 on t2.f1 > 0
where t3.f1 is null) s
left join tenk1 t4 on s.f1 > 1)
on s.f1 = t1.f1;
--Testcase 554:
explain (costs off)
select * from int4_tbl t1
left join ((select t2.f1 from int4_tbl t2
left join int4_tbl t3 on t2.f1 > 0
where t2.f1 <> coalesce(t3.f1, -1)) s
left join tenk1 t4 on s.f1 > 1)
on s.f1 = t1.f1;
--Testcase 555:
explain (costs off)
select * from onek t1
left join onek t2 on t1.unique1 = t2.unique1
left join onek t3 on t2.unique1 = t3.unique1
left join onek t4 on t3.unique1 = t4.unique1 and t2.unique2 = t4.unique2;
--Testcase 556:
explain (costs off)
select * from int8_tbl t1 left join
(int8_tbl t2 left join int8_tbl t3 full join int8_tbl t4 on false on false)
left join int8_tbl t5 on t2.q1 = t5.q1
on t2.q2 = 123;
--Testcase 557:
explain (costs off)
select * from int8_tbl t1
left join int8_tbl t2 on true
left join lateral
(select * from int8_tbl t3 where t3.q1 = t2.q1 offset 0) s
on t2.q1 = 1;
--Testcase 558:
explain (costs off)
select * from int8_tbl t1
left join int8_tbl t2 on true
left join lateral
(select * from generate_series(t2.q1, 100)) s
on t2.q1 = 1;
--Testcase 559:
explain (costs off)
select * from int8_tbl t1
left join int8_tbl t2 on true
left join lateral
(select t2.q1 from int8_tbl t3) s
on t2.q1 = 1;
--Testcase 560:
explain (costs off)
select * from onek t1
left join onek t2 on true
left join lateral
(select * from onek t3 where t3.two = t2.two offset 0) s
on t2.unique1 = 1;
--
-- check a case where we formerly got confused by conflicting sort orders
-- in redundant merge join path keys
-- PS: Used ORDER BY to force SQLite and PG12 always order in the same way (NULLS FIRST/LAST default value for PG and Sqlite are different)
--
--Testcase 99:
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 ORDER BY j1_tbl.i, j2_tbl.k;
--Testcase 100:
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 BY j1_tbl.i, j2_tbl.k;
--
-- a different check for handling of redundant sort keys in merge joins
--
--Testcase 101:
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;
--Testcase 102:
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;
set enable_hashjoin = 0;
set enable_nestloop = 0;
set enable_hashagg = 0;
--
-- Check that we use the pathkeys from a prefix of the group by / order by
-- clause for the join pathkeys when that prefix covers all join quals. We
-- expect this to lead to an incremental sort for the group by / order by.
--
--Testcase 561:
explain (costs off)
select x.thousand, x.twothousand, count(*)
from tenk1 x inner join tenk1 y on x.thousand = y.thousand
group by x.thousand, x.twothousand
order by x.thousand desc, x.twothousand;
reset enable_hashagg;
reset enable_nestloop;
reset enable_hashjoin;
--
-- Clean up
--
--Testcase 381:
DROP FOREIGN TABLE t11;
--Testcase 382:
DROP FOREIGN TABLE t21;
--Testcase 383:
DROP FOREIGN TABLE t31;
--Testcase 384:
DROP FOREIGN TABLE J1_TBL;
--Testcase 385:
DROP FOREIGN TABLE J2_TBL;
-- Both DELETE and UPDATE allow the specification of additional tables
-- to "join" against to determine which rows should be modified.
--Testcase 386:
CREATE FOREIGN TABLE t12 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 387:
CREATE FOREIGN TABLE t22 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 388:
CREATE FOREIGN TABLE t32 (x int OPTIONS (key 'true'), y int) SERVER sqlite_svr;
--Testcase 103:
INSERT INTO t12 VALUES (5, 10);
--Testcase 104:
INSERT INTO t12 VALUES (15, 20);
--Testcase 105:
INSERT INTO t12 VALUES (100, 100);
--Testcase 106:
INSERT INTO t12 VALUES (200, 1000);
--Testcase 107:
INSERT INTO t22 VALUES (200, 2000);
--Testcase 108:
INSERT INTO t32 VALUES (5, 20);
--Testcase 109:
INSERT INTO t32 VALUES (6, 7);
--Testcase 110:
INSERT INTO t32 VALUES (7, 8);
--Testcase 111:
INSERT INTO t32 VALUES (500, 100);
--Testcase 112:
DELETE FROM t32 USING t12 table1 WHERE t32.x = table1.a;
--Testcase 113:
SELECT * FROM t32;
--Testcase 114:
DELETE FROM t32 USING t12 JOIN t22 USING (a) WHERE t32.x > t12.a;
--Testcase 115:
SELECT * FROM t32;
--Testcase 116:
DELETE FROM t32 USING t32 t3_other WHERE t32.x = t3_other.x AND t32.y = t3_other.y;
--Testcase 117:
SELECT * FROM t32;
-- Test join against inheritance tree
--Testcase 389:
create temp table t2a () inherits (t22);
--Testcase 118:
insert into t2a values (200, 2001);
--Testcase 119:
select * from t12 left join t22 on (t12.a = t22.a);
-- Test matching of column name with wrong alias
--Testcase 120:
select t12.x from t12 join t32 on (t12.a = t32.x);
-- Test matching of locking clause with wrong alias
--Testcase 540:
select t12.*, t22.*, unnamed_join.* from
t12 join t22 on (t12.a = t22.a), t32 as unnamed_join
for update of unnamed_join;
--Testcase 541:
select foo.*, unnamed_join.* from
t12 join t22 using (a) as foo, t32 as unnamed_join
for update of unnamed_join;
--Testcase 542:
select foo.*, unnamed_join.* from
t12 join t22 using (a) as foo, t32 as unnamed_join
for update of foo;
--Testcase 543:
select bar.*, unnamed_join.* from
(t12 join t22 using (a) as foo) as bar, t32 as unnamed_join
for update of foo;
--Testcase 544:
select bar.*, unnamed_join.* from
(t12 join t22 using (a) as foo) as bar, t32 as unnamed_join
for update of bar;
--Testcase 536:
drop table t2a;
--
-- regression test for 8.1 merge right join bug
--
--Testcase 390:
CREATE FOREIGN TABLE tt1 ( tt1_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO tt1 VALUES (1, 11);
--Testcase 122:
INSERT INTO tt1 VALUES (2, NULL);
--Testcase 391:
CREATE FOREIGN TABLE tt2 ( tt2_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 123:
INSERT INTO tt2 VALUES (21, 11);
--Testcase 124:
INSERT INTO tt2 VALUES (22, 11);
--Testcase 501:
set enable_hashjoin to off;
--Testcase 502:
set enable_nestloop to off;
-- these should give the same results
--Testcase 125:
select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol;
--Testcase 126:
select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol;
--Testcase 503:
reset enable_hashjoin;
--Testcase 504:
reset enable_nestloop;
--
-- regression test for bug #13908 (hash join with skew tuples & nbatch increase)
--
--Testcase 505:
set work_mem to '64kB';
--Testcase 506:
set enable_mergejoin to off;
--Testcase 507:
set enable_memoize to off;
--Testcase 127:
explain (costs off)
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 128:
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 508:
reset work_mem;
--Testcase 509:
reset enable_mergejoin;
--Testcase 510:
reset enable_memoize;
--
-- regression test for 8.2 bug with improper re-ordering of left joins
--
--Testcase 392:
create foreign table tt3(f1 int, f2 text) server sqlite_svr;
--Testcase 129:
insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x;
--Testcase 393:
create foreign table tt4(f1 int) server sqlite_svr;
--Testcase 130:
insert into tt4 values (0),(1),(9999);
set enable_nestloop to off;
--Testcase 562:
EXPLAIN (COSTS OFF)
SELECT a.f1
FROM tt4 a
LEFT JOIN (
SELECT b.f1
FROM tt3 b LEFT JOIN tt3 c ON (b.f1 = c.f1)
WHERE COALESCE(c.f1, 0) = 0
) AS d ON (a.f1 = d.f1)
WHERE COALESCE(d.f1, 0) = 0
ORDER BY 1;
--Testcase 563:
SELECT a.f1
FROM tt4 a
LEFT JOIN (
SELECT b.f1
FROM tt3 b LEFT JOIN tt3 c ON (b.f1 = c.f1)
WHERE COALESCE(c.f1, 0) = 0
) AS d ON (a.f1 = d.f1)
WHERE COALESCE(d.f1, 0) = 0
ORDER BY 1;
reset enable_nestloop;
--
-- basic semijoin and antijoin recognition tests
--
--Testcase 564:
explain (costs off)
select a.* from tenk1 a
where unique1 in (select unique2 from tenk1 b);
-- sadly, this is not an antijoin
--Testcase 565:
explain (costs off)
select a.* from tenk1 a
where unique1 not in (select unique2 from tenk1 b);
--Testcase 566:
explain (costs off)
select a.* from tenk1 a
where exists (select 1 from tenk1 b where a.unique1 = b.unique2);
--Testcase 567:
explain (costs off)
select a.* from tenk1 a
where not exists (select 1 from tenk1 b where a.unique1 = b.unique2);
--Testcase 568:
explain (costs off)
select a.* from tenk1 a left join tenk1 b on a.unique1 = b.unique2
where b.unique2 is null;
--
-- regression test for proper handling of outer joins within antijoins
--
--Testcase 394:
create foreign table tt4x(c1 int, c2 int, c3 int) server sqlite_svr;
--Testcase 132:
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
--
--Testcase 395:
create foreign table tt5(f1 int, f2 int) server sqlite_svr;
--Testcase 396:
create foreign table tt6(f1 int, f2 int) server sqlite_svr;
--Testcase 133:
insert into tt5 values(1, 10);
--Testcase 134:
insert into tt5 values(1, 11);
--Testcase 135:
insert into tt6 values(1, 9);
--Testcase 136:
insert into tt6 values(1, 2);
--Testcase 137:
insert into tt6 values(2, 9);
--Testcase 138:
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
--
--Testcase 397:
create foreign table xx (pkxx int) server sqlite_svr;
--Testcase 398:
create foreign table yy (pkyy int, pkxx int) server sqlite_svr;
--Testcase 139:
insert into xx values (1);
--Testcase 140:
insert into xx values (2);
--Testcase 141:
insert into xx values (3);
--Testcase 142:
insert into yy values (101, 1);
--Testcase 143:
insert into yy values (201, 2);
--Testcase 144:
insert into yy values (301, NULL);
--Testcase 145:
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)
--
--Testcase 399:
create foreign table zt1 (f1 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 400:
create foreign table zt2 (f2 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 401:
create foreign table zt3 (f3 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 146:
insert into zt1 values(53);
--Testcase 147:
insert into zt2 values(53);
--Testcase 148:
select * from
zt2 left join zt3 on (f2 = f3)
left join zt1 on (f3 = f1)
where f2 = 53;
--Testcase 402:
create temp view zv1 as select *,'dummy'::text AS junk from zt1;
--Testcase 149:
select * from
zt2 left join zt3 on (f2 = f3)
left join zv1 on (f3 = f1)
where f2 = 53;
--Testcase 537:
drop view zv1;
--
-- regression test for improper extraction of OR indexqual conditions
-- (as seen in early 8.3.x releases)
--
--Testcase 150:
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)
--
--Testcase 151:
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));
--Testcase 152:
execute foo(true);
--Testcase 153:
execute foo(false);
--
-- test for sane behavior with noncanonical merge clauses, per bug #4926
--
begin;
--Testcase 511:
set enable_mergejoin = 1;
--Testcase 512:
set enable_hashjoin = 0;
--Testcase 513:
set enable_nestloop = 0;
--Testcase 403:
create foreign table a1 (i integer) server sqlite_svr;
--Testcase 404:
create foreign table b1 (x integer, y integer) server sqlite_svr;
--Testcase 154:
select * from a1 left join b1 on i = x and i = y and x = i;
rollback;
-- skip this test, sqlite fdw does not support customized type
-- test handling of merge clauses using record_ops
--
--begin;
--create type mycomptype as (id int, v bigint);
--create foreign table tidv (idv mycomptype) server sqlite_svr;
--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;
--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
--
--Testcase 155:
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;
--Testcase 156:
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;
--Testcase 157:
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;
--Testcase 158:
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;
--Testcase 405:
create foreign table a2 (
code char OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 406:
create foreign table b2 (
a char OPTIONS (key 'true'),
num integer OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 407:
create foreign table c2 (
name char OPTIONS (key 'true'),
a char
) server sqlite_svr;
--Testcase 159:
insert into a2 (code) values ('p');
--Testcase 160:
insert into a2 (code) values ('q');
--Testcase 161:
insert into b2 (a, num) values ('p', 1);
--Testcase 162:
insert into b2 (a, num) values ('p', 2);
--Testcase 163:
insert into c2 (name, a) values ('A', 'p');
--Testcase 164:
insert into c2 (name, a) values ('B', 'q');
--Testcase 165:
insert into c2 (name, a) values ('C', null);
--Testcase 166:
select c2.name, ss.code, ss.b_cnt, ss.const
from c2 left join
(select a2.code, coalesce(b_grp.cnt, 0) as b_cnt, -1 as const
from a2 left join
(select count(1) as cnt, b2.a from b2 group by b2.a) as b_grp
on a2.code = b_grp.a
) as ss
on (c2.a = ss.code)
order by c2.name;
rollback;
--
-- test incorrect handling of placeholders that only appear in targetlists,
-- per bug #6154
--
--Testcase 408:
create foreign table sub_tbl (key1 int, key3 int, key5 int, key6 int, value1 int, id int options (key 'true')) server sqlite_svr;
--Testcase 409:
insert into sub_tbl values (1, 1, 1, 2, 42);
--Testcase 410:
SELECT * FROM
( SELECT key1 from sub_tbl) sub1
LEFT JOIN
( SELECT sub3.key3, sub4.value2, COALESCE(sub4.value2, 66) as value3 FROM
( SELECT key3 from sub_tbl) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl ) 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
--Testcase 411:
SELECT * FROM
( SELECT key1 from sub_tbl ) sub1
LEFT JOIN
( SELECT sub3.key3, value2, COALESCE(value2, 66) as value3 FROM
( SELECT key3 from sub_tbl ) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl ) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl) 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
--
--Testcase 167:
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;
--Testcase 168:
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
--
--Testcase 412:
create foreign table nt1 (
id int OPTIONS (key 'true'),
a1 boolean,
a2 boolean
) server sqlite_svr;
--Testcase 413:
create foreign table nt2 (
id int OPTIONS (key 'true'),
nt1_id int,
b1 boolean,
b2 boolean
) server sqlite_svr;
--Testcase 414:
create foreign table nt3 (
id int OPTIONS (key 'true'),
nt2_id int,
c1 boolean
) server sqlite_svr;
--Testcase 169:
insert into nt1 values (1,true,true);
--Testcase 170:
insert into nt1 values (2,true,false);
--Testcase 171:
insert into nt1 values (3,false,false);
--Testcase 172:
insert into nt2 values (1,1,true,true);
--Testcase 173:
insert into nt2 values (2,2,true,false);
--Testcase 174:
insert into nt2 values (3,3,false,false);
--Testcase 175:
insert into nt3 values (1,1,true);
--Testcase 176:
insert into nt3 values (2,2,false);
--Testcase 177:
insert into nt3 values (3,3,true);
--Testcase 178:
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;
--Testcase 179:
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
--
--Testcase 180:
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;
--Testcase 181:
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
--
--Testcase 514:
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;
--Testcase 515:
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
--
--Testcase 182:
select * from int4_tbl a full join int4_tbl b on true;
--Testcase 183:
select * from int4_tbl a full join int4_tbl b on false;
--
-- test for ability to use a cartesian join when necessary
--
--Testcase 415:
create foreign table q1(i int) server sqlite_svr;
--Testcase 416:
insert into q1 values (1);
--Testcase 417:
create foreign table q2(i int) server sqlite_svr;
--Testcase 418:
insert into q2 values (0);
--Testcase 184:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where q1.i = thousand or q2.i = thousand;
--Testcase 185:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where thousand = (q1.i + q2.i);
--
-- test ability to generate a suitable plan for a star-schema query
--
--Testcase 186:
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
--
--Testcase 187:
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;
--Testcase 188:
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
--Testcase 189:
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
--Testcase 419:
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;
--Testcase 420:
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
--Testcase 421:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
--Testcase 422:
select * from
(select key1 as x from sub_tbl as x) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
-- Test proper handling of appendrel PHVs during useless-RTE removal
--Testcase 516:
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;
--Testcase 517:
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 PHV in a semijoin qual, which confused useless-RTE removal (bug #17700)
--Testcase 569:
explain (verbose, costs off)
with ctetable as not materialized ( select 1 as f1 )
select * from ctetable c1
where f1 in ( select c3.f1 from ctetable c2 full join ctetable c3 on true );
--Testcase 570:
with ctetable as not materialized ( select 1 as f1 )
select * from ctetable c1
where f1 in ( select c3.f1 from ctetable c2 full join ctetable c3 on true );
-- Test PHV that winds up in a Result node, despite having nonempty nullingrels
--Testcase 571:
explain (verbose, costs off)
select table_catalog, table_name
from int4_tbl t1
inner join (int8_tbl t2
left join information_schema.column_udt_usage on null)
on null;
-- Test handling of qual pushdown to appendrel members with non-Var outputs
--Testcase 572:
explain (verbose, costs off)
select * from int4_tbl left join (
select text 'foo' union all select text 'bar'
) ss(x) on true
where ss.x is null;
--
-- test inlining of immutable functions
--
--Testcase 423:
create function f_immutable_int4(i integer) returns integer as
$$ begin return i; end; $$ language plpgsql immutable;
-- check optimization of function scan with join
--Testcase 424:
explain (costs off)
select unique1 from tenk1, (select * from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 425:
explain (verbose, costs off)
select unique1, x.*
from tenk1, (select *, random() from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 426:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = unique1;
--Testcase 427:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
--Testcase 538:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
--Testcase 428:
explain (costs off)
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
--Testcase 429:
explain (costs off)
select unique1, x from tenk1 left join f_immutable_int4(1) x on unique1 = x;
--Testcase 430:
explain (costs off)
select unique1, x from tenk1 right join f_immutable_int4(1) x on unique1 = x;
--Testcase 431:
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
--Testcase 432:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = 42;
-- test inlining of immutable functions with PlaceHolderVars
--Testcase 433:
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;
--Testcase 434:
drop function f_immutable_int4(int);
-- test inlining when function returns composite
--Testcase 435:
create function mki8(bigint, bigint) returns int8_tbl as
$$select row($1,$2)::int8_tbl$$ language sql;
--Testcase 436:
create function mki4(int) returns int4_tbl as
$$select row($1)::int4_tbl$$ language sql;
--Testcase 437:
explain (verbose, costs off)
select * from mki8(1,2);
--Testcase 438:
select * from mki8(1,2);
--Testcase 439:
explain (verbose, costs off)
select * from mki4(42);
--Testcase 440:
select * from mki4(42);
--Testcase 441:
drop function mki8(bigint, bigint);
--Testcase 442:
drop function mki4(int);
--
-- test extraction of restriction OR clauses from join OR clause
-- (we used to only do this for indexable clauses)
--
--Testcase 190:
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);
--Testcase 191:
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);
--Testcase 192:
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
--
--Testcase 193:
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;
--Testcase 194:
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;
--Testcase 195:
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;
--Testcase 196:
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;
--Testcase 197:
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;
--Testcase 198:
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;
--Testcase 199:
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;
--Testcase 200:
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;
--Testcase 201:
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;
--Testcase 202:
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
--
--Testcase 203:
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);
--Testcase 204:
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);
--Testcase 205:
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;
--Testcase 206:
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)
--
--Testcase 207:
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;
--Testcase 208:
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;
-- related case
--Testcase 573:
explain (costs off)
select * from int8_tbl t1 left join int8_tbl t2 on t1.q2 = t2.q1,
lateral (select * from int8_tbl t3 where t2.q1 = t2.q2) ss;
--Testcase 574:
select * from int8_tbl t1 left join int8_tbl t2 on t1.q2 = t2.q1,
lateral (select * from int8_tbl t3 where t2.q1 = t2.q2) ss;
--
-- check handling of join aliases when flattening multiple levels of subquery
--
--Testcase 209:
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);
--Testcase 210:
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);
--
-- check handling of a variable-free join alias
--
--Testcase 575:
explain (verbose, costs off)
select * from
int4_tbl i0 left join
( (select *, 123 as x from int4_tbl i1) ss1
left join
(select *, q2 as x from int8_tbl i2) ss2
using (x)
) ss0
on (i0.f1 = ss0.f1)
order by i0.f1, x;
--Testcase 576:
select * from
int4_tbl i0 left join
( (select *, 123 as x from int4_tbl i1) ss1
left join
(select *, q2 as x from int8_tbl i2) ss2
using (x)
) ss0
on (i0.f1 = ss0.f1)
order by i0.f1, x;
--
-- test successful handling of nested outer joins with degenerate join quals
--
--Testcase 443:
create foreign table text_tbl(f1 text) server sqlite_svr;
--Testcase 211:
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);
--Testcase 212:
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);
--Testcase 213:
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);
--Testcase 214:
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);
--Testcase 215:
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);
--Testcase 216:
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);
--Testcase 217:
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;
--Testcase 218:
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;
-- check handling of a variable-free qual for a non-commutable outer join
--Testcase 577:
explain (costs off)
select nspname
from (select 1 as x) ss1
left join
( select n.nspname, c.relname
from pg_class c left join pg_namespace n on n.oid = c.relnamespace
where c.relkind = 'r'
) ss2 on false;
-- check handling of apparently-commutable outer joins with non-commutable
-- joins between them
--Testcase 578:
explain (costs off)
select 1 from
int4_tbl i4
left join int8_tbl i8 on i4.f1 is not null
left join (select 1 as a) ss1 on null
join int4_tbl i42 on ss1.a is null or i8.q1 <> i8.q2
right join (select 2 as b) ss2
on ss2.b < i4.f1;
--
-- test for appropriate join order in the presence of lateral references
--
--Testcase 219:
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;
--Testcase 220:
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;
--Testcase 221:
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;
--Testcase 222:
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;
--Testcase 223:
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;
--Testcase 224:
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;
--Testcase 579:
explain (verbose, costs off)
select 1 from
int4_tbl as i4
inner join
((select 42 as n from int4_tbl x1 left join int8_tbl x2 on f1 = q1) as ss1
right join (select 1 as z) as ss2 on true)
on false,
lateral (select i4.f1, ss1.n from int8_tbl as i8 limit 1) as ss3;
--Testcase 580:
select 1 from
int4_tbl as i4
inner join
((select 42 as n from int4_tbl x1 left join int8_tbl x2 on f1 = q1) as ss1
right join (select 1 as z) as ss2 on true)
on false,
lateral (select i4.f1, ss1.n from int8_tbl as i8 limit 1) as ss3;
--
-- check a case where we formerly generated invalid parameterized paths
--
begin;
--Testcase 630:
CREATE FOREIGN TABLE t (a int options (key 'true')) SERVER sqlite_svr;
--Testcase 631:
explain (costs off)
select 1 from t t1
join lateral (select t1.a from (select 1) foo offset 0) as s1 on true
join
(select 1 from t t2
inner join (t t3
left join (t t4 left join t t5 on t4.a = 1)
on t3.a = t4.a)
on false
where t3.a = coalesce(t5.a,1)) as s2
on true;
rollback;
--
-- check a case in which a PlaceHolderVar forces join order
--
--Testcase 225:
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;
--Testcase 226:
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)
--
--Testcase 227:
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));
--Testcase 228:
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
--
--Testcase 229:
explain (costs off)
select * from int4_tbl a left join tenk1 b on f1 = unique2 where f1 = 0;
--Testcase 230:
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
--
--Testcase 518:
set enable_hashjoin to off;
--Testcase 519:
set enable_nestloop to off;
--Testcase 231:
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;
--Testcase 232:
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;
--Testcase 520:
reset enable_hashjoin;
--Testcase 521:
reset enable_nestloop;
--
-- test join strength reduction with a SubPlan providing the proof
--
--Testcase 581:
explain (costs off)
select a.unique1, b.unique2
from onek a left join onek b on a.unique1 = b.unique2
where b.unique2 = any (select q1 from int8_tbl c where c.q1 < b.unique1);
--Testcase 582:
select a.unique1, b.unique2
from onek a left join onek b on a.unique1 = b.unique2
where b.unique2 = any (select q1 from int8_tbl c where c.q1 < b.unique1);
--
-- test full-join strength reduction
--
--Testcase 583:
explain (costs off)
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42;
--Testcase 584:
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42;
--Testcase 585:
explain (costs off)
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where b.unique2 = 43;
--Testcase 586:
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where b.unique2 = 43;
--Testcase 587:
explain (costs off)
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42 and b.unique2 = 42;
--Testcase 588:
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42 and b.unique2 = 42;
--
-- test result-RTE removal underneath a full join
--
--Testcase 589:
explain (costs off)
select * from
(select * from int8_tbl i81 join (values(123,2)) v(v1,v2) on q2=v1) ss1
full join
(select * from (values(456,2)) w(v1,v2) join int8_tbl i82 on q2=v1) ss2
on true;
--Testcase 590:
select * from
(select * from int8_tbl i81 join (values(123,2)) v(v1,v2) on q2=v1) ss1
full join
(select * from (values(456,2)) w(v1,v2) join int8_tbl i82 on q2=v1) ss2
on true;
--
-- test join removal
--
begin;
--Testcase 444:
CREATE FOREIGN TABLE a3 (id int OPTIONS (key 'true'), b_id int) SERVER sqlite_svr;
--Testcase 445:
CREATE FOREIGN TABLE b3 (id int OPTIONS (key 'true'), c_id int) SERVER sqlite_svr;
--Testcase 446:
CREATE FOREIGN TABLE c3 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 447:
CREATE FOREIGN TABLE d3 (a int, b int) SERVER sqlite_svr;
--Testcase 233:
INSERT INTO a3 VALUES (0, 0), (1, NULL);
--Testcase 234:
INSERT INTO b3 VALUES (0, 0), (1, NULL);
--Testcase 235:
INSERT INTO c3 VALUES (0), (1);
--Testcase 236:
INSERT INTO d3 VALUES (1,3), (2,2), (3,1);
-- all three cases should be optimizable into a3 simple seqscan
--Testcase 237:
explain (costs off) SELECT a3.* FROM a3 LEFT JOIN b3 ON a3.b_id = b3.id;
--Testcase 238:
explain (costs off) SELECT b3.* FROM b3 LEFT JOIN c3 ON b3.c_id = c3.id;
--Testcase 239:
explain (costs off)
SELECT a3.* FROM a3 LEFT JOIN (b3 left join c3 on b3.c_id = c3.id)
ON (a3.b_id = b3.id);
-- check optimization of outer join within another special join
--Testcase 240:
explain (costs off)
select id from a3 where id in (
select b3.id from b3 left join c3 on b3.id = c3.id
);
-- check optimization with oddly-nested outer joins
--Testcase 591:
explain (costs off)
select a31.id from
(a3 a31 left join a3 a32 on true)
left join
(a3 a33 left join a3 a34 on a33.id = a34.id)
on a32.id = a33.id;
--Testcase 592:
explain (costs off)
select a31.id from
(a3 a31 left join a3 a32 on a31.id = a32.id)
left join
(a3 a33 left join a3 a34 on a33.id = a34.id)
on a32.id = a33.id;
--Testcase 593:
explain (costs off)
select 1 from a3 t1
left join a3 t2 on true
inner join a3 t3 on true
left join a3 t4 on t2.id = t4.id and t2.id = t3.id;
-- another example (bug #17781)
--Testcase 594:
explain (costs off)
select ss1.f1
from int4_tbl as t1
left join (int4_tbl as t2
right join int4_tbl as t3 on null
left join (int4_tbl as t4
right join int8_tbl as t5 on null)
on t2.f1 = t4.f1
left join ((select null as f1 from int4_tbl as t6) as ss1
inner join int8_tbl as t7 on null)
on t5.q1 = t7.q2)
on false;
-- variant with Var rather than PHV coming from t6
--Testcase 595:
explain (costs off)
select ss1.f1
from int4_tbl as t1
left join (int4_tbl as t2
right join int4_tbl as t3 on null
left join (int4_tbl as t4
right join int8_tbl as t5 on null)
on t2.f1 = t4.f1
left join ((select f1 from int4_tbl as t6) as ss1
inner join int8_tbl as t7 on null)
on t5.q1 = t7.q2)
on false;
-- per further discussion of bug #17781
--Testcase 596:
explain (costs off)
select ss1.x
from (select f1/2 as x from int4_tbl i4 left join a3 on a3.id = i4.f1) ss1
right join int8_tbl i8 on true
where current_user is not null; -- this is to add a Result node
-- and further discussion of bug #17781
--Testcase 597:
explain (costs off)
select *
from int8_tbl t1
left join (int8_tbl t2 left join onek t3 on t2.q1 > t3.unique1)
on t1.q2 = t2.q2
left join onek t4
on t2.q2 < t3.unique2;
-- More tests of correct placement of pseudoconstant quals
-- simple constant-false condition
--Testcase 598:
explain (costs off)
select * from int8_tbl t1 left join
(int8_tbl t2 inner join int8_tbl t3 on false
left join int8_tbl t4 on t2.q2 = t4.q2)
on t1.q1 = t2.q1;
-- deduce constant-false from an EquivalenceClass
--Testcase 599:
explain (costs off)
select * from int8_tbl t1 left join
(int8_tbl t2 inner join int8_tbl t3 on (t2.q1-t3.q2) = 0 and (t2.q1-t3.q2) = 1
left join int8_tbl t4 on t2.q2 = t4.q2)
on t1.q1 = t2.q1;
-- pseudoconstant based on an outer-level Param
--Testcase 600:
explain (costs off)
select exists(
select * from int8_tbl t1 left join
(int8_tbl t2 inner join int8_tbl t3 on x0.f1 = 1
left join int8_tbl t4 on t2.q2 = t4.q2)
on t1.q1 = t2.q1
) from int4_tbl x0;
-- check that join removal works for a left join when joining a subquery
-- that is guaranteed to be unique by its GROUP BY clause
--Testcase 241:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id and d3.b = s.c_id;
-- similarly, but keying off a DISTINCT clause
--Testcase 242:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id and d3.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 b3.id is a
-- primary key and so drop b3.c_id from the GROUP BY of the resulting plan;
-- but this happens too late for join removal in the outer plan level.)
--Testcase 243:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id;
-- similarly, but keying off a DISTINCT clause
--Testcase 244:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id;
-- join removal is not possible here
--Testcase 601:
explain (costs off)
select 1 from a3 t1
left join (a3 t2 left join a3 t3 on t2.id = 1) on t2.id = 1;
-- check join removal works when uniqueness of the join condition is enforced
-- by a UNION
--Testcase 245:
explain (costs off)
select d3.* from d3 left join (select id from a3 union select id from b3) s
on d3.a = s.id;
-- check join removal with a cross-type comparison operator
--Testcase 246:
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
--Testcase 247:
explain (costs off)
select 1 from (select a3.id FROM a3 left join b3 on a3.b_id = b3.id) q,
lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
-- check join removal within RHS of an outer join
--Testcase 602:
explain (costs off)
select c3.id, ss.a from c3
left join (select d3.a from onerow, d3 left join b3 on d3.a = b3.id) ss
on c3.id = ss.a;
--Testcase 603:
CREATE TEMP TABLE parted_b (id int PRIMARY KEY) partition by range(id);
--Testcase 604:
CREATE TEMP TABLE parted_b1 partition of parted_b for values from (0) to (10);
-- test join removals on a partitioned table
--Testcase 605:
explain (costs off)
select a3.* from a3 left join parted_b pb on a3.b_id = pb.id;
rollback;
--Testcase 448:
create foreign table parent (k int options (key 'true'), pd int) server sqlite_svr;
--Testcase 449:
create foreign table child (k int options (key 'true'), cd int) server sqlite_svr;
--Testcase 248:
insert into parent values (1, 10), (2, 20), (3, 30);
--Testcase 249:
insert into child values (1, 100), (4, 400);
-- this case is optimizable
--Testcase 250:
select p.* from parent p left join child c on (p.k = c.k);
--Testcase 251:
explain (costs off)
select p.* from parent p left join child c on (p.k = c.k);
-- this case is not
--Testcase 252:
select p.*, linked from parent p
left join (select c.*, true as linked from child c) as ss
on (p.k = ss.k);
--Testcase 253:
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
--Testcase 254:
select p.* from
parent p left join child c on (p.k = c.k)
where p.k = 1 and p.k = 2;
--Testcase 255:
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;
--Testcase 256:
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;
--Testcase 257:
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;
--Testcase 450:
CREATE FOREIGN TABLE a4 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 451:
CREATE FOREIGN TABLE b4 (id int OPTIONS (key 'true'), a_id int) SERVER sqlite_svr;
--Testcase 258:
INSERT INTO a4 VALUES (0), (1);
--Testcase 259:
INSERT INTO b4 VALUES (0, 0), (1, NULL);
--Testcase 260:
SELECT * FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
--Testcase 261:
SELECT b4.* FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
rollback;
-- another join removal bug: this is not optimizable, either
begin;
--Testcase 452:
create foreign table innertab (id int8 options (key 'true'), dat1 int8) server sqlite_svr;
--Testcase 262:
insert into innertab values(123, 42);
--Testcase 263:
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;
-- join removal bug #17769: can't remove if there's a pushed-down reference
--Testcase 606:
EXPLAIN (COSTS OFF)
SELECT q2 FROM
(SELECT *
FROM int8_tbl LEFT JOIN innertab ON q2 = id) ss
WHERE COALESCE(dat1, 0) = q1;
-- join removal bug #17773: otherwise-removable PHV appears in a qual condition
--Testcase 607:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT q2 FROM
(SELECT q2, 'constant'::text AS x
FROM int8_tbl LEFT JOIN innertab ON q2 = id) ss
RIGHT JOIN int4_tbl ON NULL
WHERE x >= x;
-- join removal bug #17786: check that OR conditions are cleaned up
--Testcase 608:
EXPLAIN (COSTS OFF)
SELECT f1, x
FROM int4_tbl
JOIN ((SELECT 42 AS x FROM int8_tbl LEFT JOIN innertab ON q1 = id) AS ss1
RIGHT JOIN tenk1 ON NULL)
ON tenk1.unique1 = ss1.x OR tenk1.unique2 = ss1.x;
rollback;
-- another join removal bug: we must clean up correctly when removing a PHV
begin;
--Testcase 453:
create foreign table uniquetbl (f1 text) server sqlite_svr;
--Testcase 264:
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;
--Testcase 265:
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;
--Testcase 266:
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;
-- another join removal bug: we must clean up EquivalenceClasses too
begin;
--Testcase 609:
create temp table t (a int unique);
--Testcase 610:
insert into t values (1);
--Testcase 611:
explain (costs off)
select 1
from t t1
left join (select 2 as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
where t1.a = s.c;
--Testcase 612:
select 1
from t t1
left join (select 2 as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
where t1.a = s.c;
rollback;
-- test cases where we can remove a join, but not a PHV computed at it
begin;
--Testcase 613:
create temp table t (a int unique, b int);
--Testcase 614:
insert into t values (1,1), (2,2);
--Testcase 615:
explain (costs off)
select 1
from t t1
left join (select t2.a, 1 as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
left join t t4 on true
where s.a < s.c;
--Testcase 616:
explain (costs off)
select t1.a, s.*
from t t1
left join lateral (select t2.a, coalesce(t1.a, 1) as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
left join t t4 on true
where s.a < s.c;
--Testcase 617:
select t1.a, s.*
from t t1
left join lateral (select t2.a, coalesce(t1.a, 1) as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
left join t t4 on true
where s.a < s.c;
rollback;
-- test case to expose miscomputation of required relid set for a PHV
--Testcase 522:
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;
--Testcase 523:
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
--Testcase 267:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; -- error
--Testcase 268:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; -- error
--Testcase 269:
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
--
--Testcase 270:
select t1.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t1" suggestion
--Testcase 271:
select t2.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t2" suggestion
--Testcase 272:
select uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, suggest both at once
--Testcase 618:
select ctid from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, need qualification
--
-- Take care to reference the correct RTE
--
--Testcase 454:
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 bug in rangetable flattening
--Testcase 619:
explain (verbose, costs off)
select 1 from
(select * from int8_tbl where q1 <> (select 42) offset 0) ss
where false;
--
-- Test LATERAL
--
--Testcase 273:
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 274:
explain (costs off)
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 275:
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 276:
explain (costs off)
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 277:
explain (costs off)
select unique2, x.*
from int4_tbl x cross join lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 278:
select unique2, x.*
from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true;
--Testcase 279:
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
--Testcase 280:
select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl;
--Testcase 281:
select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl;
-- lateral with function in FROM
--Testcase 282:
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 283:
explain (costs off)
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 284:
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
--Testcase 285:
explain (costs off)
select count(*) from tenk1 a, generate_series(1,two) g;
-- lateral with UNION ALL subselect
--Testcase 286:
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;
--Testcase 287:
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
--Testcase 288:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x;
--Testcase 289:
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
--Testcase 290:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x;
--Testcase 291:
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
--Testcase 292:
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;
--Testcase 293:
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
--Testcase 294:
select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (select x) ss2(y);
--Testcase 295:
select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (values(x)) ss2(y);
--Testcase 296:
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
--Testcase 297:
select * from (values(1)) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 298:
select * from (select f1/1000000000 from int4_tbl) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 299:
select * from (values(1)) x(lb),
lateral (values(lb)) y(lbcopy);
--Testcase 300:
select * from (values(1)) x(lb),
lateral (select lb from int4_tbl) y(lbcopy);
--Testcase 301:
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);
--Testcase 302:
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);
--Testcase 303:
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);
--Testcase 304:
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);
--Testcase 305:
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);
--Testcase 307:
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);
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 455:
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;
--Testcase 456:
select * from
int8_tbl a left join
lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1;
--Testcase 457:
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;
--Testcase 458:
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
--Testcase 308:
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;
--Testcase 309:
select * from int4_tbl i left join
lateral (select * from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 310:
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;
--Testcase 311:
select * from int4_tbl i left join
lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 312:
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;
--Testcase 313:
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
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 459:
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;
--Testcase 460:
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
--Testcase 461:
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
--Testcase 462:
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)
--Testcase 463:
delete from sub_tbl;
--Testcase 464:
insert into sub_tbl values (1, 2, 3, 4, 5);
--Testcase 465:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl offset 0) x cross join (select key3 as y from sub_tbl offset 0) y
left join lateral (
select * from (select key5 as z from sub_tbl offset 0) z where z.z = x.x
) zz on zz.z = y.y;
-- a new postponed-quals issue (bug #17768)
--Testcase 620:
explain (costs off)
select * from int4_tbl t1,
lateral (select * from int4_tbl t2 inner join int4_tbl t3 on t1.f1 = 1
inner join (int4_tbl t4 left join int4_tbl t5 on true) on true) ss;
-- check dummy rels with lateral references (bug #15694)
--Testcase 466:
explain (verbose, costs off)
select * from int8_tbl i8 left join lateral
(select *, i8.q2 from int4_tbl where false) ss on true;
--Testcase 467:
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
--Testcase 468:
select * from
((select key3 as v from sub_tbl) union all (select key5 as v from sub_tbl)) as q1
cross join lateral
((select * from
((select key6 as v from sub_tbl) union all (select value1 as v from sub_tbl)) as q3)
union all
(select q1.v)
) as q2;
-- check the number of columns specified
--Testcase 539:
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
--Testcase 314:
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;
--Testcase 315:
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)
--Testcase 316:
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;
--Testcase 317:
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
--Testcase 318:
select f1,g from int4_tbl a, (select f1 as g) ss;
--Testcase 319:
select f1,g from int4_tbl a, (select a.f1 as g) ss;
--Testcase 320:
select f1,g from int4_tbl a cross join (select f1 as g) ss;
--Testcase 321:
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
--Testcase 322:
select f1,g from int4_tbl a right join lateral generate_series(0, a.f1) g on true;
--Testcase 323:
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
--Testcase 324:
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
--Testcase 325:
select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss;
-- check behavior of LATERAL in UPDATE/DELETE
--Testcase 469:
create temp table xx1 as select f1 as x1, -f1 as x2 from int4_tbl;
-- error, can't do this:
--Testcase 326:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss;
--Testcase 327:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss;
-- can't do it even with LATERAL:
--Testcase 328:
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:
--Testcase 329:
update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1) ss;
-- also errors:
--Testcase 330:
delete from xx1 using (select * from int4_tbl where f1 = x1) ss;
--Testcase 331:
delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss;
--Testcase 332:
delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
-- Skip this test, sqlite fdw does not support to create partition table
-- 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;
--Testcase 524:
create table fkest (x integer, x10 integer, x10b integer, x100 integer);
--Testcase 525:
insert into fkest select x, x/10, x/10, x/100 from generate_series(1,1000) x;
--Testcase 526:
create unique index on fkest(x, x10, x100);
analyze fkest;
--Testcase 527:
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;
--Testcase 528:
alter table fkest add constraint fk
foreign key (x, x10b, x100) references fkest (x, x10, x100);
--Testcase 529:
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;
--Testcase 470:
create foreign table fkest (a int options (key 'true'), b int options (key 'true'), c int) server sqlite_svr;
--Testcase 471:
create foreign table fkest1 (a int options (key 'true'), b int options (key 'true')) server sqlite_svr;
--Testcase 333:
insert into fkest select x/10, x%10, x from generate_series(1,1000) x;
--Testcase 334:
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;
--Testcase 335:
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
--
--Testcase 472:
create foreign table j11 (id int options (key 'true')) server sqlite_svr;
--Testcase 473:
create foreign table j21 (id int options (key 'true')) server sqlite_svr;
--Testcase 474:
create foreign table j31 (id int) server sqlite_svr;
--Testcase 336:
insert into j11 values(1),(2),(3);
--Testcase 337:
insert into j21 values(1),(2),(3);
--Testcase 338:
insert into j31 values(1),(1);
-- ensure join is properly marked as unique
--Testcase 339:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id = j21.id;
-- ensure join is not unique when not an equi-join
--Testcase 340:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id > j21.id;
-- ensure non-unique rel is not chosen as inner
--Testcase 341:
explain (verbose, costs off)
select * from j11 inner join j31 on j11.id = j31.id;
-- ensure left join is marked as unique
--Testcase 342:
explain (verbose, costs off)
select * from j11 left join j21 on j11.id = j21.id;
-- ensure right join is marked as unique
--Testcase 343:
explain (verbose, costs off)
select * from j11 right join j21 on j11.id = j21.id;
-- ensure full join is marked as unique
--Testcase 344:
explain (verbose, costs off)
select * from j11 full join j21 on j11.id = j21.id;
-- a clauseless (cross) join can't be unique
--Testcase 345:
explain (verbose, costs off)
select * from j11 cross join j21;
-- ensure a natural join is marked as unique
--Testcase 346:
explain (verbose, costs off)
select * from j11 natural join j21;
-- ensure a distinct clause allows the inner to become unique
--Testcase 347:
explain (verbose, costs off)
select * from j11
inner join (select distinct id from j31) j31 on j11.id = j31.id;
-- ensure group by clause allows the inner to become unique
--Testcase 348:
explain (verbose, costs off)
select * from j11
inner join (select id from j31 group by id) j31 on j11.id = j31.id;
--drop table j1;
--drop table j2;
--drop table j3;
-- test more complex permutations of unique joins
--Testcase 475:
create foreign table j12 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 476:
create foreign table j22 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 477:
create foreign table j32 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 349:
insert into j12 values(1,1),(1,2);
--Testcase 350:
insert into j22 values(1,1);
--Testcase 351:
insert into j32 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
--Testcase 352:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1;
-- ensure proper unique detection with multiple join quals
--Testcase 353:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2;
-- ensure we don't detect the join to be unique when quals are not part of the
-- join condition
--Testcase 354:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 where j12.id2 = 1;
-- as above, but for left joins.
--Testcase 355:
explain (verbose, costs off)
select * from j12
left join j22 on j12.id1 = j22.id1 where j12.id2 = 1;
-- create unique index command does not work with foreign table
-- Add these normal tables for it.
--Testcase 624:
create table j1 (id1 int, id2 int, primary key(id1,id2));
--Testcase 625:
create table j2 (id1 int, id2 int, primary key(id1,id2));
--Testcase 626:
insert into j1 values(1,1),(1,2);
--Testcase 627:
insert into j2 values(1,1);
analyze j1;
analyze j2;
--Testcase 621:
create unique index j1_id2_idx on j1(id2) where id2 is not null;
-- ensure we don't use a partial unique index as unique proofs
--Testcase 622:
explain (verbose, costs off)
select * from j1
inner join j2 on j1.id2 = j2.id2;
--Testcase 623:
drop index j1_id2_idx;
--Testcase 628:
drop table j1;
--Testcase 629:
drop table j2;
-- 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.
--Testcase 530:
set enable_nestloop to 0;
--Testcase 531:
set enable_hashjoin to 0;
--Testcase 532:
set enable_sort to 0;
-- skip, cannot create index on foreign table
-- 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
--Testcase 478:
insert into j22 values(1,2);
--analyze j2;
--Testcase 356:
explain (costs off) select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
--Testcase 357:
select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
-- Exercise array keys mark/restore B-Tree code
--Testcase 479:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
--Testcase 480:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
-- Exercise array keys "find extreme element" B-Tree code
--Testcase 481:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 482:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 533:
reset enable_nestloop;
--Testcase 534:
reset enable_hashjoin;
--Testcase 535:
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
--Testcase 358:
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
--Testcase 484:
create table j3 as select unique1, tenthous from onek;
vacuum analyze j3;
--Testcase 485:
create unique index on j3(unique1, tenthous);
--Testcase 359:
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;
--Testcase 486:
drop table j3;
--Testcase 647:
DELETE FROM INT4_TBL;
--Testcase 648:
DELETE FROM INT8_TBL;
--Testcase 649:
DELETE FROM FLOAT8_TBL;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 487:
DROP SERVER sqlite_svr;
--Testcase 488:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/limit.sql
================================================
--
-- LIMIT
-- Check the LIMIT/OFFSET feature of SELECT
--
--Testcase 27:
CREATE EXTENSION sqlite_fdw;
--Testcase 28:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 29:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 30:
CREATE FOREIGN TABLE int8_tbl(q1 int8 OPTIONS (key 'true'), q2 int8) SERVER sqlite_svr;
--Testcase 105:
INSERT INTO int8_tbl VALUES(' 123 ',' 456');
--Testcase 106:
INSERT INTO int8_tbl VALUES('123 ','4567890123456789');
--Testcase 107:
INSERT INTO int8_tbl VALUES('4567890123456789','123');
--Testcase 108:
INSERT INTO int8_tbl VALUES(+4567890123456789,'4567890123456789');
--Testcase 109:
INSERT INTO int8_tbl VALUES('+4567890123456789','-4567890123456789');
--Testcase 31:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 32:
CREATE FOREIGN TABLE tenk1 (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 88:
CREATE TABLE parent_table (
unique1 int4 PRIMARY KEY,
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
);
--Testcase 89:
CREATE FOREIGN table inherited_table ()
INHERITS (parent_table)
SERVER sqlite_svr options (table 'tenk1');
--Testcase 1:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
ORDER BY unique1 LIMIT 2;
--Testcase 2:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60
ORDER BY unique1 LIMIT 5;
--Testcase 3:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60 AND unique1 < 63
ORDER BY unique1 LIMIT 5;
--Testcase 4:
SELECT ''::text AS three, unique1, unique2, stringu1
FROM onek WHERE unique1 > 100
ORDER BY unique1 LIMIT 3 OFFSET 20;
--Testcase 5:
SELECT ''::text AS zero, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 8 OFFSET 99;
--Testcase 6:
SELECT ''::text AS eleven, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 20 OFFSET 39;
--Testcase 7:
SELECT ''::text AS ten, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990;
--Testcase 8:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990 LIMIT 5;
--Testcase 9:
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:
--Testcase 10:
select * from int8_tbl limit (case when random() < 0.5 then null::bigint end);
--Testcase 11:
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
begin;
declare c1 scroll cursor for select * from int8_tbl order by q1 limit 10;
--Testcase 12:
fetch all in c1;
--Testcase 13:
fetch 1 in c1;
--Testcase 14:
fetch backward 1 in c1;
--Testcase 33:
fetch backward all in c1;
--Testcase 34:
fetch backward 1 in c1;
--Testcase 35:
fetch all in c1;
declare c2 scroll cursor for select * from int8_tbl limit 3;
--Testcase 36:
fetch all in c2;
--Testcase 37:
fetch 1 in c2;
--Testcase 38:
fetch backward 1 in c2;
--Testcase 39:
fetch backward all in c2;
--Testcase 40:
fetch backward 1 in c2;
--Testcase 41:
fetch all in c2;
declare c3 scroll cursor for select * from int8_tbl offset 3;
--Testcase 42:
fetch all in c3;
--Testcase 43:
fetch 1 in c3;
--Testcase 44:
fetch backward 1 in c3;
--Testcase 45:
fetch backward all in c3;
--Testcase 46:
fetch backward 1 in c3;
--Testcase 47:
fetch all in c3;
declare c4 scroll cursor for select * from int8_tbl offset 10;
--Testcase 48:
fetch all in c4;
--Testcase 49:
fetch 1 in c4;
--Testcase 50:
fetch backward 1 in c4;
--Testcase 51:
fetch backward all in c4;
--Testcase 52:
fetch backward 1 in c4;
--Testcase 53:
fetch all in c4;
declare c5 scroll cursor for select * from int8_tbl order by q1 fetch first 2 rows with ties;
--Testcase 54:
fetch all in c5;
--Testcase 55:
fetch 1 in c5;
--Testcase 56:
fetch backward 1 in c5;
--Testcase 57:
fetch backward 1 in c5;
--Testcase 58:
fetch all in c5;
--Testcase 59:
fetch backward all in c5;
--Testcase 60:
fetch all in c5;
--Testcase 61:
fetch backward all in c5;
rollback;
-- Stress test for variable LIMIT in conjunction with bounded-heap sorting
--Testcase 62:
DELETE FROM INT8_TMP;
--Testcase 63:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series(1,10) q1;
--Testcase 64:
SELECT
(SELECT s.q1
FROM (VALUES (1)) AS x,
(SELECT q1 FROM INT8_TMP as n
ORDER BY q1 LIMIT 1 OFFSET s.q1-1) AS y) AS z
FROM INT8_TMP AS s;
--
-- Test behavior of volatile and set-returning functions in conjunction
-- with ORDER BY and LIMIT.
--
--Testcase 65:
create temp sequence testseq;
--Testcase 15:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 16:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 90:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 91:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 17:
select currval('testseq');
--Testcase 92:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 93:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 94:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 95:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 96:
select currval('testseq');
--Testcase 18:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 19:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 97:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 98:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 20:
select currval('testseq');
-- test for limit and offset when querying table and foreign table inherited
--Testcase 99:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
--Testcase 100:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
-- when querying regular tables with inherited tables, only limit is pushed-down when no offset is specified
--Testcase 101:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 102:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 103:
select currval('testseq');
--Testcase 21:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 22:
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 23:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by tenthous limit 7;
--Testcase 24:
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
--Testcase 66:
DELETE FROM INT8_TMP;
--Testcase 67:
INSERT INTO INT8_TMP VALUES (generate_series(0,2), generate_series((random()*.1)::int,2));
--Testcase 68:
explain (verbose, costs off)
select q1, q2 from int8_tmp;
--Testcase 69:
select q1, q2 from int8_tmp;
--Testcase 70:
explain (verbose, costs off)
select q1, q2 from int8_tmp order by q2 desc;
--Testcase 71:
select q1, q2 from int8_tmp order by q2 desc;
-- test for failure to set all aggregates' aggtranstype
--Testcase 25:
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;
--Testcase 26:
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
--
--Testcase 72:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW WITH TIES;
--Testcase 73:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST ROWS WITH TIES;
--Testcase 74:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES;
--Testcase 75:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW ONLY;
-- SKIP LOCKED and WITH TIES are incompatible
--Testcase 104:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES FOR UPDATE SKIP LOCKED;
-- should fail
--Testcase 76:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
FETCH FIRST 2 ROW WITH TIES;
-- test ruleutils
--Testcase 77:
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;
--Testcase 78:
\d+ limit_thousand_v_1
--Testcase 79:
CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY;
--Testcase 80:
\d+ limit_thousand_v_2
--Testcase 81:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS WITH TIES; -- fails
--Testcase 82:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES;
--Testcase 83:
\d+ limit_thousand_v_3
--Testcase 84:
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
--Testcase 85:
\d+ limit_thousand_v_4
-- leave these views
--Testcase 110:
DELETE FROM int8_tbl;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 86:
DROP SERVER sqlite_svr;
--Testcase 87:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/prepare.sql
================================================
-- Regression tests for prepareable statements. We query the content
-- of the pg_prepared_statements view as prepared statements are
-- created and removed.
--Testcase 26:
CREATE EXTENSION sqlite_fdw;
--Testcase 27:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 28:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 29:
CREATE FOREIGN TABLE road (
name text,
thepath path
) SERVER sqlite_svr;
--Testcase 30:
create foreign table road_tmp (a int, b int, id int options (key 'true')) server sqlite_svr;
--Testcase 31:
insert into road_tmp values (1, 2);
--Testcase 1:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
--Testcase 2:
PREPARE q1 AS SELECT a FROM road_tmp;
--Testcase 3:
EXECUTE q1;
--Testcase 4:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
-- should fail
--Testcase 5:
PREPARE q1 AS SELECT b FROM road_tmp;
-- should succeed
DEALLOCATE q1;
--Testcase 6:
PREPARE q1 AS SELECT b FROM road_tmp;
--Testcase 7:
EXECUTE q1;
--Testcase 8:
PREPARE q2 AS SELECT b FROM road_tmp;
--Testcase 9:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
-- sql92 syntax
DEALLOCATE PREPARE q1;
--Testcase 10:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
DEALLOCATE PREPARE q2;
-- the view should return the empty set again
--Testcase 11:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
-- parameterized queries
--Testcase 12:
PREPARE q2(text) AS
SELECT datname, datistemplate, datallowconn
FROM pg_database WHERE datname = $1;
--Testcase 13:
EXECUTE q2('postgres');
--Testcase 14:
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;
--Testcase 15:
EXECUTE q3('AAAAxx', 5::smallint, 10.5::float, false, 4::bigint);
-- too few params
--Testcase 16:
EXECUTE q3('bool');
-- too many params
--Testcase 17:
EXECUTE q3('bytea', 5::smallint, 10.5::float, false, 4::bigint, true);
-- wrong param types
--Testcase 18:
EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'bytea');
-- invalid type
--Testcase 19:
PREPARE q4(nonexistenttype) AS SELECT * FROM road WHERE name = $1;
-- create table as execute
--Testcase 20:
PREPARE q5(int, text) AS
SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
ORDER BY unique1;
--Testcase 32:
CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA');
--Testcase 21:
SELECT * FROM q5_prep_results;
--Testcase 33:
CREATE TEMPORARY TABLE q5_prep_nodata AS EXECUTE q5(200, 'DTAAAA')
WITH NO DATA;
--Testcase 34:
SELECT * FROM q5_prep_nodata;
-- unknown or unspecified parameter types: should succeed
--Testcase 22:
PREPARE q6 AS
SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
--Testcase 23:
PREPARE q7(unknown) AS
SELECT * FROM road WHERE thepath = $1;
-- DML statements
PREPARE q8 AS
UPDATE tenk1 SET stringu1 = $2 WHERE unique1 = $1;
--Testcase 24:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements
ORDER BY name;
-- test DEALLOCATE ALL;
DEALLOCATE ALL;
--Testcase 25:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
--Testcase 35:
DROP FOREIGN TABLE tenk1;
--Testcase 36:
DROP FOREIGN TABLE road;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/select.sql
================================================
--
-- SELECT
--
--Testcase 43:
CREATE EXTENSION sqlite_fdw;
--Testcase 44:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 45:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 46:
CREATE FOREIGN TABLE onek2 (
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
) SERVER sqlite_svr;
--Testcase 47:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 73:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 74:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 75:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 76:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 77:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 48:
CREATE FOREIGN TABLE person (
name text,
age int4,
location point
) SERVER sqlite_svr;
-- btree index
-- awk '{if($1<10){print;}else{next;}}' onek.data | sort +0n -1
--
--Testcase 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
--
--Testcase 2:
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
--
--Testcase 3:
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
--
--Testcase 4:
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
--
--Testcase 5:
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
--
--Testcase 6:
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
--
--Testcase 7:
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
--
--Testcase 8:
SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10 order by onek2.unique1;
--
-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1
--
--Testcase 9:
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
--
--Testcase 10:
SELECT onek2.unique1, onek2.stringu1 FROM onek2
WHERE onek2.unique1 > 980 ORDER BY onek2.unique1;
RESET enable_seqscan;
RESET enable_bitmapscan;
RESET enable_sort;
--
-- 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
--Testcase 12:
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
--
--Testcase 13:
SELECT p.name, p.age FROM person* p ORDER BY age using >, name;
--
-- Test some cases involving whole-row Var referencing a subquery
--
--Testcase 49:
select foo from (select 1 offset 0) as foo;
--Testcase 50:
select foo from (select null offset 0) as foo;
--Testcase 51:
select foo from (select 'xyzzy',1,null offset 0) as foo;
--
-- Test VALUES lists
--
--Testcase 14:
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 :-)
--Testcase 15:
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
--Testcase 16:
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
--Testcase 17:
VALUES (1,2), (3,4+4), (7,77.7);
--Testcase 52:
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
--
--Testcase 53:
CREATE FOREIGN TABLE foo (f1 int options (key 'true')) SERVER sqlite_svr;
--Testcase 18:
INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1);
--Testcase 19:
SELECT * FROM foo ORDER BY f1;
--Testcase 20:
SELECT * FROM foo ORDER BY f1 ASC; -- same thing
--Testcase 21:
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
--Testcase 22:
SELECT * FROM foo ORDER BY f1 DESC;
--Testcase 23:
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
-- Skip, cannot create index on foreign table
-- 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
--Testcase 24:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 25:
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- actually run the query with an analyze to use the partial index
--Testcase 54:
explain (costs off, analyze on, timing off, summary off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 27:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 28:
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- partial index predicate implies clause, so no need for retest
--Testcase 29:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 30:
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 31:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 32:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
-- but if it's an update target, must retest anyway
--Testcase 33:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
--Testcase 34:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
-- partial index is not applicable
--Testcase 35:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'C';
--Testcase 36:
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;
--Testcase 37:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 38:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
RESET enable_indexscan;
-- check multi-index cases too
--Testcase 39:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 40:
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 41:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 and stringu1 < 'B') or unique1 = 0;
--Testcase 42:
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
--Testcase 55:
SELECT 1 AS x ORDER BY x;
-- But ORDER BY on a set-valued expression does
--Testcase 56:
create function sillysrf(int) returns setof int as
'values (1),(10),(2),($1)' language sql immutable;
--Testcase 57:
select sillysrf(42);
--Testcase 58:
select sillysrf(-1) order by 1;
--Testcase 59:
drop function sillysrf(int);
-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict
-- (see bug #5084)
--Testcase 60:
select * from (values (2),(null),(1)) v(k) where k = k order by k;
--Testcase 61:
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.
--Testcase 62:
create table list_parted_tbl (a int,b int) partition by list (a);
--Testcase 63:
create table list_parted_tbl1 partition of list_parted_tbl
for values in (1) partition by list(b);
--Testcase 64:
explain (costs off) select * from list_parted_tbl;
--Testcase 65:
drop table list_parted_tbl;
--Testcase 78:
DELETE FROM INT8_TBL;
--Testcase 66:
DROP FOREIGN TABLE onek;
--Testcase 67:
DROP FOREIGN TABLE onek2;
--Testcase 68:
DROP FOREIGN TABLE int8_tbl;
--Testcase 69:
DROP FOREIGN TABLE person;
--Testcase 70:
DROP FOREIGN TABLE foo;
--Testcase 71:
DROP SERVER sqlite_svr;
--Testcase 72:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/select_having.sql
================================================
--
-- SELECT_HAVING
--
--Testcase 22:
CREATE EXTENSION sqlite_fdw;
--Testcase 23:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 24:
CREATE FOREIGN TABLE test_having(a int OPTIONS (key 'true'), b int, c char(8), d char) SERVER sqlite_svr;
-- load test data
--Testcase 1:
INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A');
--Testcase 2:
INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b');
--Testcase 3:
INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c');
--Testcase 4:
INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D');
--Testcase 5:
INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e');
--Testcase 6:
INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F');
--Testcase 7:
INSERT INTO test_having VALUES (6, 4, 'cccc', 'g');
--Testcase 8:
INSERT INTO test_having VALUES (7, 4, 'cccc', 'h');
--Testcase 9:
INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I');
--Testcase 10:
INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j');
--Testcase 11:
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
--Testcase 12:
SELECT b, c FROM test_having
GROUP BY b, c HAVING b = 3 ORDER BY b, c collate "en_US.utf8";
--Testcase 13:
SELECT lower(c), count(c) FROM test_having
GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY lower(c);
--Testcase 14:
SELECT c, max(a) FROM test_having
GROUP BY c HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY c collate "en_US.utf8";
-- test degenerate cases involving HAVING without GROUP BY
-- Per SQL spec, these should generate 0 or 1 row, even without aggregates
--Testcase 15:
SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a);
--Testcase 16:
SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a);
-- errors: ungrouped column references
--Testcase 17:
SELECT a FROM test_having HAVING min(a) < max(a);
--Testcase 18:
SELECT 1 AS one FROM test_having HAVING a > 1;
-- the really degenerate case: need not scan table at all
--Testcase 19:
SELECT 1 AS one FROM test_having HAVING 1 > 2;
--Testcase 20:
SELECT 1 AS one FROM test_having HAVING 1 < 2;
-- and just to prove that we aren't scanning the table:
--Testcase 21:
SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2;
--Testcase 25:
DROP FOREIGN TABLE test_having;
--Testcase 26:
DROP SERVER sqlite_svr;
--Testcase 27:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/sqlite_fdw_post.sql
================================================
-- ===================================================================
-- create FDW objects
-- ===================================================================
--Testcase 483:
CREATE EXTENSION sqlite_fdw;
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr2 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr3 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- SQLite FDW does not need User and User Mapping.
--Testcase 484:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 485:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 756:
-- CREATE USER MAPPING FOR public SERVER sqlite_svr3;
-- ===================================================================
-- create objects used through FDW sqlite server
-- ===================================================================
--Testcase 486:
CREATE SCHEMA "S 1";
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO "S 1";
--Testcase 1:
INSERT INTO "S 1"."T 1"
SELECT id,
id % 10,
to_char(id, 'FM00000'),
'1970-01-01'::timestamptz + ((id % 100) || ' days')::interval,
'1970-01-01'::timestamp + ((id % 100) || ' days')::interval,
id % 10,
id % 10,
'foo'
FROM generate_series(1, 1000) id;
--Testcase 2:
INSERT INTO "S 1"."T 2"
SELECT id,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 3:
INSERT INTO "S 1"."T 3"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 487:
DELETE FROM "S 1"."T 3" WHERE c1 % 2 != 0; -- delete for outer join tests
--Testcase 4:
INSERT INTO "S 1"."T 4"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 488:
DELETE FROM "S 1"."T 4" WHERE c1 % 3 != 0; -- delete for outer join tests
/*ANALYZE "S 1"."T 1";
ANALYZE "S 1"."T 2";
ANALYZE "S 1"."T 3";
ANALYZE "S 1"."T 4";*/
-- ===================================================================
-- create foreign tables
-- ===================================================================
--Testcase 489:
CREATE FOREIGN TABLE ft1 (
c0 int,
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr;
--Testcase 757:
ALTER FOREIGN TABLE ft1 DROP COLUMN c0;
--Testcase 490:
CREATE FOREIGN TABLE ft2 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
cx int,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft2',
c8 text
) SERVER sqlite_svr;
--Testcase 758:
ALTER FOREIGN TABLE ft2 DROP COLUMN cx;
--Testcase 491:
CREATE FOREIGN TABLE ft4 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 3');
--Testcase 492:
CREATE FOREIGN TABLE ft5 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 4');
--Testcase 493:
CREATE FOREIGN TABLE ft6 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr2 OPTIONS (table 'T 4');
--Testcase 759:
CREATE FOREIGN TABLE ft7 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr3 OPTIONS (table 'T 4');
--Testcase 760:
ALTER FOREIGN TABLE ft1 OPTIONS (table 'T 1');
--Testcase 761:
ALTER FOREIGN TABLE ft2 OPTIONS (table 'T 1');
--Testcase 762:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 763:
ALTER FOREIGN TABLE ft2 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 5:
\det+
-- Test that alteration of server options causes reconnection
-- Remote's errors might be non-English, so hide them to ensure stable results
\set VERBOSITY terse
--Testcase 6:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work
--Testcase 764:
ALTER SERVER sqlite_svr OPTIONS (SET database 'no such database');
--Testcase 7:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should fail
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_svr
OPTIONS (SET database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
--Testcase 8:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work again
\set VERBOSITY default
-- Now we should be able to run ANALYZE.
-- To exercise multiple code paths, we use local stats on ft1
-- and remote-estimate mode on ft2.
--ANALYZE ft1;
--ALTER FOREIGN TABLE ft2 OPTIONS (use_remote_estimate 'true');
-- ===================================================================
-- test error case for create publication on foreign table
-- ===================================================================
--Testcase 955:
CREATE PUBLICATION testpub_ftbl FOR TABLE ft1; -- should fail
-- ===================================================================
-- simple queries
-- ===================================================================
-- single table without alias
--Testcase 9:
EXPLAIN (COSTS OFF) SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
--Testcase 10:
SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
-- single table with alias - also test that tableoid sort is not pushed to remote side
--Testcase 11:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
--Testcase 12:
SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
-- whole-row reference
--Testcase 13:
EXPLAIN (VERBOSE, COSTS OFF) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 14:
SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- empty result
--Testcase 15:
SELECT * FROM ft1 WHERE false;
-- with WHERE clause
--Testcase 16:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
--Testcase 17:
SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
-- with FOR UPDATE/SHARE
--Testcase 18:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 19:
SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 20:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
--Testcase 21:
SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
-- aggregate
--Testcase 22:
SELECT COUNT(*) FROM ft1 t1;
-- subquery
--Testcase 23:
SELECT * FROM ft1 t1 WHERE t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 <= 10) ORDER BY c1;
-- subquery+MAX
--Testcase 24:
SELECT * FROM ft1 t1 WHERE t1.c3 = (SELECT MAX(c3) FROM ft2 t2) ORDER BY c1;
-- used in CTE
--Testcase 25:
WITH t1 AS (SELECT * FROM ft1 WHERE c1 <= 10) SELECT t2.c1, t2.c2, t2.c3, t2.c4 FROM t1, ft2 t2 WHERE t1.c1 = t2.c1 ORDER BY t1.c1;
-- fixed values
--Testcase 26:
SELECT 'fixed', NULL FROM ft1 t1 WHERE c1 = 1;
-- Test forcing the remote server to produce sorted data for a merge join.
--Testcase 765:
SET enable_hashjoin TO false;
--Testcase 766:
SET enable_nestloop TO false;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 27:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 28:
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 29:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 30:
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- A join between local table and foreign join. ORDER BY clause is added to the
-- foreign join so that the local table can be joined using merge join strategy.
--Testcase 31:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 32:
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above, except that the full join prevents any equivalence
-- classes from being merged. This produces single relation equivalence classes
-- included in join restrictions.
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 34:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above with all full outer joins
--Testcase 35:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 36:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 767:
RESET enable_hashjoin;
--Testcase 768:
RESET enable_nestloop;
-- Test executing assertion in estimate_path_cost_size() that makes sure that
-- retrieved_rows for foreign rel re-used to cost pre-sorted foreign paths is
-- a sensible value even when the rel has tuples=0
-- CREATE TABLE loct_empty (c1 int NOT NULL, c2 text);
--Testcase 769:
CREATE FOREIGN TABLE ft_empty (c1 int NOT NULL, c2 text)
SERVER sqlite_svr OPTIONS (table 'loct_empty');
--Testcase 770:
INSERT INTO "S 1".loct_empty
SELECT id, 'AAA' || to_char(id, 'FM000') FROM generate_series(1, 100) id;
--Testcase 771:
DELETE FROM "S 1".loct_empty;
-- ANALYZE ft_empty;
--Testcase 772:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1;
-- ===================================================================
-- WHERE with remotely-executable conditions
-- ===================================================================
--Testcase 37:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 1; -- Var, OpExpr(b), Const
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = 0; -- BoolExpr
--Testcase 39:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NULL; -- NullTest
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NOT NULL; -- NullTest
--Testcase 41:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr
--Testcase 42:
--Testcase 956:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = -c1; -- OpExpr(l)
--Testcase 44:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE (c1 IS NOT NULL) IS DISTINCT FROM (c1 IS NOT NULL); -- DistinctExpr
--Testcase 45:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = ANY(ARRAY[c2, 1, c1 + 0]); -- ScalarArrayOpExpr
--Testcase 46:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = (ARRAY[c1,c2,3])[1]; -- SubscriptingRef
--Testcase 47:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c6 = E'foo''s\\bar'; -- check special chars
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c8 = 'foo'; -- can't be sent to remote
-- parameterized remote path for foreign table
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2;
--Testcase 50:
SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2;
-- check both safe and unsafe join conditions
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
--Testcase 52:
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
-- bug before 9.3.5 due to sloppy handling of remote-estimate parameters
--Testcase 53:
SELECT * FROM ft1 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft2 WHERE c1 < 5));
--Testcase 54:
SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5));
-- we should not push order by clause with volatile expressions or unsafe
-- collations
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, random();
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C";
-- user-defined operator/function
--Testcase 494:
CREATE FUNCTION sqlite_fdw_abs(int) RETURNS int AS $$
BEGIN
RETURN abs($1);
END
$$ LANGUAGE plpgsql IMMUTABLE;
--Testcase 495:
CREATE OPERATOR === (
LEFTARG = int,
RIGHTARG = int,
PROCEDURE = int4eq,
COMMUTATOR = ===
);
-- built-in operators and functions can be shipped for remote execution
--Testcase 57:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 58:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 59:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 60:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
-- by default, user-defined ones cannot
--Testcase 61:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 62:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 63:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 64:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- ORDER BY can be shipped, though
--Testcase 496:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 497:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- but let's put them in an extension ...
--Testcase 773:
ALTER EXTENSION sqlite_fdw ADD FUNCTION sqlite_fdw_abs(int);
--Testcase 774:
ALTER EXTENSION sqlite_fdw ADD OPERATOR === (int, int);
--ALTER SERVER sqlite_svr2 OPTIONS (ADD extensions 'sqlite_fdw');
-- ... now they can be shipped
--Testcase 498:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 499:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 500:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 501:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- and both ORDER BY and LIMIT can be shipped
--Testcase 502:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 503:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- Test CASE pushdown
--Testcase 957:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1;
--Testcase 958:
SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1;
-- Nested CASE
--Testcase 959:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1,c2,c3 FROM ft2 WHERE CASE CASE WHEN c2 > 0 THEN c2 END WHEN 100 THEN 601 WHEN c2 THEN c2 ELSE 0 END > 600 ORDER BY c1;
--Testcase 960:
SELECT c1,c2,c3 FROM ft2 WHERE CASE CASE WHEN c2 > 0 THEN c2 END WHEN 100 THEN 601 WHEN c2 THEN c2 ELSE 0 END > 600 ORDER BY c1;
-- CASE arg WHEN
--Testcase 961:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- CASE cannot be pushed down because of unshippable arg clause
--Testcase 962:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c1 > (CASE random()::integer WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 963:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 964:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 965:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
-- a regconfig constant referring to this text search configuration
-- is initially unshippable--Testcase 984:
CREATE TEXT SEARCH CONFIGURATION public.custom_search
(COPY = pg_catalog.english);
--Testcase 985:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
--Testcase 986:
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
-- but if it's in a shippable extension, it can be shipped
ALTER EXTENSION sqlite_fdw ADD TEXT SEARCH CONFIGURATION public.custom_search;
-- however, that doesn't flush the shippability cache, so do a quick reconnect
\c -
--Testcase 995:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
--Testcase 996:
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
-- ===================================================================
-- JOIN queries
-- ===================================================================
-- Analyze ft4 and ft5 so that we have better statistics. These tables do not
-- have use_remote_estimate set.
--ANALYZE ft4;
--ANALYZE ft5;
-- join two tables
--Testcase 65:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 66:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join three tables
--Testcase 67:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 68:
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
-- left outer join
--Testcase 69:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 70:
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- left outer join three tables
--Testcase 71:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 72:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- left outer join + placement of clauses.
-- clauses within the nullable side are not pulled up, but top level clause on
-- non-nullable side is pushed into non-nullable side
--Testcase 73:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
--Testcase 74:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
-- clauses within the nullable side are not pulled up, but the top level clause
-- on nullable side is not pushed down into nullable side
--Testcase 75:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
--Testcase 76:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
-- right outer join
--Testcase 77:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 78:
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
-- right outer join three tables
--Testcase 79:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 80:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- full outer join
--Testcase 81:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
--Testcase 82:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
-- full outer join with restrictions on the joining relations
-- a. the joining relations are both base relations
--Testcase 83:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 84:
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 85:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
--Testcase 86:
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
-- b. one of the joining relations is a base relation and the other is a join
-- relation
--Testcase 87:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 88:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- c. test deparsing the remote query as nested subqueries
--Testcase 89:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 90:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- d. test deparsing rowmarked relations as subqueries
--Testcase 91:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
--Testcase 92:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
-- full outer join + inner join
--Testcase 93:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
--Testcase 94:
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
-- full outer join three tables
--Testcase 95:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 96:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + right outer join
--Testcase 97:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 98:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- right outer join + full outer join
--Testcase 99:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 100:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + left outer join
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 102:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- left outer join + full outer join
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 104:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
--Testcase 775:
SET enable_memoize TO off;
-- right outer join + left outer join
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 106:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 776:
RESET enable_memoize;
-- left outer join + right outer join
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 108:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause, only matched rows
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 110:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause with shippable extensions set
--Testcase 504:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--ALTER SERVER sqlite_svr2 OPTIONS (DROP extensions);
-- full outer join + WHERE clause with shippable extensions not set
--Testcase 505:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--Testcase 777:
-- ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- join two tables with FOR UPDATE clause
-- tests whole-row reference for row marks
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 112:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
--Testcase 114:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
-- join two tables with FOR SHARE clause
--Testcase 115:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 116:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
--Testcase 118:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
-- join in CTE
--Testcase 119:
EXPLAIN (VERBOSE, COSTS OFF)
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
--Testcase 120:
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
-- ctid with whole-row reference
--Testcase 121:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- SEMI JOIN, not pushed down
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 123:
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- ANTI JOIN, not pushed down
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 125:
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- CROSS JOIN can be pushed down
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 127:
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- different server, not pushed down. No result expected.
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 129:
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe join conditions (c8 has a UDT), not pushed down. Practically a CROSS
-- JOIN since c8 in both tables has same value.
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 131:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe conditions on one side (c8 has a UDT), not pushed down.
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 133:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join where unsafe to pushdown condition in WHERE clause has a column not
-- in the SELECT clause. In this test unsafe clause needs to have column
-- references from both joining sides so that the clause is not pushed down
-- into one of the joining sides.
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 135:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- Aggregate after UNION, for testing setrefs
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
--Testcase 137:
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
-- join with lateral reference
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
--Testcase 139:
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
-- join with pseudoconstant quals, not pushed down.
--Testcase 997:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1 AND CURRENT_USER = SESSION_USER) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- non-Var items in targetlist of the nullable rel of a join preventing
-- push-down in some cases
-- unable to push {ft1, ft2}
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
--Testcase 141:
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
-- ok to push {ft1, ft2} but not {ft1, ft2, ft4}
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
--Testcase 143:
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
-- join with nullable side with some columns with null values
--Testcase 144:
UPDATE ft5 SET c3 = null where c1 % 9 = 0;
--Testcase 145:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
--Testcase 146:
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
-- multi-way join involving multiple merge joins
-- (this case used to have EPQ-related planning problems)
--Testcase 506:
CREATE TABLE local_tbl (c1 int NOT NULL, c2 int NOT NULL, c3 text, CONSTRAINT local_tbl_pkey PRIMARY KEY (c1));
--Testcase 507:
INSERT INTO local_tbl SELECT id, id % 10, to_char(id, 'FM0000') FROM generate_series(1, 1000) id;
ANALYZE local_tbl;
--Testcase 778:
SET enable_nestloop TO false;
--Testcase 779:
SET enable_hashjoin TO false;
--Testcase 147:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 FOR UPDATE;
--Testcase 148:
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 ORDER BY ft1.c1 FOR UPDATE;
--Testcase 780:
RESET enable_nestloop;
--Testcase 781:
RESET enable_hashjoin;
-- test that add_paths_with_pathkeys_for_rel() arranges for the epq_path to
-- return columns needed by the parent ForeignScan node
-- This does not work as SQLite FDW does not support use_remote_estimate
--Testcase 987:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM local_tbl LEFT JOIN (SELECT ft1.*, COALESCE(ft1.c3 || ft2.c3, 'foobar') FROM ft1 INNER JOIN ft2 ON (ft1.c1 = ft2.c1 AND ft1.c1 < 100)) ss ON (local_tbl.c1 = ss.c1) ORDER BY local_tbl.c1 FOR UPDATE OF local_tbl;
-- ALTER SERVER loopback OPTIONS (DROP extensions);
-- ALTER SERVER loopback OPTIONS (ADD fdw_startup_cost '10000.0');
--Testcase 988:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM local_tbl LEFT JOIN (SELECT ft1.* FROM ft1 INNER JOIN ft2 ON (ft1.c1 = ft2.c1 AND ft1.c1 < 100 AND (ft1.c1 - sqlite_fdw_abs(ft2.c2)) = 0)) ss ON (local_tbl.c3 = ss.c3) ORDER BY local_tbl.c1 FOR UPDATE OF local_tbl;
-- ALTER SERVER loopback OPTIONS (DROP fdw_startup_cost);
-- ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
--DROP TABLE local_tbl;
-- check join pushdown in situations where multiple userids are involved
-- Although SQLite FDW does not need User and User mapping to connect to
-- the database file, however, JOIN pushdown is decided by the core code.
-- If outer and inner relation are foreign tables (or joins) belonging to
-- the same server and assigned to the same user, join will be pushed down.
-- Otherwise, join cannot be pushed down.
-- In addition to an exact match of userid, we allow the case where one side
-- has zero userid (implying current user) and the other side has explicit
-- userid that happens to equal the current user; but in that case, pushdown of
-- the join is only valid for the current user.
--Testcase 508:
CREATE ROLE regress_view_owner SUPERUSER;
--Testcase 509:
-- CREATE USER MAPPING FOR regress_view_owner SERVER sqlite_svr;
GRANT SELECT ON ft4 TO regress_view_owner;
GRANT SELECT ON ft5 TO regress_view_owner;
--Testcase 510:
CREATE VIEW v4 AS SELECT * FROM ft4;
--Testcase 511:
CREATE VIEW v5 AS SELECT * FROM ft5;
--Testcase 782:
ALTER VIEW v5 OWNER TO regress_view_owner;
--Testcase 149:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, different view owners
--Testcase 150:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 783:
ALTER VIEW v4 OWNER TO regress_view_owner;
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 152:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, view owner not current user
--Testcase 154:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 784:
ALTER VIEW v4 OWNER TO CURRENT_USER;
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 156:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 785:
ALTER VIEW v4 OWNER TO regress_view_owner;
-- Comment out these test cases.
-- sqlite_fdw does not need to getUserMapping in planning phase,
-- so it is unable to check userid to use when querying the remote table is correctly propagated into foreign rels.
-- -- ====================================================================
-- -- Check that userid to use when querying the remote table is correctly
-- -- propagated into foreign rels present in subqueries under an UNION ALL
-- -- ====================================================================
-- CREATE ROLE regress_view_owner_another;
-- ALTER VIEW v4 OWNER TO regress_view_owner_another;
-- GRANT SELECT ON ft4 TO regress_view_owner_another;
-- ALTER FOREIGN TABLE ft4 OPTIONS (ADD use_remote_estimate 'true');
-- -- The following should query the remote backing table of ft4 as user
-- -- regress_view_owner_another, the view owner, though it fails as expected
-- -- due to the lack of a user mapping for that user.
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4;
-- -- Likewise, but with the query under an UNION ALL
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4);
-- -- Should not get that error once a user mapping is created
-- CREATE USER MAPPING FOR regress_view_owner_another SERVER loopback OPTIONS (password_required 'false');
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4;
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4);
-- DROP USER MAPPING FOR regress_view_owner_another SERVER loopback;
-- DROP OWNED BY regress_view_owner_another;
-- DROP ROLE regress_view_owner_another;
-- ALTER FOREIGN TABLE ft4 OPTIONS (SET use_remote_estimate 'false');
-- cleanup
--Testcase 512:
DROP OWNED BY regress_view_owner;
--Testcase 513:
DROP ROLE regress_view_owner;
-- ===================================================================
-- Aggregate and grouping queries
-- ===================================================================
-- Simple aggregates
--Testcase 157:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 158:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 514:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
--Testcase 515:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
-- Aggregate is not pushed down as aggregation contains random()
--Testcase 159:
explain (verbose, costs off)
select sum(c1 * (random() <= 1)::int) as sum, avg(c1) from ft1;
-- Aggregate over join query
--Testcase 160:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
--Testcase 161:
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
-- Not pushed down due to local conditions present in underneath input rel
--Testcase 162:
explain (verbose, costs off)
select sum(t1.c1), count(t2.c1) from ft1 t1 inner join ft2 t2 on (t1.c1 = t2.c1) where ((t1.c1 * t2.c1)/(t1.c1 * t2.c1)) * random() <= 1;
-- GROUP BY clause having expressions
--Testcase 163:
explain (verbose, costs off)
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
--Testcase 164:
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
-- Aggregates in subquery are pushed down.
set enable_incremental_sort = off;
--Testcase 165:
explain (verbose, costs off)
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
--Testcase 166:
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
reset enable_incremental_sort;
-- Aggregate is still pushed down by taking unshippable expression out
--Testcase 167:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
--Testcase 168:
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
-- Aggregate with unshippable GROUP BY clause are not pushed
--Testcase 169:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as c2 from ft2 group by c2 * (random() <= 1)::int order by 1;
-- GROUP BY clause in various forms, cardinal, alias and constant expression
--Testcase 516:
explain (verbose, costs off)
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
--Testcase 517:
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
-- GROUP BY clause referring to same column multiple times
-- Also, ORDER BY contains an aggregate function
--Testcase 170:
--Testcase 966:
explain (verbose, costs off)
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
--Testcase 171:
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
-- Testing HAVING clause shippability
--Testcase 172:
explain (verbose, costs off)
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
--Testcase 173:
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
-- Unshippable HAVING clause will be evaluated locally, and other qual in HAVING clause is pushed down
--Testcase 174:
explain (verbose, costs off)
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
--Testcase 175:
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
-- Aggregate in HAVING clause is not pushable, and thus aggregation is not pushed down
--Testcase 176:
explain (verbose, costs off)
select sum(c1) from ft1 group by c2 having avg(c1 * (random() <= 1)::int) > 100 order by 1;
-- Remote aggregate in combination with a local Param (for the output
-- of an initplan) can be trouble, per bug #15781
--Testcase 518:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 519:
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 520:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
--Testcase 521:
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
-- Testing ORDER BY, DISTINCT, FILTER, Ordered-sets and VARIADIC within aggregates
-- ORDER BY within aggregate, same column used to order
--Testcase 177:
explain (verbose, costs off)
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
--Testcase 178:
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
-- ORDER BY within aggregate, different column used to order also using DESC
--Testcase 179:
explain (verbose, costs off)
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
--Testcase 180:
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
-- DISTINCT within aggregate
--Testcase 181:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 182:
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- DISTINCT combined with ORDER BY within aggregate
--Testcase 183:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 184:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 185:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 186:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- FILTER within aggregate
--Testcase 187:
explain (verbose, costs off)
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
--Testcase 188:
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
-- DISTINCT, ORDER BY and FILTER within aggregate
--Testcase 189:
explain (verbose, costs off)
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
--Testcase 190:
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
-- Outer query is aggregation query
--Testcase 191:
explain (verbose, costs off)
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 192:
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Inner query is aggregation query
--Testcase 193:
explain (verbose, costs off)
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 194:
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Aggregate not pushed down as FILTER condition is not pushable
--Testcase 195:
explain (verbose, costs off)
select sum(c1) filter (where (c1 / c1) * random() <= 1) from ft1 group by c2 order by 1;
--Testcase 196:
explain (verbose, costs off)
select sum(c2) filter (where c2 in (select c2 from ft1 where c2 < 5)) from ft1;
-- Ordered-sets within aggregate
--Testcase 197:
explain (verbose, costs off)
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
--Testcase 198:
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
-- Using multiple arguments within aggregates
--Testcase 199:
explain (verbose, costs off)
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
--Testcase 200:
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
-- User defined function for user defined aggregate, VARIADIC
--Testcase 522:
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)';
--Testcase 523:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
-- Disable hash aggregation for plan stability.
--Testcase 786:
set enable_hashagg to false;
-- Not pushed down due to user defined aggregate
--Testcase 524:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Add function and aggregate into extension
--alter extension postgres_fdw add function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw add aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now aggregate will be pushed. Aggregate will display VARIADIC argument.
--Testcase 525:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
--Testcase 526:
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
-- Remove function and aggregate from extension
--alter extension postgres_fdw drop function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw drop aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Not pushed down as we have dropped objects from extension.
--Testcase 527:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Cleanup
--Testcase 787:
reset enable_hashagg;
--Testcase 528:
drop aggregate least_agg(variadic items anyarray);
--Testcase 529:
drop function least_accum(anyelement, variadic anyarray);
-- Testing USING OPERATOR() in ORDER BY within aggregate.
-- For this, we need user defined operators along with operator family and
-- operator class. Create those and then add them in extension. Note that
-- user defined objects are considered unshippable unless they are part of
-- the extension.
--Testcase 530:
create operator public.<^ (
leftarg = int4,
rightarg = int4,
procedure = int4eq
);
--Testcase 531:
create operator public.=^ (
leftarg = int4,
rightarg = int4,
procedure = int4lt
);
--Testcase 532:
create operator public.>^ (
leftarg = int4,
rightarg = int4,
procedure = int4gt
);
--Testcase 533:
create operator family my_op_family using btree;
--Testcase 534:
create function my_op_cmp(a int, b int) returns int as
$$begin return btint4cmp(a, b); end $$ language plpgsql;
--Testcase 535:
create operator class my_op_class for type int using btree family my_op_family as
operator 1 public.<^,
operator 3 public.=^,
operator 5 public.>^,
function 1 my_op_cmp(int, int);
-- This will not be pushed as user defined sort operator is not part of the
-- extension yet.
--Testcase 536:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- This should not be pushed either.
--Testcase 967:
explain (verbose, costs off)
select * from ft2 order by c1 using operator(public.<^);
-- Update local stats on ft2
--ANALYZE ft2;
-- Add into extension
--Testcase 788:
alter extension sqlite_fdw add operator class my_op_class using btree;
--Testcase 789:
alter extension sqlite_fdw add function my_op_cmp(a int, b int);
--Testcase 790:
alter extension sqlite_fdw add operator family my_op_family using btree;
--Testcase 791:
alter extension sqlite_fdw add operator public.<^(int, int);
--Testcase 792:
alter extension sqlite_fdw add operator public.=^(int, int);
--Testcase 793:
alter extension sqlite_fdw add operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
--alter server loopback options (add fdw_tuple_cost '0.5');
-- Now this will be pushed as sort operator is part of the extension.
--Testcase 537:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
--Testcase 538:
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
--alter server loopback options (drop fdw_tuple_cost);
-- This should be pushed too.
-- Sqlite not support pushdown user defined operators
--Testcase 968:
explain (verbose, costs off)
select * from ft2 order by c1 using operator(public.<^);
-- Remove from extension
--Testcase 794:
alter extension sqlite_fdw drop operator class my_op_class using btree;
--Testcase 795:
alter extension sqlite_fdw drop function my_op_cmp(a int, b int);
--Testcase 796:
alter extension sqlite_fdw drop operator family my_op_family using btree;
--Testcase 797:
alter extension sqlite_fdw drop operator public.<^(int, int);
--Testcase 798:
alter extension sqlite_fdw drop operator public.=^(int, int);
--Testcase 799:
alter extension sqlite_fdw drop operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- This will not be pushed as sort operator is now removed from the extension.
--Testcase 539:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Cleanup
--Testcase 540:
drop operator class my_op_class using btree;
--Testcase 541:
drop function my_op_cmp(a int, b int);
--Testcase 542:
drop operator family my_op_family using btree;
--Testcase 543:
drop operator public.>^(int, int);
--Testcase 544:
drop operator public.=^(int, int);
--Testcase 545:
drop operator public.<^(int, int);
-- Input relation to aggregate push down hook is not safe to pushdown and thus
-- the aggregate cannot be pushed down to foreign server.
--Testcase 201:
explain (verbose, costs off)
select count(t1.c3) from ft2 t1 left join ft2 t2 on (t1.c1 = random() * t2.c2);
-- Subquery in FROM clause having aggregate
--Testcase 202:
explain (verbose, costs off)
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
--Testcase 203:
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
-- FULL join with IS NULL check in HAVING
--Testcase 204:
explain (verbose, costs off)
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
--Testcase 205:
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
-- Aggregate over FULL join needing to deparse the joining relations as
-- subqueries.
--Testcase 206:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
--Testcase 207:
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
-- ORDER BY expression is part of the target list but not pushed down to
-- foreign server.
--Testcase 208:
explain (verbose, costs off)
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
--Testcase 209:
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
-- LATERAL join, with parameterization
--Testcase 800:
set enable_hashagg to false;
--Testcase 210:
explain (verbose, costs off)
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 211:
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 801:
reset enable_hashagg;
-- bug #15613: bad plan for foreign table scan with lateral reference
--Testcase 546:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
--Testcase 547:
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
-- Check with placeHolderVars
--Testcase 212:
explain (verbose, costs off)
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
--Testcase 213:
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
-- Not supported cases
-- Grouping sets
--Testcase 214:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 215:
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 216:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 217:
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 218:
explain (verbose, costs off)
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 219:
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 220:
explain (verbose, costs off)
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
--Testcase 221:
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
-- DISTINCT itself is not pushed down, whereas underneath aggregate is pushed
--Testcase 222:
explain (verbose, costs off)
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
--Testcase 223:
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
-- WindowAgg
--Testcase 224:
explain (verbose, costs off)
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 225:
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 226:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 227:
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 228:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 229:
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
-- ===================================================================
-- parameterized queries
-- ===================================================================
-- simple join
--Testcase 230:
PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $1 AND t2.c1 = $2;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2);
--Testcase 232:
EXECUTE st1(1, 1);
--Testcase 233:
EXECUTE st1(101, 101);
-- subquery using stable function (can't be sent to remote)
--Testcase 234:
PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1;
--Testcase 235:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st2(10, 20);
--Testcase 236:
EXECUTE st2(10, 20);
--Testcase 237:
EXECUTE st2(101, 121);
-- subquery using immutable function (can be sent to remote)
--Testcase 238:
PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1;
--Testcase 239:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st3(10, 20);
--Testcase 240:
EXECUTE st3(10, 20);
--Testcase 241:
EXECUTE st3(20, 30);
-- custom plan should be chosen initially
--Testcase 242:
PREPARE st4(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 = $1;
--Testcase 243:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 244:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 245:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 246:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 247:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- once we try it enough times, should switch to generic plan
--Testcase 248:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- value of $1 should not be sent to remote
--Testcase 249:
PREPARE st5(text,int) AS SELECT * FROM ft1 t1 WHERE c8 = $1 and c1 = $2;
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 254:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 255:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 256:
EXECUTE st5('foo', 1);
-- altering FDW options requires replanning
--Testcase 257:
PREPARE st6 AS SELECT * FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 258:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 259:
PREPARE st7 AS INSERT INTO ft1 (c1,c2,c3) VALUES (1001,101,'foo');
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 548:
INSERT INTO "S 1"."T 0" SELECT * FROM "S 1"."T 1";
--Testcase 802:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 0');
--Testcase 261:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 262:
EXECUTE st6;
--Testcase 263:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 803:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 1');
--Testcase 549:
PREPARE st8 AS SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 550:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 551:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--Testcase 552:
EXECUTE st8;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- cleanup
DEALLOCATE st1;
DEALLOCATE st2;
DEALLOCATE st3;
DEALLOCATE st4;
DEALLOCATE st5;
DEALLOCATE st6;
DEALLOCATE st7;
DEALLOCATE st8;
-- System columns, except ctid and oid, should not be sent to remote
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'pg_class'::regclass LIMIT 1;
--Testcase 265:
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'ft1'::regclass LIMIT 1;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 267:
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 553:
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 554:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ctid, * FROM ft1 t1 LIMIT 1;
--Testcase 271:
SELECT ctid, * FROM ft1 t1 LIMIT 1;
-- ===================================================================
-- used in PL/pgSQL function
-- ===================================================================
--Testcase 555:
CREATE OR REPLACE FUNCTION f_test(p_c1 int) RETURNS int AS $$
DECLARE
v_c1 int;
BEGIN
--Testcase 556:
SELECT c1 INTO v_c1 FROM ft1 WHERE c1 = p_c1 LIMIT 1;
PERFORM c1 FROM ft1 WHERE c1 = p_c1 AND p_c1 = v_c1 LIMIT 1;
RETURN v_c1;
END;
$$ LANGUAGE plpgsql;
--Testcase 272:
SELECT f_test(100);
--Testcase 557:
DROP FUNCTION f_test(int);
-- ===================================================================
-- REINDEX
-- ===================================================================
-- remote table is not created here
--Testcase 804:
CREATE FOREIGN TABLE reindex_foreign (c1 int, c2 int)
SERVER sqlite_svr2 OPTIONS (table 'reindex_local');
REINDEX TABLE reindex_foreign; -- error
REINDEX TABLE CONCURRENTLY reindex_foreign; -- error
--Testcase 805:
DROP FOREIGN TABLE reindex_foreign;
-- partitions and foreign tables
--Testcase 806:
CREATE TABLE reind_fdw_parent (c1 int) PARTITION BY RANGE (c1);
--Testcase 807:
CREATE TABLE reind_fdw_0_10 PARTITION OF reind_fdw_parent
FOR VALUES FROM (0) TO (10);
--Testcase 808:
CREATE FOREIGN TABLE reind_fdw_10_20 PARTITION OF reind_fdw_parent
FOR VALUES FROM (10) TO (20)
SERVER sqlite_svr OPTIONS (table 'reind_local_10_20');
REINDEX TABLE reind_fdw_parent; -- ok
REINDEX TABLE CONCURRENTLY reind_fdw_parent; -- ok
--Testcase 809:
DROP TABLE reind_fdw_parent;
-- ===================================================================
-- conversion error
-- ===================================================================
--Testcase 810:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE int;
--Testcase 273:
SELECT * FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8) WHERE x1 = 1;
--Testcase 274:
SELECT ftx.x1, ft2.c2, ftx.x8 FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 275:
SELECT ftx.x1, ft2.c2, ftx FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 276:
SELECT sum(c2), array_agg(c8) FROM ft1 GROUP BY c8;
-- ANALYZE ft1; -- ERROR
-- ===================================================================
-- local type can be different from remote type in some cases,
-- in particular if similarly-named operators do equivalent things
-- ===================================================================
--Testcase 811:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE text;
--Testcase 969:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c8 = 'foo' LIMIT 1;
--Testcase 970:
SELECT * FROM ft1 WHERE c8 = 'foo' LIMIT 1;
--Testcase 971:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE 'foo' = c8 LIMIT 1;
--Testcase 972:
SELECT * FROM ft1 WHERE 'foo' = c8 LIMIT 1;
-- we declared c8 to be text locally, but it's still the same type on
-- the remote which will balk if we try to do anything incompatible
-- with that remote type
-- Can not create user define type in SqliteDB.
-- Type c8 of foreign table ft1 and remote table T1 are
-- match. These case below not error with sqlite_fdw.
-- with that remote type
--Testcase 973:
SELECT * FROM ft1 WHERE c8 LIKE 'foo' LIMIT 1; -- ERROR
--Testcase 974:
SELECT * FROM ft1 WHERE c8::text LIKE 'foo' LIMIT 1; -- ERROR; cast not pushed down
-- ===================================================================
-- subtransaction
-- + local/remote error doesn't break cursor
-- ===================================================================
BEGIN;
DECLARE c CURSOR FOR SELECT * FROM ft1 ORDER BY c1;
--Testcase 277:
FETCH c;
SAVEPOINT s;
ERROR OUT; -- ERROR
ROLLBACK TO s;
--Testcase 278:
FETCH c;
SAVEPOINT s;
--Testcase 279:
SELECT * FROM ft1 WHERE 1 / (c1 - 1) > 0; -- ERROR
ROLLBACK TO s;
--Testcase 280:
FETCH c;
--Testcase 281:
SELECT * FROM ft1 ORDER BY c1 LIMIT 1;
COMMIT;
-- ===================================================================
-- test handling of collations
-- ===================================================================
--Testcase 558:
create foreign table ft3 (f1 text collate "C", f2 text, f3 varchar(10)) server sqlite_svr;
-- can be sent to remote
--Testcase 559:
explain (verbose, costs off) select * from ft3 where f1 = 'foo';
--Testcase 560:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "C" = 'foo';
--Testcase 561:
explain (verbose, costs off) select * from ft3 where f2 = 'foo';
--Testcase 562:
explain (verbose, costs off) select * from ft3 where f3 = 'foo';
--Testcase 563:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 and l.f1 = 'foo';
-- can't be sent to remote
--Testcase 564:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "POSIX" = 'foo';
--Testcase 565:
explain (verbose, costs off) select * from ft3 where f1 = 'foo' COLLATE "C";
--Testcase 566:
explain (verbose, costs off) select * from ft3 where f2 COLLATE "C" = 'foo';
--Testcase 567:
explain (verbose, costs off) select * from ft3 where f2 = 'foo' COLLATE "C";
--Testcase 568:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 COLLATE "POSIX" and l.f1 = 'foo';
-- ===================================================================
-- test writable foreign table stuff
-- ===================================================================
--Testcase 282:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 283:
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 284:
INSERT INTO ft2 (c1,c2,c3) VALUES (1101,201,'aaa'), (1102,202,'bbb'), (1103,203,'ccc');
--Testcase 285:
SELECT * FROM ft2 WHERE c1 >= 1101;
--Testcase 286:
INSERT INTO ft2 (c1,c2,c3) VALUES (1104,204,'ddd'), (1105,205,'eee');
--Testcase 287:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3; -- can be pushed down
--Testcase 288:
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3;
--Testcase 289:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7; -- can be pushed down
--Testcase 290:
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7;
--Testcase 291:
SELECT * FROM ft2 WHERE c1 % 10 = 7;
--Testcase 292:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9; -- can be pushed down
--Testcase 293:
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9;
--Testcase 294:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 % 10 = 5; -- can be pushed down
--Testcase 295:
SELECT c1, c4 FROM ft2 WHERE c1 % 10 = 5;
--Testcase 569:
DELETE FROM ft2 WHERE c1 % 10 = 5;
--Testcase 297:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2; -- can be pushed down
--Testcase 298:
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
--Testcase 299:
SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1;
--Testcase 300:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 301:
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 302:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200; -- can be pushed down
--Testcase 303:
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200;
--Testcase 304:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 = 1200; -- can be pushed down
--Testcase 305:
DELETE FROM ft2 WHERE c1 = 1200;
-- Test UPDATE/DELETE on a three-table join
--Testcase 306:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id;
--Testcase 307:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 308:
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1;
--Testcase 309:
SELECT ft2, ft2.*, ft4, ft4.*
FROM ft2 INNER JOIN ft4 ON (ft2.c1 > 1200 AND ft2.c2 = ft4.c1)
INNER JOIN ft5 ON (ft4.c1 = ft5.c1);
--Testcase 310:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 311:
SELECT 100 FROM ft2, ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 570:
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 312:
DELETE FROM ft2 WHERE ft2.c1 > 1200;
-- Test UPDATE with a MULTIEXPR sub-select
-- (maybe someday this'll be remotely executable, but not today)
--Testcase 571:
EXPLAIN (verbose, costs off)
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 572:
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 573:
UPDATE ft2 AS target SET (c2) = (
SELECT c2 / 10
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
-- Test UPDATE involving a join that can be pushed down,
-- but a SET clause that can't be
--Testcase 812:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
--Testcase 813:
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
-- Test UPDATE/DELETE with WHERE or JOIN/ON conditions containing
-- user-defined operators/functions
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 574:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id % 10, to_char(id, 'FM00000') FROM generate_series(2001, 2010) id;
--Testcase 575:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000; -- can't be pushed down
--Testcase 576:
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 577:
SELECT * FROM ft2 WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 578:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1; -- can't be pushed down
--Testcase 579:
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 580:
SELECT ft2.*, ft4.*, ft5.*
FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 581:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 582:
SELECT ft2.c1, ft2.c2, ft2.c3 FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 583:
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1;
--Testcase 584:
DELETE FROM ft2 WHERE ft2.c1 > 2000;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- Test that trigger on remote table works as expected
--Testcase 585:
CREATE OR REPLACE FUNCTION "S 1".F_BRTRIG() RETURNS trigger AS $$
BEGIN
NEW.c3 = NEW.c3 || '_trig_update';
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
--Testcase 586:
CREATE TRIGGER t1_br_insert BEFORE INSERT OR UPDATE
ON ft2 FOR EACH ROW EXECUTE PROCEDURE "S 1".F_BRTRIG();
--Testcase 313:
INSERT INTO ft2 (c1,c2,c3) VALUES (1208, 818, 'fff');
--Testcase 314:
SELECT * FROM ft2 WHERE c1 = 1208;
--Testcase 315:
INSERT INTO ft2 (c1,c2,c3,c6) VALUES (1218, 818, 'ggg', '(--;');
--Testcase 316:
SELECT * FROM ft2 WHERE c1 = 1218;
--Testcase 317:
UPDATE ft2 SET c2 = c2 + 600, c3 = c3 WHERE c1 % 10 = 8 AND c1 < 1200;
--Testcase 318:
SELECT * FROM ft2 WHERE c1 % 10 = 8 AND c1 < 1200;
-- Test errors thrown on remote side during update
-- create table in the remote server with check contraint
--Testcase 738:
CREATE FOREIGN TABLE ft1_constraint (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr OPTIONS (table 't1_constraint');
--Testcase 747:
INSERT INTO ft1_constraint SELECT * FROM ft1 ON CONFLICT DO NOTHING;
-- c2 must be greater than or equal to 0, so this case is ignored.
--Testcase 754:
INSERT INTO ft1_constraint(c1, c2) VALUES (2222, -2) ON CONFLICT DO NOTHING; -- ignore, do nothing
--Testcase 755:
SELECT c1, c2 FROM ft1_constraint WHERE c1 = 2222 or c2 = -2; -- empty result
--Testcase 748:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 749:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
--Testcase 319:
INSERT INTO ft1(c1, c2) VALUES(11, 12); -- duplicate key
--Testcase 320:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO NOTHING; -- unsupported
--Testcase 321:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO UPDATE SET c3 = 'ffg'; -- unsupported
--Testcase 743:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 744:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 750:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_constraint;
--Testcase 751:
ALTER FOREIGN TABLE ft1_org RENAME TO ft1;
-- Test savepoint/rollback behavior
--Testcase 322:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 323:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
begin;
--Testcase 324:
update ft2 set c2 = 42 where c2 = 0;
--Testcase 325:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s1;
--Testcase 326:
update ft2 set c2 = 44 where c2 = 4;
--Testcase 327:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s1;
--Testcase 328:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s2;
--Testcase 329:
update ft2 set c2 = 46 where c2 = 6;
--Testcase 330:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
rollback to savepoint s2;
--Testcase 331:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s2;
--Testcase 332:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s3;
--Testcase 333:
--skip, does not support CHECK
--update ft2 set c2 = -2 where c2 = 42 and c1 = 10; -- fail on remote side
rollback to savepoint s3;
--Testcase 334:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s3;
--Testcase 335:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
-- none of the above is committed yet remotely
--Testcase 336:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
commit;
--Testcase 337:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 338:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
--VACUUM ANALYZE "S 1"."T 1";
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
-- FIRST behavior here.
-- ORDER BY DESC NULLS LAST options
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
--Testcase 340:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
-- ORDER BY DESC NULLS FIRST options
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 342:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ORDER BY ASC NULLS FIRST options
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 344:
SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ===================================================================
-- test check constraints
-- ===================================================================
--Testcase 752:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 753:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
-- Consistent check constraints provide consistent results
--Testcase 814:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2positive CHECK (c2 >= 0);
--Testcase 587:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 588:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 815:
SET constraint_exclusion = 'on';
--Testcase 589:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 590:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 816:
RESET constraint_exclusion;
-- check constraint is enforced on the remote side, not locally
--Testcase 745:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 746:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 817:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2positive;
-- But inconsistent check constraints provide inconsistent results
--Testcase 818:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2negative CHECK (c2 < 0);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 592:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 819:
SET constraint_exclusion = 'on';
--Testcase 593:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 594:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 820:
RESET constraint_exclusion;
-- local check constraint is not actually enforced
--Testcase 595:
INSERT INTO ft1(c1, c2) VALUES(1111, 2);
--Testcase 596:
UPDATE ft1 SET c2 = c2 + 1 WHERE c1 = 1;
--Testcase 821:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2negative;
-- ===================================================================
-- test WITH CHECK OPTION constraints
-- ===================================================================
--Testcase 597:
CREATE FUNCTION row_before_insupd_trigfunc() RETURNS trigger AS $$BEGIN NEW.a := NEW.a + 10; RETURN NEW; END$$ LANGUAGE plpgsql;
--Testcase 598:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 599:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 600:
CREATE VIEW rw_view AS SELECT * FROM foreign_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 601:
\d+ rw_view
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 602:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 603:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 604:
INSERT INTO rw_view VALUES (0, 15); -- error
--Testcase 605:
SELECT * FROM foreign_tbl;
--Testcase 606:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 607:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 608:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 609:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 610:
SELECT * FROM foreign_tbl;
-- We don't allow batch insert when there are any WCO constraints
ALTER SERVER sqlite_svr OPTIONS (ADD batch_size '10');
--Testcase 989:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15), (1, 5);
--Testcase 990:
INSERT INTO rw_view VALUES (0, 15), (1, 5); -- should fail
--Testcase 991:
SELECT * FROM foreign_tbl;
ALTER SERVER sqlite_svr OPTIONS (DROP batch_size);
--Testcase 611:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 612:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
-- test WCO for partitions
--Testcase 613:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 614:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 615:
CREATE TABLE parent_tbl (a int, b int) PARTITION BY RANGE(a);
--Testcase 822:
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
-- Detach and re-attach once, to stress the concurrent detach case.
--Testcase 975:
ALTER TABLE parent_tbl DETACH PARTITION foreign_tbl CONCURRENTLY;
--Testcase 976:
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
--Testcase 616:
CREATE VIEW rw_view AS SELECT * FROM parent_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 617:
\d+ rw_view
--Testcase 618:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 619:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 620:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 621:
INSERT INTO rw_view VALUES (0, 15); -- ok
--Testcase 622:
SELECT * FROM foreign_tbl;
--Testcase 623:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 624:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 625:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 626:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 627:
SELECT * FROM foreign_tbl;
-- We don't allow batch insert when there are any WCO constraints
ALTER SERVER sqlite_svr OPTIONS (ADD batch_size '10');
--Testcase 992:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15), (1, 5);
--Testcase 993:
INSERT INTO rw_view VALUES (0, 15), (1, 5); -- should fail
--Testcase 994:
SELECT * FROM foreign_tbl;
ALTER SERVER sqlite_svr OPTIONS (DROP batch_size);
--Testcase 628:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
--Testcase 629:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 630:
DROP TABLE parent_tbl CASCADE;
--Testcase 631:
DROP FUNCTION row_before_insupd_trigfunc;
-- -- Try a more complex permutation of WCO where there are multiple levels of
-- -- partitioned tables with columns not all in the same order
-- CREATE TABLE parent_tbl (a int, b text, c numeric) PARTITION BY RANGE(a);
-- CREATE TABLE sub_parent (c numeric, a int, b text) PARTITION BY RANGE(a);
-- ALTER TABLE parent_tbl ATTACH PARTITION sub_parent FOR VALUES FROM (1) TO (10);
-- CREATE TABLE child_local (b text, c numeric, a int);
-- CREATE FOREIGN TABLE child_foreign (b text, c numeric, a int)
-- SERVER loopback OPTIONS (table_name 'child_local');
-- ALTER TABLE sub_parent ATTACH PARTITION child_foreign FOR VALUES FROM (1) TO (10);
-- CREATE VIEW rw_view AS SELECT * FROM parent_tbl WHERE a < 5 WITH CHECK OPTION;
-- INSERT INTO parent_tbl (a) VALUES(1),(5);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- UPDATE rw_view SET b = 'text', c = 123.456;
-- UPDATE rw_view SET b = 'text', c = 123.456;
-- SELECT * FROM parent_tbl ORDER BY a;
-- DROP VIEW rw_view;
-- DROP TABLE child_local;
-- DROP FOREIGN TABLE child_foreign;
-- DROP TABLE sub_parent;
-- DROP TABLE parent_tbl;
-- ===================================================================
-- test serial columns (ie, sequence-based defaults)
-- ===================================================================
--Testcase 632:
create foreign table loc1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr;
--Testcase 633:
create foreign table rem1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr options(table 'loc1');
--Testcase 352:
select pg_catalog.setval('rem1_f1_seq', 10, false);
--Testcase 353:
insert into loc1(f2) values('hi');
--Testcase 634:
insert into rem1(f2) values('hi remote');
--Testcase 354:
insert into loc1(f2) values('bye');
--Testcase 635:
insert into rem1(f2) values('bye remote');
--Testcase 355:
select f1, f2 from loc1;
--Testcase 636:
select f1, f2 from rem1;
-- ===================================================================
-- test generated columns
-- ===================================================================
--Testcase 637:
create foreign table grem1 (
a int options (key 'true'),
b int generated always as (a * 2) stored)
server sqlite_svr options(table 'grem1_post14');
--Testcase 638:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 823:
insert into grem1 (a) values (1), (2);
--Testcase 639:
explain (verbose, costs off)
update grem1 set a = 22 where a = 2;
--Testcase 824:
update grem1 set a = 22 where a = 2;
--Testcase 640:
select * from grem1;
--Testcase 825:
delete from grem1;
-- -- test copy from
-- copy grem1 from stdin;
-- 1
-- 2
-- \.
-- select * from grem1;
-- delete from grem1;
-- test batch insert
--Testcase 826:
alter server sqlite_svr options (add batch_size '10');
--Testcase 827:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 828:
insert into grem1 (a) values (1), (2);
--Testcase 829:
select * from grem1;
--Testcase 830:
delete from grem1;
-- -- batch insert with foreign partitions.
-- -- This schema uses two partitions, one local and one remote with a modulo
-- -- to loop across all of them in batches.
-- create table tab_batch_local (id int, data text);
-- insert into tab_batch_local select i, 'test'|| i from generate_series(1, 45) i;
-- create table tab_batch_sharded (id int, data text) partition by hash(id);
-- create table tab_batch_sharded_p0 partition of tab_batch_sharded
-- for values with (modulus 2, remainder 0);
-- create table tab_batch_sharded_p1_remote (id int, data text);
-- create foreign table tab_batch_sharded_p1 partition of tab_batch_sharded
-- for values with (modulus 2, remainder 1)
-- server loopback options (table_name 'tab_batch_sharded_p1_remote');
-- insert into tab_batch_sharded select * from tab_batch_local;
-- select count(*) from tab_batch_sharded;
-- drop table tab_batch_local;
-- drop table tab_batch_sharded;
-- drop table tab_batch_sharded_p1_remote;
--Testcase 831:
alter server sqlite_svr options (drop batch_size);
-- ===================================================================
-- test local triggers
-- ===================================================================
-- Trigger functions "borrowed" from triggers regress test.
--Testcase 641:
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;$$;
--Testcase 642:
CREATE TRIGGER trig_stmt_before BEFORE DELETE OR INSERT OR UPDATE OR TRUNCATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 1005:
CREATE TRIGGER trig_stmt_after AFTER DELETE OR INSERT OR UPDATE OR TRUNCATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 644:
CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger
LANGUAGE plpgsql AS $$
declare
oldnew text[];
relid text;
argstr text;
begin
relid := TG_relid::regclass;
argstr := '';
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 '%(%) % % % ON %',
tg_name, argstr, TG_when, TG_level, TG_OP, relid;
oldnew := '{}'::text[];
if TG_OP != 'INSERT' then
oldnew := array_append(oldnew, format('OLD: %s', OLD));
end if;
if TG_OP != 'DELETE' then
oldnew := array_append(oldnew, format('NEW: %s', NEW));
end if;
RAISE NOTICE '%', array_to_string(oldnew, ',');
if TG_OP = 'DELETE' then
return OLD;
else
return NEW;
end if;
end;
$$;
-- Test basic functionality
--Testcase 645:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 646:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 356:
delete from rem1;
--Testcase 357:
insert into rem1 values(1,'insert');
--Testcase 358:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 359:
update rem1 set f2 = f2 || f2;
truncate rem1;
-- cleanup
--Testcase 647:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 648:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 649:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 650:
DROP TRIGGER trig_stmt_after ON rem1;
--Testcase 360:
DELETE from rem1;
-- Test multiple AFTER ROW triggers on a foreign table
--Testcase 651:
CREATE TRIGGER trig_row_after1
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 652:
CREATE TRIGGER trig_row_after2
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 653:
insert into rem1 values(1,'insert');
--Testcase 654:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 655:
update rem1 set f2 = f2 || f2;
--Testcase 656:
delete from rem1;
-- cleanup
--Testcase 657:
DROP TRIGGER trig_row_after1 ON rem1;
--Testcase 658:
DROP TRIGGER trig_row_after2 ON rem1;
-- Test WHEN conditions
--Testcase 659:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 660:
CREATE TRIGGER trig_row_after_insupd
AFTER INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Insert or update not matching: nothing happens
--Testcase 363:
INSERT INTO rem1 values(1, 'insert');
--Testcase 364:
UPDATE rem1 set f2 = 'test';
-- Insert or update matching: triggers are fired
--Testcase 365:
INSERT INTO rem1 values(2, 'update');
--Testcase 366:
UPDATE rem1 set f2 = 'update update' where f1 = '2';
--Testcase 661:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 662:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Trigger is fired for f1=2, not for f1=1
--Testcase 369:
DELETE FROM rem1;
-- cleanup
--Testcase 663:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 664:
DROP TRIGGER trig_row_after_insupd ON rem1;
--Testcase 665:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 666:
DROP TRIGGER trig_row_after_delete ON rem1;
-- Test various RETURN statements in BEFORE triggers.
--Testcase 667:
CREATE FUNCTION trig_row_before_insupdate() RETURNS TRIGGER AS $$
BEGIN
NEW.f2 := NEW.f2 || ' triggered !';
RETURN NEW;
END
$$ language plpgsql;
--Testcase 668:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
-- The new values should have 'triggered' appended
--Testcase 370:
INSERT INTO rem1 values(1, 'insert');
--Testcase 371:
SELECT f1, f2 from rem1;
--Testcase 372:
INSERT INTO rem1 values(2, 'insert');
--Testcase 373:
SELECT f1, f2 from rem1;
--Testcase 374:
UPDATE rem1 set f2 = '';
--Testcase 375:
SELECT f1, f2 from rem1;
--Testcase 376:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 377:
SELECT f1, f2 from rem1;
--Testcase 669:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f1 = 10; -- all columns should be transmitted
--Testcase 670:
UPDATE rem1 set f1 = 10;
--Testcase 671:
SELECT f1, f2 from rem1;
--Testcase 378:
DELETE FROM rem1;
-- Add a second trigger, to check that the changes are propagated correctly
-- from trigger to trigger
--Testcase 672:
CREATE TRIGGER trig_row_before_insupd2
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 379:
INSERT INTO rem1 values(1, 'insert');
--Testcase 380:
SELECT f1, f2 from rem1;
--Testcase 381:
INSERT INTO rem1 values(2, 'insert');
--Testcase 382:
SELECT f1, f2 from rem1;
--Testcase 383:
UPDATE rem1 set f2 = '';
--Testcase 384:
SELECT f1, f2 from rem1;
--Testcase 385:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 386:
SELECT f1, f2 from rem1;
--Testcase 673:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 674:
DROP TRIGGER trig_row_before_insupd2 ON rem1;
--Testcase 387:
DELETE from rem1;
--Testcase 388:
INSERT INTO rem1 VALUES (1, 'test');
-- Test with a trigger returning NULL
--Testcase 675:
CREATE FUNCTION trig_null() RETURNS TRIGGER AS $$
BEGIN
RETURN NULL;
END
$$ language plpgsql;
--Testcase 676:
CREATE TRIGGER trig_null
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_null();
-- Nothing should have changed.
--Testcase 389:
INSERT INTO rem1 VALUES (2, 'test2');
--Testcase 390:
SELECT f1, f2 from rem1;
--Testcase 391:
UPDATE rem1 SET f2 = 'test2';
--Testcase 392:
SELECT f1, f2 from rem1;
--Testcase 393:
DELETE from rem1;
--Testcase 394:
SELECT f1, f2 from rem1;
--Testcase 677:
DROP TRIGGER trig_null ON rem1;
--Testcase 395:
DELETE from rem1;
-- Test a combination of local and remote triggers
--Testcase 678:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 679:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 680:
CREATE TRIGGER trig_local_before BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 681:
INSERT INTO rem1(f2) VALUES ('test');
--Testcase 682:
UPDATE rem1 SET f2 = 'testo';
-- Test returning a system attribute
--Testcase 683:
INSERT INTO rem1(f2) VALUES ('test');
-- cleanup
--Testcase 684:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 685:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 686:
DROP TRIGGER trig_local_before ON rem1;
-- Test direct foreign table modification functionality
--Testcase 832:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 833:
EXPLAIN (verbose, costs off)
DELETE FROM rem1 WHERE false; -- currently can't be pushed down
-- Test with statement-level triggers
--Testcase 687:
CREATE TRIGGER trig_stmt_before
BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 396:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 397:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 688:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 689:
CREATE TRIGGER trig_stmt_after
AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 398:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 399:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 690:
DROP TRIGGER trig_stmt_after ON rem1;
-- Test with row-level ON INSERT triggers
--Testcase 691:
CREATE TRIGGER trig_row_before_insert
BEFORE INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 400:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 401:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 692:
DROP TRIGGER trig_row_before_insert ON rem1;
--Testcase 693:
CREATE TRIGGER trig_row_after_insert
AFTER INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 402:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 403:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 694:
DROP TRIGGER trig_row_after_insert ON rem1;
-- Test with row-level ON UPDATE triggers
--Testcase 695:
CREATE TRIGGER trig_row_before_update
BEFORE UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 404:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 405:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 696:
DROP TRIGGER trig_row_before_update ON rem1;
--Testcase 697:
CREATE TRIGGER trig_row_after_update
AFTER UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 406:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 407:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 698:
DROP TRIGGER trig_row_after_update ON rem1;
-- Test with row-level ON DELETE triggers
--Testcase 699:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 408:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 409:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 700:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 701:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 410:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 411:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 702:
DROP TRIGGER trig_row_after_delete ON rem1;
-- ===================================================================
-- test inheritance features
-- ===================================================================
--Testcase 703:
CREATE TABLE a (aa TEXT);
--Testcase 834:
ALTER TABLE a SET (autovacuum_enabled = 'false');
--Testcase 704:
CREATE FOREIGN TABLE b (aa TEXT OPTIONS (key 'true'), bb TEXT) INHERITS (a)
SERVER sqlite_svr OPTIONS (table 'loct');
--Testcase 412:
INSERT INTO a(aa) VALUES('aaa');
--Testcase 413:
INSERT INTO a(aa) VALUES('aaaa');
--Testcase 414:
INSERT INTO a(aa) VALUES('aaaaa');
--Testcase 415:
INSERT INTO b(aa) VALUES('bbb');
--Testcase 416:
INSERT INTO b(aa) VALUES('bbbb');
--Testcase 417:
INSERT INTO b(aa) VALUES('bbbbb');
--Testcase 418:
SELECT tableoid::regclass, * FROM a;
--Testcase 419:
SELECT tableoid::regclass, * FROM b;
--Testcase 420:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 421:
UPDATE a SET aa = 'zzzzzz' WHERE aa LIKE 'aaaa%';
--Testcase 422:
SELECT tableoid::regclass, * FROM a;
--Testcase 423:
SELECT tableoid::regclass, * FROM b;
--Testcase 424:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 425:
UPDATE b SET aa = 'new';
--Testcase 426:
SELECT tableoid::regclass, * FROM a;
--Testcase 427:
SELECT tableoid::regclass, * FROM b;
--Testcase 428:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 429:
UPDATE a SET aa = 'newtoo';
--Testcase 430:
SELECT tableoid::regclass, * FROM a;
--Testcase 431:
SELECT tableoid::regclass, * FROM b;
--Testcase 432:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 433:
DELETE FROM a;
--Testcase 434:
SELECT tableoid::regclass, * FROM a;
--Testcase 435:
SELECT tableoid::regclass, * FROM b;
--Testcase 436:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 705:
DROP TABLE a CASCADE;
-- Check SELECT FOR UPDATE/SHARE with an inherited source table
--Testcase 706:
create table foo (f1 int, f2 int);
--Testcase 707:
create foreign table foo2 (f3 int OPTIONS (key 'true')) inherits (foo)
server sqlite_svr options (table 'loct1');
--Testcase 708:
create table bar (f1 int, f2 int);
--Testcase 709:
create foreign table bar2 (f3 int OPTIONS (key 'true')) inherits (bar)
server sqlite_svr options (table 'loct2');
--Testcase 835:
alter table foo set (autovacuum_enabled = 'false');
--Testcase 836:
alter table bar set (autovacuum_enabled = 'false');
--Testcase 437:
insert into foo values(1,1);
--Testcase 438:
insert into foo values(3,3);
--Testcase 439:
insert into foo2 values(2,2,2);
--Testcase 440:
insert into foo2 values(4,4,4);
--Testcase 441:
insert into bar values(1,11);
--Testcase 442:
insert into bar values(2,22);
--Testcase 443:
insert into bar values(6,66);
--Testcase 444:
insert into bar2 values(3,33,33);
--Testcase 445:
insert into bar2 values(4,44,44);
--Testcase 446:
insert into bar2 values(7,77,77);
--Testcase 447:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 448:
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 449:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for share;
--Testcase 450:
select * from bar where f1 in (select f1 from foo) for share;
-- Now check SELECT FOR UPDATE/SHARE with an inherited source table,
-- where the parent is itself a foreign table
--Testcase 837:
create foreign table foo2child (f3 int) inherits (foo2)
server sqlite_svr options (table 'loct4_2');
--Testcase 838:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 839:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 840:
drop foreign table foo2child;
-- And with a local child relation of the foreign table parent
--Testcase 841:
create table foo2child (f3 int) inherits (foo2);
--Testcase 842:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 843:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 844:
drop table foo2child;
-- Check UPDATE with inherited target and an inherited source table
--Testcase 451:
explain (verbose, costs off)
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 452:
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 453:
select tableoid::regclass, * from bar order by 1,2;
-- Check UPDATE with inherited target and an appendrel subquery
--Testcase 454:
explain (verbose, costs off)
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 455:
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 456:
select tableoid::regclass, * from bar order by 1,2;
-- Test forcing the remote server to produce sorted data for a merge join,
-- but the foreign table is an inheritance child.
--truncate table loct1;
--Testcase 710:
delete from foo2;
truncate table only foo;
\set num_rows_foo 2000
--Testcase 711:
insert into foo2 select generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2);
--Testcase 712:
insert into foo select generate_series(1, :num_rows_foo, 2), generate_series(1, :num_rows_foo, 2);
--Testcase 845:
SET enable_hashjoin to false;
--Testcase 846:
SET enable_nestloop to false;
--alter foreign table foo2 options (use_remote_estimate 'true');
--create index i_loct1_f1 on loct1(f1);
--Testcase 713:
create index i_foo_f1 on foo(f1);
analyze foo;
--analyze loct1;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 714:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 715:
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 716:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 717:
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 847:
RESET enable_hashjoin;
--Testcase 848:
RESET enable_nestloop;
-- Test that WHERE CURRENT OF is not supported
begin;
declare c cursor for select * from bar where f1 = 7;
--Testcase 457:
fetch from c;
--Testcase 458:
update bar set f2 = null where current of c;
rollback;
--Testcase 459:
explain (verbose, costs off)
delete from foo where f1 < 5;
--Testcase 460:
delete from foo where f1 < 5;
--Testcase 461:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 462:
update bar set f2 = f2 + 100;
--Testcase 463:
select * from bar;
-- Test that UPDATE/DELETE with inherited target works with row-level triggers
--Testcase 718:
CREATE TRIGGER trig_row_before
BEFORE UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 719:
CREATE TRIGGER trig_row_after
AFTER UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 464:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 465:
update bar set f2 = f2 + 100;
--Testcase 466:
explain (verbose, costs off)
delete from bar where f2 < 400;
--Testcase 467:
delete from bar where f2 < 400;
-- cleanup
--Testcase 720:
drop table foo cascade;
--Testcase 721:
drop table bar cascade;
-- Test pushing down UPDATE/DELETE joins to the remote server
--Testcase 722:
create table parent (a int, b text);
--Testcase 723:
create foreign table remt1 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct3');
--Testcase 724:
create foreign table remt2 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct4');
--Testcase 849:
alter foreign table remt1 inherit parent;
--Testcase 468:
insert into remt1 values (1, 'foo');
--Testcase 469:
insert into remt1 values (2, 'bar');
--Testcase 470:
insert into remt2 values (1, 'foo');
--Testcase 471:
insert into remt2 values (2, 'bar');
--Testcase 472:
explain (verbose, costs off)
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 473:
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 474:
select * from parent inner join remt2 on (parent.a = remt2.a);
--Testcase 475:
explain (verbose, costs off)
delete from parent using remt2 where parent.a = remt2.a;
--Testcase 476:
delete from parent using remt2 where parent.a = remt2.a;
-- cleanup
--Testcase 725:
drop foreign table remt1;
--Testcase 726:
drop foreign table remt2;
--Testcase 727:
drop table parent;
/*
-- Skip these tests, sqlite fdw does not support partition table, check constraint, copy from
-- ===================================================================
-- test tuple routing for foreign-table partitions
-- ===================================================================
-- Test insert tuple routing
create table itrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table itrtest attach partition remp1 for values in (1);
alter table itrtest attach partition remp2 for values in (2);
insert into itrtest values (1, 'foo');
insert into itrtest values (1, 'bar') returning *;
insert into itrtest values (2, 'baz');
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
select tableoid::regclass, * FROM itrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
delete from itrtest;
-- MERGE ought to fail cleanly
merge into itrtest using (select 1, 'foo') as source on (true)
when matched then do nothing;
create unique index loct1_idx on loct1 (a);
-- DO NOTHING without an inference specification is supported
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
-- But other cases are not supported
insert into itrtest values (1, 'bar') on conflict (a) do nothing;
insert into itrtest values (1, 'bar') on conflict (a) do update set b = excluded.b;
select tableoid::regclass, * FROM itrtest;
delete from itrtest;
drop index loct1_idx;
-- Test that remote triggers work with insert tuple routing
create function br_insert_trigfunc() returns trigger as $$
begin
new.b := new.b || ' triggered !';
return new;
end
$$ language plpgsql;
create trigger loct1_br_insert_trigger before insert on loct1
for each row execute procedure br_insert_trigfunc();
create trigger loct2_br_insert_trigger before insert on loct2
for each row execute procedure br_insert_trigfunc();
-- The new values are concatenated with ' triggered !'
insert into itrtest values (1, 'foo') returning *;
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
with result as (insert into itrtest values (1, 'test1'), (2, 'test2') returning *) select * from result;
drop trigger loct1_br_insert_trigger on loct1;
drop trigger loct2_br_insert_trigger on loct2;
drop table itrtest;
drop table loct1;
drop table loct2;
-- Test update tuple routing
create table utrtest (a int, b text) partition by list (a);
create table loct (a int check (a in (1)), b text);
create foreign table remp (a int check (a in (1)), b text) server loopback options (table_name 'loct');
create table locp (a int check (a in (2)), b text);
alter table utrtest attach partition remp for values in (1);
alter table utrtest attach partition locp for values in (2);
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- It's not allowed to move a row from a partition that is foreign to another
update utrtest set a = 2 where b = 'foo' returning *;
-- But the reverse is allowed
update utrtest set a = 1 where b = 'qux' returning *;
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- The executor should not let unexercised FDWs shut down
update utrtest set a = 1 where b = 'foo';
-- Test that remote triggers work with update tuple routing
create trigger loct_br_insert_trigger before insert on loct
for each row execute procedure br_insert_trigfunc();
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition is a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 1 or a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 1 or a = 2 returning *;
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition isn't a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 2 returning *;
drop trigger loct_br_insert_trigger on loct;
-- We can move rows to a foreign partition that has been updated already,
-- but can't move rows to a foreign partition that hasn't been updated yet
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- Test the former case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 returning *;
update utrtest set a = 1 returning *;
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
-- Change the definition of utrtest so that the foreign partition get updated
-- after the local partition
delete from utrtest;
alter table utrtest detach partition remp;
drop foreign table remp;
alter table loct drop constraint loct_a_check;
alter table loct add check (a in (3));
create foreign table remp (a int check (a in (3)), b text) server loopback options (table_name 'loct');
alter table utrtest attach partition remp for values in (3);
insert into utrtest values (2, 'qux');
insert into utrtest values (3, 'xyzzy');
-- Test the latter case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 returning *;
update utrtest set a = 3 returning *; -- ERROR
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *;
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *; -- ERROR
drop table utrtest;
drop table loct;
-- Test copy tuple routing
create table ctrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table ctrtest attach partition remp1 for values in (1);
alter table ctrtest attach partition remp2 for values in (2);
copy ctrtest from stdin;
1 foo
2 qux
\.
select tableoid::regclass, * FROM ctrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
-- Copying into foreign partitions directly should work as well
copy remp1 from stdin;
1 bar
\.
select tableoid::regclass, * FROM remp1;
delete from ctrtest;
-- Test copy tuple routing with the batch_size option enabled
alter server loopback options (add batch_size '2');
copy ctrtest from stdin;
1 foo
1 bar
2 baz
2 qux
1 test1
2 test2
\.
select tableoid::regclass, * FROM ctrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
delete from ctrtest;
alter server loopback options (drop batch_size);
drop table ctrtest;
drop table loct1;
drop table loct2;
-- ===================================================================
-- test COPY FROM
-- ===================================================================
create table loc2 (f1 int, f2 text);
alter table loc2 set (autovacuum_enabled = 'false');
create foreign table rem2 (f1 int, f2 text) server loopback options(table_name 'loc2');
-- Test basic functionality
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
delete from rem2;
-- Test check constraints
alter table loc2 add constraint loc2_f1positive check (f1 >= 0);
alter foreign table rem2 add constraint rem2_f1positive check (f1 >= 0);
-- check constraint is enforced on the remote side, not locally
copy rem2 from stdin;
1 foo
2 bar
\.
copy rem2 from stdin; -- ERROR
-1 xyzzy
\.
select * from rem2;
alter foreign table rem2 drop constraint rem2_f1positive;
alter table loc2 drop constraint loc2_f1positive;
delete from rem2;
-- Test local triggers
create trigger trig_stmt_before before insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_stmt_after after insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before on rem2;
drop trigger trig_row_after on rem2;
drop trigger trig_stmt_before on rem2;
drop trigger trig_stmt_after on rem2;
delete from rem2;
create trigger trig_row_before_insert before insert on rem2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on rem2;
delete from rem2;
create trigger trig_null before insert on rem2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on rem2;
delete from rem2;
-- Test remote triggers
create trigger trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on loc2;
delete from rem2;
create trigger trig_null before insert on loc2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on loc2;
delete from rem2;
-- Test a combination of local and remote triggers
create trigger rem2_trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger rem2_trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger loc2_trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger rem2_trig_row_before on rem2;
drop trigger rem2_trig_row_after on rem2;
drop trigger loc2_trig_row_before_insert on loc2;
delete from rem2;
-- test COPY FROM with foreign table created in the same transaction
create table loc3 (f1 int, f2 text);
begin;
create foreign table rem3 (f1 int, f2 text)
server loopback options(table_name 'loc3');
copy rem3 from stdin;
1 foo
2 bar
\.
commit;
select * from rem3;
drop foreign table rem3;
drop table loc3;
*/
-- Test COPY FROM with the batch_size option enabled
-- alter server loopback options (add batch_size '2');
-- -- Test basic functionality
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- select * from rem2;
-- delete from rem2;
-- -- Test check constraints
-- alter table loc2 add constraint loc2_f1positive check (f1 >= 0);
-- alter foreign table rem2 add constraint rem2_f1positive check (f1 >= 0);
-- -- check constraint is enforced on the remote side, not locally
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- copy rem2 from stdin; -- ERROR
-- -1 xyzzy
-- \.
-- select * from rem2;
-- alter foreign table rem2 drop constraint rem2_f1positive;
-- alter table loc2 drop constraint loc2_f1positive;
-- delete from rem2;
-- -- Test remote triggers
-- create trigger trig_row_before_insert before insert on loc2
-- for each row execute procedure trig_row_before_insupdate();
-- -- The new values are concatenated with ' triggered !'
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- select * from rem2;
-- drop trigger trig_row_before_insert on loc2;
-- delete from rem2;
-- create trigger trig_null before insert on loc2
-- for each row execute procedure trig_null();
-- -- Nothing happens
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- select * from rem2;
-- drop trigger trig_null on loc2;
-- delete from rem2;
-- -- Check with zero-column foreign table; batch insert will be disabled
-- alter table loc2 drop column f1;
-- alter table loc2 drop column f2;
-- alter table rem2 drop column f1;
-- alter table rem2 drop column f2;
-- copy rem2 from stdin;
-- select * from rem2;
-- delete from rem2;
-- alter server loopback options (drop batch_size);
-- ===================================================================
-- test for TRUNCATE
-- ===================================================================
--Testcase 850:
CREATE FOREIGN TABLE tru_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable0');
--Testcase 851:
INSERT INTO "S 1".tru_rtable0 (SELECT x FROM generate_series(1,10) x);
-- CREATE TABLE tru_ptable (id int) PARTITION BY HASH(id);
-- CREATE TABLE tru_ptable__p0 PARTITION OF tru_ptable
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0);
-- CREATE TABLE tru_rtable1 (id int primary key);
-- CREATE FOREIGN TABLE tru_ftable__p1 (id int)
-- SERVER sqlite_svr OPTIONS (table 'tru_ptable');
-- INSERT INTO tru_ptable (SELECT x FROM generate_series(11,20) x);
--Testcase 852:
INSERT INTO "S 1".tru_pk_table (SELECT x FROM generate_series(1,10) x);
--Testcase 853:
INSERT INTO "S 1".tru_fk_table(fkey) (SELECT x % 10 + 1 FROM generate_series(5,25) x);
--Testcase 854:
CREATE FOREIGN TABLE tru_pk_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_pk_table');
--Testcase 855:
CREATE FOREIGN TABLE tru_ftable_parent (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_parent');
--Testcase 856:
CREATE FOREIGN TABLE tru_ftable_child () INHERITS (tru_ftable_parent)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_child');
--Testcase 857:
INSERT INTO "S 1".tru_rtable_parent (SELECT x FROM generate_series(1,8) x);
--Testcase 858:
INSERT INTO "S 1".tru_rtable_child (SELECT x FROM generate_series(10, 18) x);
-- normal truncate
--Testcase 859:
SELECT sum(id) FROM tru_ftable; -- 55
TRUNCATE tru_ftable;
--Testcase 860:
SELECT count(*) FROM "S 1".tru_rtable0; -- 0
--Testcase 861:
SELECT count(*) FROM tru_ftable; -- 0
-- 'truncatable' option
--Testcase 862:
ALTER SERVER sqlite_svr OPTIONS (ADD truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 863:
ALTER FOREIGN TABLE tru_ftable OPTIONS (ADD truncatable 'true');
TRUNCATE tru_ftable; -- accepted
--Testcase 864:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 865:
ALTER SERVER sqlite_svr OPTIONS (DROP truncatable);
--Testcase 866:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 867:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'true');
TRUNCATE tru_ftable; -- accepted
-- -- partitioned table with both local and foreign tables as partitions
-- SELECT sum(id) FROM tru_ptable; -- 155
-- TRUNCATE tru_ptable;
-- SELECT count(*) FROM tru_ptable; -- 0
-- SELECT count(*) FROM tru_ptable__p0; -- 0
-- SELECT count(*) FROM tru_ftable__p1; -- 0
-- SELECT count(*) FROM tru_rtable1; -- 0
-- 'CASCADE' option
--Testcase 868:
SELECT sum(id) FROM tru_pk_ftable; -- 55
-- SQLite FDW support TRUNCATE command by executing DELETE statement without WHERE clause.
-- In order to delete records in parent and child table subsequently,
-- SQLite FDW executes "PRAGMA foreign_keys = ON" before executing DELETE statement.
TRUNCATE tru_pk_ftable; -- success
TRUNCATE tru_pk_ftable CASCADE; -- success
--Testcase 869:
SELECT count(*) FROM tru_pk_ftable; -- 0
--Testcase 870:
SELECT count(*) FROM "S 1".tru_fk_table; -- also truncated,0
-- truncate two tables at a command
--Testcase 871:
INSERT INTO tru_ftable (SELECT x FROM generate_series(1,8) x);
--Testcase 872:
INSERT INTO tru_pk_ftable (SELECT x FROM generate_series(3,10) x);
--Testcase 873:
SELECT count(*) from tru_ftable; -- 8
--Testcase 874:
SELECT count(*) from tru_pk_ftable; -- 8
TRUNCATE tru_ftable, tru_pk_ftable;
--Testcase 875:
SELECT count(*) from tru_ftable; -- 0
--Testcase 876:
SELECT count(*) from tru_pk_ftable; -- 0
-- truncate with ONLY clause
-- Since ONLY is specified, the table tru_ftable_child that inherits
-- tru_ftable_parent locally is not truncated.
TRUNCATE ONLY tru_ftable_parent;
--Testcase 877:
SELECT sum(id) FROM tru_ftable_parent; -- 126
TRUNCATE tru_ftable_parent;
--Testcase 878:
SELECT count(*) FROM tru_ftable_parent; -- 0
-- -- in case when remote table has inherited children
-- CREATE TABLE tru_rtable0_child () INHERITS (tru_rtable0);
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(5,9) x);
-- INSERT INTO "S 1".tru_rtable0_child (SELECT x FROM generate_series(10,14) x);
-- SELECT sum(id) FROM tru_ftable; -- 95
-- -- Both parent and child tables in the foreign server are truncated
-- -- even though ONLY is specified because ONLY has no effect
-- -- when truncating a foreign table.
-- TRUNCATE ONLY tru_ftable;
-- SELECT count(*) FROM tru_ftable; -- 0
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(21,25) x);
-- INSERT INTO tru_rtable0_child (SELECT x FROM generate_series(26,30) x);
-- SELECT sum(id) FROM tru_ftable; -- 255
-- TRUNCATE tru_ftable; -- truncate both of parent and child
-- SELECT count(*) FROM tru_ftable; -- 0
-- cleanup
--Testcase 879:
DROP FOREIGN TABLE tru_ftable_parent, tru_ftable_child, tru_pk_ftable,tru_ftable;
-- DROP TABLE tru_rtable0, tru_rtable1, tru_ptable, tru_ptable__p0, tru_pk_table, tru_fk_table,
-- tru_rtable_parent,tru_rtable_child, tru_rtable0_child;
-- ===================================================================
-- test IMPORT FOREIGN SCHEMA
-- ===================================================================
--Testcase 728:
CREATE SCHEMA import_dest1;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest1;
--Testcase 477:
\det+ import_dest1.*
--Testcase 478:
\d import_dest1.*
-- Options
--Testcase 729:
CREATE SCHEMA import_dest2;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest2
OPTIONS (import_default 'true');
--Testcase 479:
\det+ import_dest2.*
--Testcase 480:
\d import_dest2.*
-- Check LIMIT TO and EXCEPT
--Testcase 730:
CREATE SCHEMA import_dest3;
IMPORT FOREIGN SCHEMA public LIMIT TO ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 481:
\det+ import_dest3.*
IMPORT FOREIGN SCHEMA public EXCEPT ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 482:
\det+ import_dest3.*
-- Assorted error cases
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest3;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO notthere;
IMPORT FOREIGN SCHEMA public FROM SERVER nowhere INTO notthere;
/*
-- Skip these test, sqlite fdw does not support fetch_size option, partition table
-- Check case of a type present only on the remote server.
-- We can fake this by dropping the type locally in our transaction.
CREATE TYPE "Colors" AS ENUM ('red', 'green', 'blue');
CREATE TABLE import_source.t5 (c1 int, c2 text collate "C", "Col" "Colors");
CREATE SCHEMA import_dest5;
BEGIN;
DROP TYPE "Colors" CASCADE;
IMPORT FOREIGN SCHEMA import_source LIMIT TO (t5)
FROM SERVER loopback INTO import_dest5; -- ERROR
ROLLBACK;
BEGIN;
CREATE SERVER fetch101 FOREIGN DATA WRAPPER postgres_fdw OPTIONS( fetch_size '101' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
ALTER SERVER fetch101 OPTIONS( SET fetch_size '202' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=202'];
CREATE FOREIGN TABLE table30000 ( x int ) SERVER fetch101 OPTIONS ( fetch_size '30000' );
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '60000');
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=60000'];
ROLLBACK;
-- ===================================================================
-- test partitionwise joins
-- ===================================================================
SET enable_partitionwise_join=on;
CREATE TABLE fprt1 (a int, b int, c varchar) PARTITION BY RANGE(a);
CREATE TABLE fprt1_p1 (LIKE fprt1);
CREATE TABLE fprt1_p2 (LIKE fprt1);
ALTER TABLE fprt1_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt1_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt1_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 2) i;
INSERT INTO fprt1_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 2) i;
CREATE FOREIGN TABLE ftprt1_p1 PARTITION OF fprt1 FOR VALUES FROM (0) TO (250)
SERVER loopback OPTIONS (table_name 'fprt1_p1', use_remote_estimate 'true');
CREATE FOREIGN TABLE ftprt1_p2 PARTITION OF fprt1 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (TABLE_NAME 'fprt1_p2');
ANALYZE fprt1;
ANALYZE fprt1_p1;
ANALYZE fprt1_p2;
CREATE TABLE fprt2 (a int, b int, c varchar) PARTITION BY RANGE(b);
CREATE TABLE fprt2_p1 (LIKE fprt2);
CREATE TABLE fprt2_p2 (LIKE fprt2);
ALTER TABLE fprt2_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt2_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt2_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 3) i;
INSERT INTO fprt2_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 3) i;
CREATE FOREIGN TABLE ftprt2_p1 (b int, c varchar, a int)
SERVER loopback OPTIONS (table_name 'fprt2_p1', use_remote_estimate 'true');
ALTER TABLE fprt2 ATTACH PARTITION ftprt2_p1 FOR VALUES FROM (0) TO (250);
CREATE FOREIGN TABLE ftprt2_p2 PARTITION OF fprt2 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (table_name 'fprt2_p2', use_remote_estimate 'true');
ANALYZE fprt2;
ANALYZE fprt2_p1;
ANALYZE fprt2_p2;
-- inner join three tables
EXPLAIN (COSTS OFF)
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
-- left outer join + nullable clause
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
-- with whole-row reference; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
-- join with lateral reference
EXPLAIN (COSTS OFF)
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
-- with PHVs, partitionwise join selected but no join pushdown
EXPLAIN (COSTS OFF)
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
-- test FOR UPDATE; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
RESET enable_partitionwise_join;
-- ===================================================================
-- test partitionwise aggregates
-- ===================================================================
CREATE TABLE pagg_tab (a int, b int, c text) PARTITION BY RANGE(a);
CREATE TABLE pagg_tab_p1 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p2 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p3 (LIKE pagg_tab);
INSERT INTO pagg_tab_p1 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 10;
INSERT INTO pagg_tab_p2 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 20 and (i % 30) >= 10;
INSERT INTO pagg_tab_p3 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 30 and (i % 30) >= 20;
-- Create foreign partitions
CREATE FOREIGN TABLE fpagg_tab_p1 PARTITION OF pagg_tab FOR VALUES FROM (0) TO (10) SERVER loopback OPTIONS (table_name 'pagg_tab_p1');
CREATE FOREIGN TABLE fpagg_tab_p2 PARTITION OF pagg_tab FOR VALUES FROM (10) TO (20) SERVER loopback OPTIONS (table_name 'pagg_tab_p2');
CREATE FOREIGN TABLE fpagg_tab_p3 PARTITION OF pagg_tab FOR VALUES FROM (20) TO (30) SERVER loopback OPTIONS (table_name 'pagg_tab_p3');
ANALYZE pagg_tab;
ANALYZE fpagg_tab_p1;
ANALYZE fpagg_tab_p2;
ANALYZE fpagg_tab_p3;
-- When GROUP BY clause matches with PARTITION KEY.
-- Plan with partitionwise aggregates is disabled
SET enable_partitionwise_aggregate TO false;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Plan with partitionwise aggregates is enabled
SET enable_partitionwise_aggregate TO true;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Check with whole-row reference
-- Should have all the columns in the target list for the given relation
EXPLAIN (VERBOSE, COSTS OFF)
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- When GROUP BY clause does not match with PARTITION KEY.
EXPLAIN (COSTS OFF)
SELECT b, avg(a), max(a), count(*) FROM pagg_tab GROUP BY b HAVING sum(a) < 700 ORDER BY 1;
*/
/*
-- Skip these tests, sqlite fdw does not support nosuper user.
-- ===================================================================
-- access rights and superuser
-- ===================================================================
-- Non-superuser cannot create a FDW without a password in the connstr
CREATE ROLE regress_nosuper NOSUPERUSER;
GRANT USAGE ON FOREIGN DATA WRAPPER sqlite_fdw TO regress_nosuper;
SET ROLE regress_nosuper;
SHOW is_superuser;
-- This will be OK, we can create the FDW
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_nopw FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- But creation of user mappings for non-superusers should fail
CREATE USER MAPPING FOR public SERVER sqlite_nopw;
CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
CREATE FOREIGN TABLE ft1_nopw (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_nopw;
ALTER FOREIGN TABLE ft1_nopw OPTIONS (table 'T 1');
ALTER FOREIGN TABLE ft1_nopw ALTER COLUMN c1 OPTIONS (column_name 'C 1');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- If we add a password to the connstr it'll fail, because we don't allow passwords
-- in connstrs only in user mappings.
ALTER SERVER loopback_nopw OPTIONS (ADD password 'dummypw');
-- If we add a password for our user mapping instead, we should get a different
-- error because the password wasn't actually *used* when we run with trust auth.
--
-- This won't work with installcheck, but neither will most of the FDW checks.
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- Unpriv user cannot make the mapping passwordless
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- But the superuser can
ALTER USER MAPPING FOR regress_nosuper SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SET ROLE regress_nosuper;
-- Should finally work now
SELECT 1 FROM ft1_nopw LIMIT 1;
-- unpriv user also cannot set sslcert / sslkey on the user mapping
-- first set password_required so we see the right error messages
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (SET password_required 'true');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslcert 'foo.crt');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslkey 'foo.key');
-- We're done with the role named after a specific user and need to check the
-- changes to the public mapping.
DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
-- This will fail again as it'll resolve the user mapping for public, which
-- lacks password_required=false
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- The user mapping for public is passwordless and lacks the password_required=false
-- mapping option, but will work because the current user is a superuser.
SELECT 1 FROM ft1_nopw LIMIT 1;
-- cleanup
DROP USER MAPPING FOR public SERVER sqlite_nopw;
DROP OWNED BY regress_nosuper;
DROP ROLE regress_nosuper;
-- Clean-up
RESET enable_partitionwise_aggregate;
*/
-- Two-phase transactions are not supported.
BEGIN;
--Testcase 731:
SELECT count(*) FROM ft1;
-- error here
--Testcase 732:
PREPARE TRANSACTION 'fdw_tpc';
ROLLBACK;
-- ===================================================================
-- reestablish new connection
-- ===================================================================
-- -- Test case relative with option application_name is not suitable for SQLite FDW.
-- -- Because this option is in libpq of postgres.
-- -- Change application_name of remote connection to special one
-- -- so that we can easily terminate the connection later.
-- ALTER SERVER sqlite_svr OPTIONS (application_name 'fdw_retry_check');
-- -- Make sure we have a remote connection.
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- Terminate the remote connection and wait for the termination to complete.
-- (If a cache flush happens, the remote connection might have already been
-- dropped; so code this step in a way that doesn't fail if no connection.)
-- DO $$ BEGIN
-- PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- END $$;
-- -- This query should detect the broken connection when starting new remote
-- -- transaction, reestablish new connection, and then succeed.
-- BEGIN;
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- If we detect the broken connection when starting a new remote
-- -- subtransaction, we should fail instead of establishing a new connection.
-- -- Terminate the remote connection and wait for the termination to complete.
-- DO $$ BEGIN
-- PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- END $$;
-- SAVEPOINT s;
-- -- The text of the error might vary across platforms, so only show SQLSTATE.
-- \set VERBOSITY sqlstate
-- SELECT 1 FROM ft1 LIMIT 1; -- should fail
-- \set VERBOSITY default
-- COMMIT;
-- =============================================================================
-- test connection invalidation cases and sqlite_fdw_get_connections function
-- =============================================================================
-- Let's ensure to close all the existing cached connections.
--Testcase 880:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 881:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- This test case is for closing the connection in sqlitefdw_xact_callback
BEGIN;
-- Connection xact depth becomes 1 i.e. the connection is in midst of the xact.
--Testcase 882:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 883:
SELECT 1 FROM ft7 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3 should be
-- output.
--Testcase 884:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Connections are not closed at the end of the alter and drop statements.
-- That's because the connections are in midst of this xact,
-- they are just marked as invalid in sqlitefdw_inval_callback.
--Testcase 885:
ALTER SERVER sqlite_svr OPTIONS (ADD keep_connections 'off');
--Testcase 886:
DROP SERVER sqlite_svr3 CASCADE;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3
-- should be output as invalid connections. Also the server name for
-- sqlite_svr3 should be NULL because the server was dropped.
--Testcase 887:
SELECT * FROM sqlite_fdw_get_connections() ORDER BY 1;
-- The invalid connections get closed in sqlitefdw_xact_callback during commit.
COMMIT;
--Testcase 888:
ALTER SERVER sqlite_svr OPTIONS (DROP keep_connections);
-- All cached connections were closed while committing above xact, so no
-- records should be output.
--Testcase 889:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =======================================================================
-- test sqlite_fdw_disconnect and sqlite_fdw_disconnect_all functions
-- =======================================================================
BEGIN;
-- Ensure to cache loopback connection.
--Testcase 890:
SELECT 1 FROM ft1 LIMIT 1;
-- Ensure to cache loopback2 connection.
--Testcase 891:
SELECT 1 FROM ft6 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 892:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Issue a warning and return false as sqlite_svr connection is still in use and
-- can not be closed.
--Testcase 893:
SELECT sqlite_fdw_disconnect('sqlite_svr');
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 894:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Return false as connections are still in use, warnings are issued.
-- But disable warnings temporarily because the order of them is not stable.
--Testcase 895:
SET client_min_messages = 'ERROR';
--Testcase 896:
SELECT sqlite_fdw_disconnect_all();
--Testcase 897:
RESET client_min_messages;
COMMIT;
-- Ensure that sqlite_svr2 connection is closed.
--Testcase 898:
SELECT 1 FROM sqlite_fdw_disconnect('sqlite_svr2');
--Testcase 899:
SELECT server_name FROM sqlite_fdw_get_connections() WHERE server_name = 'sqlite_svr2';
-- Return false as sqlite_svr2 connection is closed already.
--Testcase 900:
SELECT sqlite_fdw_disconnect('sqlite_svr2');
-- Return an error as there is no foreign server with given name.
--Testcase 901:
SELECT sqlite_fdw_disconnect('unknownserver');
-- Let's ensure to close all the existing cached connections.
--Testcase 902:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 903:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =============================================================================
-- test case for having multiple cached connections for a foreign server
-- SQLite FDW does not support User Mapping, so cached connection is identified
-- by only serverid (not like other FDWs use key including serverid and userid),
-- and there is only one server for all users, so there is only one cached connection.
-- In case of using key including serverid and userid, if many users are used,
-- there will be many cached connections.
-- =============================================================================
--Testcase 904:
CREATE ROLE regress_multi_conn_user1 SUPERUSER;
--Testcase 905:
CREATE ROLE regress_multi_conn_user2 SUPERUSER;
--Testcase 906:
-- CREATE USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 907:
-- CREATE USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
BEGIN;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user1
--Testcase 908:
SET ROLE regress_multi_conn_user1;
--Testcase 909:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 910:
RESET ROLE;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user2
--Testcase 911:
SET ROLE regress_multi_conn_user2;
--Testcase 912:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 913:
RESET ROLE;
-- Should output one cached connection for sqlite_svr server
--Testcase 914:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
COMMIT;
-- Let's ensure to close all the existing cached connections.
--Testcase 915:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 916:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Clean up
--Testcase 917:
-- DROP USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 918:
-- DROP USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
--Testcase 919:
DROP ROLE regress_multi_conn_user1;
--Testcase 920:
DROP ROLE regress_multi_conn_user2;
-- ===================================================================
-- Test foreign server level option keep_connections
-- ===================================================================
-- By default, the connections associated with foreign server are cached i.e.
-- keep_connections option is on. Set it to off.
--Testcase 921:
ALTER SERVER sqlite_svr OPTIONS (keep_connections 'off');
-- connection to sqlite_svr server is closed at the end of xact
-- as keep_connections was set to off.
--Testcase 922:
SELECT 1 FROM ft1 LIMIT 1;
-- No cached connections, so no records should be output.
--Testcase 923:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
--Testcase 924:
ALTER SERVER sqlite_svr OPTIONS (SET keep_connections 'on');
-- ===================================================================
-- batch insert
-- ===================================================================
BEGIN;
--Testcase 925:
CREATE SERVER batch10 FOREIGN DATA WRAPPER sqlite_fdw OPTIONS( batch_size '10' );
--Testcase 926:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 927:
ALTER SERVER batch10 OPTIONS( SET batch_size '20' );
--Testcase 928:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 929:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=20'];
--Testcase 930:
CREATE FOREIGN TABLE table30 ( x int ) SERVER batch10 OPTIONS ( batch_size '30' );
--Testcase 931:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 932:
ALTER FOREIGN TABLE table30 OPTIONS ( SET batch_size '40');
--Testcase 933:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 934:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=40'];
ROLLBACK;
--Testcase 935:
CREATE FOREIGN TABLE ftable ( x int OPTIONS (key 'true') ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '10' );
--Testcase 936:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 937:
INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 938:
INSERT INTO ftable SELECT * FROM generate_series(11, 31) i;
--Testcase 939:
INSERT INTO ftable VALUES (32);
--Testcase 940:
INSERT INTO ftable VALUES (33), (34);
--Testcase 946:
SELECT COUNT(*) FROM ftable;
--Testcase 947:
DELETE FROM ftable;
--Testcase 948:
DROP FOREIGN TABLE ftable;
-- Disable batch insert
--Testcase 949:
CREATE FOREIGN TABLE ftable ( x int ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '1' );
--Testcase 950:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (1), (2);
--Testcase 951:
INSERT INTO ftable VALUES (1), (2);
--Testcase 952:
SELECT COUNT(*) FROM ftable;
-- Disable batch inserting into foreign tables with BEFORE ROW INSERT triggers
-- even if the batch_size option is enabled.
--Testcase 977:
ALTER FOREIGN TABLE ftable OPTIONS ( SET batch_size '10' );
--Testcase 978:
CREATE TRIGGER trig_row_before BEFORE INSERT ON ftable
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 980:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (3), (4);
--Testcase 981:
INSERT INTO ftable VALUES (3), (4);
--Testcase 982:
SELECT COUNT(*) FROM ftable;
-- Clean up
--Testcase 983:
DROP TRIGGER trig_row_before ON ftable;
--Testcase 953:
DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- -- Use partitioning
-- CREATE TABLE batch_table ( x int ) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 0)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p0', batch_size '10');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 1)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p1', batch_size '1');
-- CREATE TABLE batch_table_p2
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 2);
-- INSERT INTO "S 1".batch_table SELECT * FROM generate_series(1, 66) i;
-- SELECT COUNT(*) FROM "S 1".batch_table;
-- -- Clean up
-- DROP TABLE batch_table;
-- DROP TABLE batch_table_p0;
-- DROP TABLE batch_table_p1;
-- Check that batched mode also works for some inserts made during
-- cross-partition updates
-- CREATE TABLE batch_cp_upd_test (a int) PARTITION BY LIST (a);
-- CREATE TABLE batch_cp_upd_test1 (LIKE batch_cp_upd_test);
-- CREATE FOREIGN TABLE batch_cp_upd_test1_f
-- PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (1)
-- SERVER sqlite_svr
-- OPTIONS (table_name 'batch_cp_upd_test1', batch_size '10');
-- CREATE TABLE batch_cp_upd_test2 PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (2);
-- CREATE TABLE batch_cp_upd_test3 (LIKE batch_cp_upd_test);
-- CREATE FOREIGN TABLE batch_cp_upd_test3_f
-- PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (3)
-- SERVER loopback
-- OPTIONS (table_name 'batch_cp_upd_test3', batch_size '1');
-- -- Create statement triggers on remote tables that "log" any INSERTs
-- -- performed on them.
-- CREATE TABLE cmdlog (cmd text);
-- CREATE FUNCTION log_stmt() RETURNS TRIGGER LANGUAGE plpgsql AS $$
-- BEGIN INSERT INTO public.cmdlog VALUES (TG_OP || ' on ' || TG_RELNAME); RETURN NULL; END;
-- $$;
-- CREATE TRIGGER stmt_trig AFTER INSERT ON batch_cp_upd_test1
-- FOR EACH STATEMENT EXECUTE FUNCTION log_stmt();
-- CREATE TRIGGER stmt_trig AFTER INSERT ON batch_cp_upd_test3
-- FOR EACH STATEMENT EXECUTE FUNCTION log_stmt();
-- -- This update moves rows from the local partition 'batch_cp_upd_test2' to the
-- -- foreign partition 'batch_cp_upd_test1', one that has insert batching
-- -- enabled, so a single INSERT for both rows.
-- INSERT INTO batch_cp_upd_test VALUES (2), (2);
-- UPDATE batch_cp_upd_test t SET a = 1 FROM (VALUES (1), (2)) s(a) WHERE t.a = s.a AND s.a = 2;
-- -- This one moves rows from the local partition 'batch_cp_upd_test2' to the
-- -- foreign partition 'batch_cp_upd_test2', one that has insert batching
-- -- disabled, so separate INSERTs for the two rows.
-- INSERT INTO batch_cp_upd_test VALUES (2), (2);
-- UPDATE batch_cp_upd_test t SET a = 3 FROM (VALUES (1), (2)) s(a) WHERE t.a = s.a AND s.a = 2;
-- SELECT tableoid::regclass, * FROM batch_cp_upd_test ORDER BY 1;
-- -- Should see 1 INSERT on batch_cp_upd_test1 and 2 on batch_cp_upd_test3 as
-- -- described above.
-- SELECT * FROM cmdlog ORDER BY 1;
-- -- Clean up
-- DROP TABLE batch_cp_upd_test;
-- DROP TABLE batch_cp_upd_test1;
-- DROP TABLE batch_cp_upd_test3;
-- DROP TABLE cmdlog;
-- DROP FUNCTION log_stmt();
-- -- Use partitioning
-- ALTER SERVER loopback OPTIONS (ADD batch_size '10');
-- CREATE TABLE batch_table ( x int, field1 text, field2 text) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- ALTER TABLE batch_table_p0 ADD CONSTRAINT p0_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p0');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- ALTER TABLE batch_table_p1 ADD CONSTRAINT p1_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 1)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p1');
-- INSERT INTO batch_table SELECT i, 'test'||i, 'test'|| i FROM generate_series(1, 50) i;
-- SELECT COUNT(*) FROM batch_table;
-- SELECT * FROM batch_table ORDER BY x;
-- -- Clean up
-- DROP TABLE batch_table;
-- DROP TABLE batch_table_p0;
-- DROP TABLE batch_table_p1;
-- ALTER SERVER loopback OPTIONS (DROP batch_size);
-- Test that pending inserts are handled properly when needed
-- CREATE TABLE batch_table (a text, b int);
-- CREATE FOREIGN TABLE ftable (a text, b int)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table', batch_size '2');
-- CREATE TABLE ltable (a text, b int);
-- CREATE FUNCTION ftable_rowcount_trigf() RETURNS trigger LANGUAGE plpgsql AS
-- $$
-- begin
-- raise notice '%: there are % rows in ftable',
-- TG_NAME, (SELECT count(*) FROM ftable);
-- if TG_OP = 'DELETE' then
-- return OLD;
-- else
-- return NEW;
-- end if;
-- end;
-- $$;
-- CREATE TRIGGER ftable_rowcount_trigger
-- BEFORE INSERT OR UPDATE OR DELETE ON ltable
-- FOR EACH ROW EXECUTE PROCEDURE ftable_rowcount_trigf();
-- WITH t AS (
-- INSERT INTO ltable VALUES ('AAA', 42), ('BBB', 42) RETURNING *
-- )
-- INSERT INTO ftable SELECT * FROM t;
-- SELECT * FROM ltable;
-- SELECT * FROM ftable;
-- DELETE FROM ftable;
-- WITH t AS (
-- UPDATE ltable SET b = b + 100 RETURNING *
-- )
-- INSERT INTO ftable SELECT * FROM t;
-- SELECT * FROM ltable;
-- SELECT * FROM ftable;
-- DELETE FROM ftable;
-- WITH t AS (
-- DELETE FROM ltable RETURNING *
-- )
-- INSERT INTO ftable SELECT * FROM t;
-- SELECT * FROM ltable;
-- SELECT * FROM ftable;
-- DELETE FROM ftable;
-- -- Clean up
-- DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- DROP TRIGGER ftable_rowcount_trigger ON ltable;
-- DROP TABLE ltable;
-- CREATE TABLE parent (a text, b int) PARTITION BY LIST (a);
-- CREATE TABLE batch_table (a text, b int);
-- CREATE FOREIGN TABLE ftable
-- PARTITION OF parent
-- FOR VALUES IN ('AAA')
-- SERVER loopback
-- OPTIONS (table_name 'batch_table', batch_size '2');
-- CREATE TABLE ltable
-- PARTITION OF parent
-- FOR VALUES IN ('BBB');
-- CREATE TRIGGER ftable_rowcount_trigger
-- BEFORE INSERT ON ltable
-- FOR EACH ROW EXECUTE PROCEDURE ftable_rowcount_trigf();
-- INSERT INTO parent VALUES ('AAA', 42), ('BBB', 42), ('AAA', 42), ('BBB', 42);
-- SELECT tableoid::regclass, * FROM parent;
-- -- Clean up
-- DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- DROP TRIGGER ftable_rowcount_trigger ON ltable;
-- DROP TABLE ltable;
-- DROP TABLE parent;
-- DROP FUNCTION ftable_rowcount_trigf;
-- ===================================================================
-- test asynchronous execution
-- ===================================================================
-- ALTER SERVER loopback OPTIONS (DROP extensions);
-- ALTER SERVER loopback OPTIONS (ADD async_capable 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD async_capable 'true');
-- CREATE TABLE async_pt (a int, b int, c text) PARTITION BY RANGE (a);
-- CREATE TABLE base_tbl1 (a int, b int, c text);
-- CREATE TABLE base_tbl2 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p1 PARTITION OF async_pt FOR VALUES FROM (1000) TO (2000)
-- SERVER loopback OPTIONS (table_name 'base_tbl1');
-- CREATE FOREIGN TABLE async_p2 PARTITION OF async_pt FOR VALUES FROM (2000) TO (3000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl2');
-- INSERT INTO async_p1 SELECT 1000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- INSERT INTO async_p2 SELECT 2000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- -- simple queries
-- CREATE TABLE result_tbl (a int, b int, c text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- Check case where multiple partitions use the same connection
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl3');
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- DROP FOREIGN TABLE async_p3;
-- DROP TABLE base_tbl3;
-- -- Check case where the partitioned table has local/remote partitions
-- CREATE TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000);
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- partitionwise joins
-- SET enable_partitionwise_join TO true;
-- CREATE TABLE join_tbl (a1 int, b1 int, c1 text, a2 int, b2 int, c2 text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_partitionwise_join;
-- -- Test rescan of an async Append node with do_exec_prune=false
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_hashjoin;
-- -- Test interaction of async execution with plan-time partition pruning
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 3000;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 2000;
-- -- Test interaction of async execution with run-time partition pruning
-- SET plan_cache_mode TO force_generic_plan;
-- PREPARE async_pt_query (int, int) AS
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE a < $1 AND b === $2;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (3000, 505);
-- EXECUTE async_pt_query (3000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (2000, 505);
-- EXECUTE async_pt_query (2000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- RESET plan_cache_mode;
-- CREATE TABLE local_tbl(a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo'), (2505, 505, 'bar');
-- ANALYZE local_tbl;
-- CREATE INDEX base_tbl1_idx ON base_tbl1 (a);
-- CREATE INDEX base_tbl2_idx ON base_tbl2 (a);
-- CREATE INDEX async_p3_idx ON async_p3 (a);
-- ANALYZE base_tbl1;
-- ANALYZE base_tbl2;
-- ANALYZE async_p3;
-- ALTER FOREIGN TABLE async_p1 OPTIONS (use_remote_estimate 'true');
-- ALTER FOREIGN TABLE async_p2 OPTIONS (use_remote_estimate 'true');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- ALTER FOREIGN TABLE async_p1 OPTIONS (DROP use_remote_estimate);
-- ALTER FOREIGN TABLE async_p2 OPTIONS (DROP use_remote_estimate);
-- DROP TABLE local_tbl;
-- DROP INDEX base_tbl1_idx;
-- DROP INDEX base_tbl2_idx;
-- DROP INDEX async_p3_idx;
-- -- UNION queries
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION ALL
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION ALL
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- Disable async execution if we use gating Result nodes for pseudoconstant
-- -- quals
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE CURRENT_USER = SESSION_USER;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- (SELECT * FROM async_p1 WHERE CURRENT_USER = SESSION_USER)
-- UNION ALL
-- (SELECT * FROM async_p2 WHERE CURRENT_USER = SESSION_USER);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM ((SELECT * FROM async_p1 WHERE b < 10) UNION ALL (SELECT * FROM async_p2 WHERE b < 10)) s WHERE CURRENT_USER = SESSION_USER;
-- -- Test that pending requests are processed properly
-- SET enable_mergejoin TO false;
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- CREATE TABLE local_tbl (a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo');
-- ANALYZE local_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- -- Check with foreign modify
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE remote_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl3');
-- INSERT INTO remote_tbl VALUES (2505, 505, 'bar');
-- CREATE TABLE base_tbl4 (a int, b int, c text);
-- CREATE FOREIGN TABLE insert_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl4');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- SELECT * FROM insert_tbl ORDER BY a;
-- -- Check with direct modify
-- EXPLAIN (VERBOSE, COSTS OFF)
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- DROP TABLE local_tbl;
-- DROP FOREIGN TABLE remote_tbl;
-- DROP FOREIGN TABLE insert_tbl;
-- DROP TABLE base_tbl3;
-- DROP TABLE base_tbl4;
-- RESET enable_mergejoin;
-- RESET enable_hashjoin;
-- -- Test that UPDATE/DELETE with inherited target works with async_capable enabled
-- EXPLAIN (VERBOSE, COSTS OFF)
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- -- Check EXPLAIN ANALYZE for a query that scans empty partitions asynchronously
-- DELETE FROM async_p1;
-- DELETE FROM async_p2;
-- DELETE FROM async_p3;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt;
-- -- Clean up
-- DROP TABLE async_pt;
-- DROP TABLE base_tbl1;
-- DROP TABLE base_tbl2;
-- DROP TABLE result_tbl;
-- DROP TABLE join_tbl;
-- -- Test that an asynchronous fetch is processed before restarting the scan in
-- -- ReScanForeignScan
-- CREATE TABLE base_tbl (a int, b int);
-- INSERT INTO base_tbl VALUES (1, 11), (2, 22), (3, 33);
-- CREATE FOREIGN TABLE foreign_tbl (b int)
-- SERVER loopback OPTIONS (table_name 'base_tbl');
-- CREATE FOREIGN TABLE foreign_tbl2 () INHERITS (foreign_tbl)
-- SERVER loopback OPTIONS (table_name 'base_tbl');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl);
-- SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl);
-- -- Clean up
-- DROP FOREIGN TABLE foreign_tbl CASCADE;
-- DROP TABLE base_tbl;
-- ALTER SERVER loopback OPTIONS (DROP async_capable);
-- ALTER SERVER loopback2 OPTIONS (DROP async_capable);
-- ===================================================================
-- test invalid server and foreign table options
-- ===================================================================
-- -- Invalid fdw_startup_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_startup_cost '100$%$#$#');
-- -- Invalid fdw_tuple_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_tuple_cost '100$%$#$#');
-- -- Invalid fetch_size option
-- CREATE FOREIGN TABLE inv_fsz (c1 int )
-- SERVER loopback OPTIONS (fetch_size '100$%$#$#');
-- Invalid batch_size option
--Testcase 954:
CREATE FOREIGN TABLE inv_bsz (c1 int )
SERVER sqlite_svr OPTIONS (batch_size '100$%$#$#');
-- -- No option is allowed to be specified at foreign data wrapper level
-- ALTER FOREIGN DATA WRAPPER postgres_fdw OPTIONS (nonexistent 'fdw');
-- -- ===================================================================
-- -- test postgres_fdw.application_name GUC
-- -- ===================================================================
-- To avoid race conditions in checking the remote session's application_name,
-- use this view to make the remote session itself read its application_name.
-- CREATE VIEW my_application_name AS
-- SELECT application_name FROM pg_stat_activity WHERE pid = pg_backend_pid();
-- CREATE FOREIGN TABLE remote_application_name (application_name text)
-- SERVER loopback2
-- OPTIONS (schema_name 'public', table_name 'my_application_name');
-- SELECT count(*) FROM remote_application_name;
-- Specify escape sequences in application_name option of a server
-- object so as to test that they are replaced with status information
-- expectedly. Note that we are also relying on ALTER SERVER to force
-- the remote session to be restarted with its new application name.
-- -- Since pg_stat_activity.application_name may be truncated to less than
-- -- NAMEDATALEN characters, note that substring() needs to be used
-- -- at the condition of test query to make sure that the string consisting
-- -- of database name and process ID is also less than that.
-- ALTER SERVER loopback2 OPTIONS (application_name 'fdw_%d%p');
-- SELECT count(*) FROM remote_application_name
-- WHERE application_name =
-- substring('fdw_' || current_database() || pg_backend_pid() for
-- current_setting('max_identifier_length')::int);
-- -- postgres_fdw.application_name overrides application_name option
-- -- of a server object if both settings are present.
-- ALTER SERVER loopback2 OPTIONS (SET application_name 'fdw_wrong');
-- SET postgres_fdw.application_name TO 'fdw_%a%u%%';
-- SELECT count(*) FROM remote_application_name
-- WHERE application_name =
-- substring('fdw_' || current_setting('application_name') ||
-- CURRENT_USER || '%' for current_setting('max_identifier_length')::int);
-- RESET postgres_fdw.application_name;
-- -- Test %c (session ID) and %C (cluster name) escape sequences.
-- ALTER SERVER loopback2 OPTIONS (SET application_name 'fdw_%C%c');
-- SELECT count(*) FROM remote_application_name
-- WHERE application_name =
-- substring('fdw_' || current_setting('cluster_name') ||
-- to_hex(trunc(EXTRACT(EPOCH FROM (SELECT backend_start FROM
-- pg_stat_get_activity(pg_backend_pid()))))::integer) || '.' ||
-- to_hex(pg_backend_pid())
-- for current_setting('max_identifier_length')::int);
-- -- Clean up.
-- DROP FOREIGN TABLE remote_application_name;
-- DROP VIEW my_application_name;
-- -- ===================================================================
-- -- test parallel commit and parallel abort
-- -- ===================================================================
-- ALTER SERVER loopback OPTIONS (ADD parallel_commit 'true');
-- ALTER SERVER loopback OPTIONS (ADD parallel_abort 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD parallel_commit 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD parallel_abort 'true');
-- CREATE TABLE ploc1 (f1 int, f2 text);
-- CREATE FOREIGN TABLE prem1 (f1 int, f2 text)
-- SERVER loopback OPTIONS (table_name 'ploc1');
-- CREATE TABLE ploc2 (f1 int, f2 text);
-- CREATE FOREIGN TABLE prem2 (f1 int, f2 text)
-- SERVER loopback2 OPTIONS (table_name 'ploc2');
-- BEGIN;
-- INSERT INTO prem1 VALUES (101, 'foo');
-- INSERT INTO prem2 VALUES (201, 'bar');
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (102, 'foofoo');
-- INSERT INTO prem2 VALUES (202, 'barbar');
-- RELEASE SAVEPOINT s;
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- -- This tests executing DEALLOCATE ALL against foreign servers in parallel
-- -- during pre-commit
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (103, 'baz');
-- INSERT INTO prem2 VALUES (203, 'qux');
-- ROLLBACK TO SAVEPOINT s;
-- RELEASE SAVEPOINT s;
-- INSERT INTO prem1 VALUES (104, 'bazbaz');
-- INSERT INTO prem2 VALUES (204, 'quxqux');
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- BEGIN;
-- INSERT INTO prem1 VALUES (105, 'test1');
-- INSERT INTO prem2 VALUES (205, 'test2');
-- ABORT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- -- This tests executing DEALLOCATE ALL against foreign servers in parallel
-- -- during post-abort
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (105, 'test1');
-- INSERT INTO prem2 VALUES (205, 'test2');
-- ROLLBACK TO SAVEPOINT s;
-- RELEASE SAVEPOINT s;
-- INSERT INTO prem1 VALUES (105, 'test1');
-- INSERT INTO prem2 VALUES (205, 'test2');
-- ABORT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- ALTER SERVER loopback OPTIONS (DROP parallel_commit);
-- ALTER SERVER loopback OPTIONS (DROP parallel_abort);
-- ALTER SERVER loopback2 OPTIONS (DROP parallel_commit);
-- ALTER SERVER loopback2 OPTIONS (DROP parallel_abort);
-- -- ===================================================================
-- -- test for ANALYZE sampling
-- -- ===================================================================
-- CREATE TABLE analyze_table (id int, a text, b bigint);
-- CREATE FOREIGN TABLE analyze_ftable (id int, a text, b bigint)
-- SERVER loopback OPTIONS (table_name 'analyze_rtable1');
-- INSERT INTO analyze_table (SELECT x FROM generate_series(1,1000) x);
-- ANALYZE analyze_table;
-- SET default_statistics_target = 10;
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (analyze_sampling 'invalid');
-- ALTER SERVER loopback OPTIONS (analyze_sampling 'auto');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'system');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'bernoulli');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'random');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'off');
-- ANALYZE analyze_table;
-- cleanup
-- DROP FOREIGN TABLE analyze_ftable;
-- DROP TABLE analyze_table;
-- Clean-up
--Testcase 733:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 734:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 735:
DROP SERVER sqlite_svr CASCADE;
--Testcase 736:
DROP SERVER sqlite_svr2 CASCADE;
--Testcase 737:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/extra/update.sql
================================================
--
-- UPDATE syntax tests
--
--Testcase 32:
CREATE EXTENSION sqlite_fdw;
--Testcase 33:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 34:
CREATE FOREIGN TABLE update_test (
i INT OPTIONS (key 'true'),
a INT DEFAULT 10,
b INT,
c TEXT
) SERVER sqlite_svr;
--Testcase 35:
CREATE FOREIGN TABLE upsert_test (
a INT OPTIONS (key 'true'),
b TEXT
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO update_test VALUES (1, 5, 10, 'foo');
--Testcase 2:
INSERT INTO update_test(i, b, a) VALUES (2, 15, 10);
--Testcase 3:
SELECT * FROM update_test;
--Testcase 4:
UPDATE update_test SET a = DEFAULT, b = DEFAULT;
--Testcase 5:
SELECT * FROM update_test;
-- aliases for the UPDATE target table
--Testcase 6:
UPDATE update_test AS t SET b = 10 WHERE t.a = 10;
--Testcase 7:
SELECT * FROM update_test;
--Testcase 8:
UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10;
--Testcase 9:
SELECT * FROM update_test;
--
-- Test VALUES in FROM
--
--Testcase 10:
UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j)
WHERE update_test.b = v.j;
--Testcase 11:
SELECT * FROM update_test;
-- fail, wrong data type:
--Testcase 12:
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
--
--Testcase 13:
INSERT INTO update_test SELECT i+2,a,b+1,c FROM update_test;
--Testcase 14:
SELECT * FROM update_test;
--Testcase 15:
UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo';
--Testcase 16:
SELECT * FROM update_test;
--Testcase 17:
UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10;
--Testcase 18:
SELECT * FROM update_test;
-- fail, multi assignment to same column:
--Testcase 19:
UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10;
-- uncorrelated sub-select:
--Testcase 20:
UPDATE update_test
SET (b,a) = (select a,b from update_test where b = 41 and c = 'car')
WHERE a = 100 AND b = 20;
--Testcase 21:
SELECT * FROM update_test;
-- correlated sub-select:
--Testcase 22:
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);
--Testcase 23:
SELECT * FROM update_test;
-- fail, multiple rows supplied:
--Testcase 24:
UPDATE update_test SET (b,a) = (select a+1,b from update_test);
-- set to null if no rows supplied:
--Testcase 25:
UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000)
WHERE a = 11;
--Testcase 26:
SELECT * FROM update_test;
-- *-expansion should work in this context:
--Testcase 27:
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:
--Testcase 28:
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
--Testcase 29:
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.
--Testcase 30:
UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car';
--Testcase 31:
SELECT a, b, char_length(c) FROM update_test;
-- Check multi-assignment with a Result node to handle a one-time filter.
--Testcase 36:
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;
--Testcase 37:
UPDATE update_test t
SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a)
WHERE CURRENT_USER = SESSION_USER;
--Testcase 38:
SELECT a, b, char_length(c) FROM update_test;
/* Skip, sqlite fdw does not support ON CONFLICT DO UPDATE
-- 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 FOREIGN TABLE update_test;
DROP FOREIGN TABLE upsert_test;
*/
/*Skip, sqlite fdw does not support create partition table
-- 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);
*/
--drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 39:
DROP SERVER sqlite_svr;
--Testcase 40:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/libsqlite.sql
================================================
-- Test for SQLite library code source and defaults
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
SELECT sqlite_fdw_sqlite_version();
--Testcase 3:
SELECT length(sqlite_fdw_sqlite_code_source());
--Testcase 4:
SELECT sqlite_fdw_sqlite_code_source();
--Testcase 7:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/selectfunc.sql
================================================
SET datestyle=ISO;
SET timezone='Japan';
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER server1 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/selectfunc.db');
--CREATE USER MAPPING FOR CURRENT_USER SERVER server1 OPTIONS(user 'user', password 'pass');
--IMPORT FOREIGN SCHEMA public FROM SERVER server1 INTO public OPTIONS(import_time_text 'false');
--Testcase 3:
CREATE FOREIGN TABLE s3(id text OPTIONS (key 'true'), time timestamp, tag1 text, value1 float, value2 int, value3 float, value4 int, str1 text, str2 text) SERVER server1;
-- s3 (value1 as float8, value2 as bigint)
--Testcase 4:
\d s3;
--Testcase 5:
SELECT * FROM s3;
-- select float8() (not pushdown, remove float8, explain)
-- EXPLAIN VERBOSE
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select float8() (not pushdown, remove float8, result)
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select sqrt (builtin function, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (buitin function, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function,, not pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, not pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select abs (builtin function, explain)
--Testcase 6:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (buitin function, result)
--Testcase 7:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (builtin function, not pushdown constraints, explain)
--Testcase 8:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, not pushdown constraints, result)
--Testcase 9:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, pushdown constraints, explain)
--Testcase 10:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select abs (builtin function, pushdown constraints, result)
--Testcase 11:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select log (builtin function, need to swap arguments, numeric cast, explain)
-- log_(v) : postgresql (base, v), sqlite (v, base)
-- EXPLAIN VERBOSE
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (builtin function, need to swap arguments, numeric cast, result)
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, result)
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, result)
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, result)
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log2 (stub function, explain)
-- EXPLAIN VERBOSE
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select log2 (stub function, result)
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select spread (stub agg function, explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, result)
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, raise exception if not expected type)
-- SELECT spread(value1::numeric),spread(value2::numeric),spread(value3::numeric),spread(value4::numeric) FROM s3;
-- sqlite fdw does not have spread()
-- select abs as nest function with agg (pushdown, explain)
--Testcase 12:
EXPLAIN VERBOSE
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest function with agg (pushdown, result)
--Testcase 13:
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest with log2 (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs as nest with log2 (pushdown, result)
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs with non pushdown func and explicit constant (explain)
--Testcase 14:
EXPLAIN VERBOSE
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select abs with non pushdown func and explicit constant (result)
--Testcase 15:
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select sqrt as nest function with agg and explicit constant (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant (pushdown, result)
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant and tag (error, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1, tag1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select spread (stub agg function and group by influx_time() and tag) (explain)
-- EXPLAIN VERBOSE
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by influx_time() and tag) (result)
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by tag only) (result)
-- SELECT tag1,spread("value1") FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY tag1;
-- sqlite fdw does not have spread()
-- select spread (stub agg function and other aggs) (result)
-- SELECT sum("value1"),spread("value1"),count("value1") FROM s3;
-- sqlite fdw does not have spread()
-- select abs with order by (explain)
--Testcase 16:
EXPLAIN VERBOSE
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by (result)
--Testcase 17:
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by index (result)
--Testcase 18:
SELECT value1, abs(1-value1) FROM s3 order by 2,1;
-- select abs with order by index (result)
--Testcase 19:
SELECT value1, abs(1-value1) FROM s3 order by 1,2;
-- select abs and as
--Testcase 20:
SELECT abs(value3) as abs1 FROM s3;
-- select spread over join query (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread over join query (result, stub call error)
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread with having (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select spread with having (explain, cannot pushdown, stub call error)
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select abs with arithmetic and tag in the middle (explain)
--Testcase 21:
EXPLAIN VERBOSE
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select abs with arithmetic and tag in the middle (result)
--Testcase 22:
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select with order by limit (explain)
--Testcase 23:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select with order by limit (explain)
--Testcase 24:
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select mixing with non pushdown func (all not pushdown, explain)
--Testcase 25:
EXPLAIN VERBOSE
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- select mixing with non pushdown func (result)
--Testcase 26:
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- sqlite data prep
-- sqlite pushdown supported functions (explain)
--Testcase 27:
EXPLAIN VERBOSE
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown supported functions (result)
--Testcase 28:
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown nest functions (explain)
--Testcase 32:
EXPLAIN VERBOSE
SELECT round(abs(value2), 0) FROM s3;
-- sqlite pushdown nest functions (result)
--Testcase 33:
SELECT round(abs(value2), 0) FROM s3;
-- select mod (builtin function, explain)
--Testcase 34:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, result)
--Testcase 35:
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, not pushdown constraints, explain)
--Testcase 36:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, not pushdown constraints, result)
--Testcase 37:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, pushdown constraints, explain)
--Testcase 38:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, pushdown constraints, result)
--Testcase 39:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 40:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 41:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 42:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 43:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod as nest function with agg (pushdown, explain)
--Testcase 44:
EXPLAIN VERBOSE
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest function with agg (pushdown, result)
--Testcase 45:
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, explain)
--Testcase 46:
EXPLAIN VERBOSE
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, result)
--Testcase 47:
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod with non pushdown func and explicit constant (explain)
--Testcase 48:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with non pushdown func and explicit constant (result)
--Testcase 49:
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with order by (explain)
--Testcase 50:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by (result)
--Testcase 51:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by index (result)
--Testcase 52:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 2,1;
-- select mod with order by index (result)
--Testcase 53:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 1,2;
-- select mod with group by (explain)
--Testcase 54:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by (result)
--Testcase 55:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by index (result)
--Testcase 56:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 2,1;
-- select mod with group by index (result)
--Testcase 57:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2;
-- select mod with group by having (explain)
--Testcase 58:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by having (result)
--Testcase 59:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by index having (result)
--Testcase 60:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2 HAVING value1 > 1;
-- select mod and as
--Testcase 61:
SELECT value1, mod(value2, 2) as mod1 FROM s3;
--Testcase 29:
DROP FOREIGN TABLE s3;
--Testcase 30:
DROP SERVER server1;
--Testcase 31:
DROP EXTENSION sqlite_fdw;
================================================
FILE: sql/16.3/sqlite_fdw.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 129:
CREATE EXTENSION sqlite_fdw;
--Testcase 130:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 131:
CREATE FOREIGN TABLE department(department_id int OPTIONS (key 'true'), department_name text) SERVER sqlite_svr;
--Testcase 132:
CREATE FOREIGN TABLE employee(emp_id int OPTIONS (key 'true'), emp_name text, emp_dept_id int) SERVER sqlite_svr;
--Testcase 133:
CREATE FOREIGN TABLE empdata(emp_id int OPTIONS (key 'true'), emp_dat bytea) SERVER sqlite_svr;
--Testcase 134:
CREATE FOREIGN TABLE numbers(a int OPTIONS (key 'true'), b varchar(255)) SERVER sqlite_svr;
--Testcase 135:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 136:
CREATE FOREIGN TABLE noprimary(a int, b text) SERVER sqlite_svr;
--Testcase 137:
CREATE FOREIGN TABLE RO_RW_test(i int OPTIONS (key 'true'), a text, b float, c int) SERVER sqlite_svr;
--Testcase 1:
SELECT * FROM department LIMIT 10;
--Testcase 2:
SELECT * FROM employee LIMIT 10;
--Testcase 3:
SELECT * FROM empdata LIMIT 10;
--Testcase 4:
INSERT INTO department VALUES(generate_series(1,100), 'dept - ' || generate_series(1,100));
--Testcase 5:
INSERT INTO employee VALUES(generate_series(1,100), 'emp - ' || generate_series(1,100), generate_series(1,100));
--Testcase 6:
INSERT INTO empdata VALUES(1, decode ('01234567', 'hex'));
--Testcase 7:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 8:
INSERT INTO numbers VALUES(2, 'Two');
--Testcase 9:
INSERT INTO numbers VALUES(3, 'Three');
--Testcase 10:
INSERT INTO numbers VALUES(4, 'Four');
--Testcase 11:
INSERT INTO numbers VALUES(5, 'Five');
--Testcase 12:
INSERT INTO numbers VALUES(6, 'Six');
--Testcase 13:
INSERT INTO numbers VALUES(7, 'Seven');
--Testcase 14:
INSERT INTO numbers VALUES(8, 'Eight');
--Testcase 15:
INSERT INTO numbers VALUES(9, 'Nine');
--Testcase 16:
SELECT count(*) FROM department;
--Testcase 17:
SELECT count(*) FROM employee;
--Testcase 18:
SELECT count(*) FROM empdata;
--Testcase 19:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 20:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) LIMIT 10;
--Testcase 21:
SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 22:
SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) ORDER BY d.department_id LIMIT 10;
--Testcase 23:
SELECT * FROM empdata;
--Testcase 24:
DELETE FROM employee WHERE emp_id = 10;
--Testcase 25:
SELECT COUNT(*) FROM department LIMIT 10;
--Testcase 26:
SELECT COUNT(*) FROM employee WHERE emp_id = 10;
--Testcase 27:
UPDATE employee SET emp_name = 'UPDATEd emp' WHERE emp_id = 20;
--Testcase 28:
SELECT emp_id, emp_name FROM employee WHERE emp_name like 'UPDATEd emp';
--Testcase 29:
UPDATE empdata SET emp_dat = decode ('0123', 'hex');
--Testcase 30:
SELECT * FROM empdata;
--Testcase 31:
SELECT * FROM employee LIMIT 10;
--Testcase 32:
SELECT * FROM employee WHERE emp_id IN (1);
--Testcase 33:
SELECT * FROM employee WHERE emp_id IN (1,3,4,5);
--Testcase 34:
SELECT * FROM employee WHERE emp_id IN (10000,1000);
--Testcase 35:
SELECT * FROM employee WHERE emp_id NOT IN (1) LIMIT 5;
--Testcase 36:
SELECT * FROM employee WHERE emp_id NOT IN (1,3,4,5) LIMIT 5;
--Testcase 37:
SELECT * FROM employee WHERE emp_id NOT IN (10000,1000) LIMIT 5;
--Testcase 38:
SELECT * FROM employee WHERE emp_id NOT IN (SELECT emp_id FROM employee WHERE emp_id IN (1,10));
--Testcase 39:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 1', 'emp - 2') LIMIT 5;
--Testcase 40:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 10') LIMIT 5;
--Testcase 41:
SELECT * FROM numbers WHERE (CASE WHEN a % 2 = 0 THEN 1 WHEN a % 5 = 0 THEN 1 ELSE 0 END) = 1;
--Testcase 42:
SELECT * FROM numbers WHERE (CASE b WHEN 'Two' THEN 1 WHEN 'Six' THEN 1 ELSE 0 END) = 1;
--Testcase 152:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 153:
SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 137:
create or replace function test_param_WHERE() returns void as $$
DECLARE
n varchar;
BEGIN
FOR x IN 1..9 LOOP
--Testcase 138:
SELECT b INTO n from numbers WHERE a=x;
raise notice 'Found number %', n;
end loop;
return;
END
$$ LANGUAGE plpgsql;
--Testcase 43:
SELECT test_param_WHERE();
--Testcase 44:
SELECT b from numbers WHERE a=1;
--Testcase 45:
EXPLAIN(COSTS OFF) SELECT b from numbers WHERE a=1;
--Testcase 46:
SELECT a FROM numbers WHERE b = (SELECT NULL::text);
--Testcase 47:
PREPARE stmt1 (int, int) AS
SELECT * FROM numbers WHERE a=$1 or a=$2;
--Testcase 48:
EXECUTE stmt1(1,2);
--Testcase 49:
EXECUTE stmt1(2,2);
--Testcase 50:
EXECUTE stmt1(3,2);
--Testcase 51:
EXECUTE stmt1(4,2);
-- generic plan
--Testcase 52:
EXECUTE stmt1(5,2);
--Testcase 53:
EXECUTE stmt1(6,2);
--Testcase 54:
EXECUTE stmt1(7,2);
--Testcase 55:
DELETE FROM employee;
--Testcase 56:
DELETE FROM department;
--Testcase 57:
DELETE FROM empdata;
--Testcase 58:
DELETE FROM numbers;
BEGIN;
--Testcase 59:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 60:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
--Testcase 61:
SELECT * from numbers;
BEGIN;
--Testcase 62:
INSERT INTO numbers VALUES(3, 'Three');
ROLLBACK;
--Testcase 63:
SELECT * from numbers;
BEGIN;
--Testcase 64:
INSERT INTO numbers VALUES(4, 'Four');
SAVEPOINT my_savepoint;
--Testcase 65:
INSERT INTO numbers VALUES(5, 'Five');
ROLLBACK TO SAVEPOINT my_savepoint;
--Testcase 66:
INSERT INTO numbers VALUES(6, 'Six');
COMMIT;
--Testcase 67:
SELECT * from numbers;
-- duplicate key
--Testcase 68:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 69:
DELETE from numbers;
BEGIN;
--Testcase 70:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 71:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
-- violate unique constraint
--Testcase 72:
UPDATE numbers SET b='Two' WHERE a = 1;
--Testcase 73:
SELECT * from numbers;
-- push down
--Testcase 74:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
-- (1,2,3) is pushed down
--Testcase 75:
explain (verbose, costs off) SELECT * from numbers WHERE a in (1,2,3) AND (1,2) < (a,5);
--Testcase 76:
explain (verbose, costs off) SELECT * from numbers WHERE a in (a+2*a,5);
--Testcase 77:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
--Testcase 78:
SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
--Testcase 79:
SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
-- ANY with ARRAY expression
--Testcase 154:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 155:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 156:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 157:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 158:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 159:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 160:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 161:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 162:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 163:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 164:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
--Testcase 165:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
-- ANY with ARRAY const
--Testcase 166:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 167:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 168:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 169:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 170:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 171:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 172:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 173:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 174:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 175:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 176:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 177:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 210:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 211:
SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 212:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
--Testcase 213:
SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
-- ALL with ARRAY expression
--Testcase 178:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 179:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 180:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 181:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 182:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 183:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 184:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 185:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 186:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 187:
SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 188:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
--Testcase 189:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
-- ALL with ARRAY const
--Testcase 190:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 191:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 192:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 193:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 194:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 195:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 196:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 197:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 198:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 199:
SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 200:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
--Testcase 201:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
-- ANY/ALL with TEXT ARRAY const
--Testcase 202:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 203:
SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 204:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 205:
SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 206:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 207:
SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 208:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 209:
SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 80:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 81:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 82:
UPDATE multiprimary SET b = 10 WHERE c = 3;
--Testcase 83:
SELECT * from multiprimary;
--Testcase 84:
UPDATE multiprimary SET a = 10 WHERE a = 1;
--Testcase 85:
SELECT * from multiprimary;
--Testcase 86:
UPDATE multiprimary SET a = 100, b=200, c=300 WHERE a=10 AND b=10;
--Testcase 87:
SELECT * from multiprimary;
--Testcase 88:
UPDATE multiprimary SET a = 1234;
--Testcase 89:
SELECT * from multiprimary;
--Testcase 90:
UPDATE multiprimary SET a = a+1, b=b+1 WHERE b=200 AND c=300;
--Testcase 91:
SELECT * from multiprimary;
--Testcase 92:
DELETE from multiprimary WHERE a = 1235;
--Testcase 93:
SELECT * from multiprimary;
--Testcase 94:
DELETE from multiprimary WHERE b = 2;
--Testcase 95:
SELECT * from multiprimary;
--Testcase 96:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 97:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 98:
INSERT INTO multiprimary VALUES(1,10,20);
--Testcase 99:
INSERT INTO multiprimary VALUES(2,20,40);
--Testcase 100:
SELECT count(distinct a) from multiprimary;
--Testcase 101:
SELECT sum(b),max(b), min(b) from multiprimary;
--Testcase 102:
SELECT sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 103:
SELECT sum(a) from multiprimary group by b having sum(a) > 0 order by sum(a);
--Testcase 104:
SELECT sum(a) A from multiprimary group by b having avg(abs(a)) > 0 AND sum(a) > 0 order by A;
--Testcase 105:
SELECT count(nullif(a, 1)) FROM multiprimary;
--Testcase 106:
SELECT a,a FROM multiprimary group by 1,2;
--Testcase 107:
SELECT * from multiprimary, numbers WHERE multiprimary.a=numbers.a;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 109:
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 110:
INSERT INTO numbers VALUES(4, 'Four');
-- All where clauses are pushed down
--Testcase 111:
SELECT * FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
--Testcase 112:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
-- Only "length(b) = 4" are pushed down
--Testcase 113:
SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 114:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 115:
INSERT INTO multiprimary (b,c) VALUES (99, 100);
--Testcase 116:
SELECT c FROM multiprimary WHERE COALESCE(a,b,c) = 99;
--Testcase 139:
CREATE FOREIGN TABLE multiprimary2(a int, b int, c int OPTIONS(column_name 'b')) SERVER sqlite_svr OPTIONS (table 'multiprimary');
--Testcase 117:
SELECT * FROM multiprimary2;
--Testcase 214:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN a OPTIONS(ADD column_name 'b');
--Testcase 118:
SELECT * FROM multiprimary2;
--Testcase 215:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN b OPTIONS (column_name 'nosuch column');
--Testcase 119:
SELECT * FROM multiprimary2;
--Testcase 140:
EXPLAIN (VERBOSE) SELECT * FROM multiprimary2;
--Testcase 120:
SELECT a FROM multiprimary2 WHERE b = 1;
--Testcase 141:
CREATE FOREIGN TABLE columntest(a int OPTIONS(column_name 'a a', key 'true'), "b b" int OPTIONS(key 'true'), c int OPTIONS(column_name 'c c')) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO columntest VALUES(1,2,3);
--Testcase 122:
UPDATE columntest SET c=10 WHERE a = 1;
--Testcase 123:
SELECT * FROM columntest;
--Testcase 124:
UPDATE columntest SET a=100 WHERE c = 10;
--Testcase 125:
SELECT * FROM columntest;
--Testcase 126:
INSERT INTO noprimary VALUES(1,'2');
--Testcase 127:
INSERT INTO noprimary SELECT * FROM noprimary;
--Testcase 128:
SELECT * FROM noprimary;
--get version
--Testcase 153:
\df sqlite*
--Testcase 154:
SELECT * FROM public.sqlite_fdw_version();
--Testcase 155:
SELECT sqlite_fdw_version();
-- issue #44 github
--Testcase 156:
CREATE FOREIGN TABLE fts_table (name text, description text) SERVER sqlite_svr;
--Testcase 157:
INSERT INTO fts_table VALUES ('this is name', 'this is description');
--Testcase 158:
SELECT * FROM fts_table; -- should work
--Testcase 159:
ALTER TABLE fts_table ALTER COLUMN name TYPE int;
--Testcase 160:
SELECT * FROM fts_table; -- should fail
-- issue #62 github
--Testcase 236:
INSERT INTO noprimary VALUES (4, 'Test''s');
--Testcase 237:
INSERT INTO noprimary VALUES (5, 'Test');
--Testcase 238:
SELECT * FROM noprimary;
--Testcase 239:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 240:
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 241:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b in ('Test''s', 'Test');
--Testcase 242:
SELECT * FROM noprimary where b in ('Test''s', 'Test');
-- INSERT/UPDATE whole row with generated column
--Testcase 216:
CREATE FOREIGN TABLE grem1_1 (
a int generated always as (0) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_1');
--Testcase 217:
INSERT INTO grem1_1 DEFAULT VALUES;
--Testcase 218:
SELECT * FROM grem1_1;
--Testcase 219:
CREATE FOREIGN TABLE grem1_2 (
a int generated always as (0) stored,
b int generated always as (1) stored,
c int generated always as (2) stored,
d int generated always as (3) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_2');
--Testcase 220:
INSERT INTO grem1_2 DEFAULT VALUES;
--Testcase 221:
SELECT * FROM grem1_2;
-- Executable test case for pushdown CASE expressions (results)
--Testcase 224:
CREATE FOREIGN TABLE case_exp(c1 int OPTIONS (key 'true'), c3 text, c6 varchar(10)) SERVER sqlite_svr;
--Testcase 225:
INSERT INTO case_exp
SELECT id,
to_char(id, 'FM00000'),
id % 10
FROM generate_series(1, 10) id;
--Testcase 226:
SELECT * FROM case_exp;
-- CASE arg WHEN
--Testcase 227:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
--Testcase 228:
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 229:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 230:
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 232:
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 233:
SELECT * FROM case_exp WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 234:
DELETE FROM case_exp;
-- readonly/readwrite tests
-- Full combinations
-- force_RO default SERVER default TABLE default
-- force_RO default SERVER true TABLE default
-- force_RO default SERVER false TABLE default
-- force_RO default SERVER default TABLE true
-- force_RO default SERVER default TABLE false
-- force_RO default SERVER true TABLE true
-- force_RO default SERVER false TABLE true
-- force_RO default SERVER false TABLE false
-- force_RO default SERVER true TABLE false
-- force_RO false SERVER default TABLE default
-- force_RO false SERVER true TABLE default
-- force_RO false SERVER false TABLE default
-- force_RO false SERVER default TABLE true
-- force_RO false SERVER default TABLE false
-- force_RO false SERVER true TABLE true
-- force_RO false SERVER false TABLE true
-- force_RO false SERVER false TABLE false
-- force_RO false SERVER true TABLE false
-- force_RO true SERVER default TABLE default
-- force_RO true SERVER true TABLE default
-- force_RO true SERVER false TABLE default
-- force_RO true SERVER default TABLE true
-- force_RO true SERVER default TABLE false
-- force_RO true SERVER true TABLE true
-- force_RO true SERVER false TABLE true
-- force_RO true SERVER false TABLE false
-- force_RO true SERVER true TABLE false
-- force_RO default SERVER default TABLE default
--Testcase 235:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 236:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 237:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO default SERVER true TABLE default
--Testcase 238:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 239:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 240:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 241:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 242:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO default SERVER false TABLE default
--Testcase 243:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 244:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 245:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 246:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER default TABLE true
--Testcase 247:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 248:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 249:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 250:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 251:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO default SERVER default TABLE false
--Testcase 252:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 253:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 254:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 255:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER true TABLE true
--Testcase 256:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 257:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 258:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 258:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 260:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 261:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO default SERVER false TABLE true
--Testcase 262:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 263:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 264:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 265:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO default SERVER false TABLE false
--Testcase 266:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 267:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 268:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 269:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO default SERVER true TABLE false
--Testcase 270:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 271:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 272:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 273:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 274:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 275:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 276:
SELECT * FROM RO_RW_test ORDER BY i;
--Bind error message test for some unsupported data type
--Testcase 277:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 278:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 279:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 277:
DELETE FROM RO_RW_test;
--Testcase 278:
ALTER SERVER sqlite_svr OPTIONS (ADD force_readonly 'false');
-- force_RO false SERVER default TABLE default
--Testcase 279:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 280:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 281:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO false SERVER true TABLE default
--Testcase 282:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 283:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 284:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 285:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 286:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO false SERVER false TABLE default
--Testcase 287:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 288:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 289:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 290:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER default TABLE true
--Testcase 291:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 292:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 293:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 294:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 295:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO false SERVER default TABLE false
--Testcase 296:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 297:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 298:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 299:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER true TABLE true
--Testcase 300:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 301:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 302:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 303:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 304:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 305:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO false SERVER false TABLE true
--Testcase 306:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 307:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 308:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 309:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO false SERVER false TABLE false
--Testcase 310:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 311:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 312:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 313:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO false SERVER true TABLE false
--Testcase 314:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 315:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 316:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 317:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 318:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 319:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 320:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 321:
DELETE FROM RO_RW_test;
--Testcase 322:
ALTER SERVER sqlite_svr OPTIONS (SET force_readonly 'true');
-- force_RO true SERVER default TABLE default
--Testcase 323:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- ERR
--Testcase 324:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- ERR
--Testcase 325:
DELETE FROM RO_RW_test WHERE i=2; -- ERR
-- force_RO true SERVER true TABLE default
--Testcase 326:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 327:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- ERR
--Testcase 328:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- ERR
--Testcase 329:
DELETE FROM RO_RW_test WHERE i=3; -- ERR
--Testcase 330:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- ERR
-- force_RO true SERVER false TABLE default
--Testcase 331:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 332:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 333:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 334:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER default TABLE true
--Testcase 335:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 336:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 337:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- ERR
--Testcase 338:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- ERR
--Testcase 339:
DELETE FROM RO_RW_test WHERE i=6; -- ERR
-- force_RO true SERVER default TABLE false
--Testcase 340:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 341:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 342:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 343:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER true TABLE true
--Testcase 344:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true'); -- ERR
--Testcase 345:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true'); -- ERR
--Testcase 346:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- ERR
--Testcase 347:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 348:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 349:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- ERR
-- force_RO true SERVER false TABLE true
--Testcase 350:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 351:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- ERR
--Testcase 352:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- ERR
--Testcase 353:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER false TABLE false
--Testcase 354:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 355:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 356:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 357:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER true TABLE false
--Testcase 358:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 359:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 360:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 361:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 362:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 363:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 364:
ALTER SERVER sqlite_svr OPTIONS (DROP force_readonly);
--Testcase 365:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 366:
DROP FOREIGN TABLE RO_RW_test;
-- End of RO/RW test
--Bind error message test for some unsupported data type
--Testcase 366:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 367:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 368:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 142:
DROP FUNCTION test_param_WHERE();
--Testcase 143:
DROP FOREIGN TABLE numbers;
--Testcase 144:
DROP FOREIGN TABLE department;
--Testcase 145:
DROP FOREIGN TABLE employee;
--Testcase 146:
DROP FOREIGN TABLE empdata;
--Testcase 147:
DROP FOREIGN TABLE multiprimary;
--Testcase 148:
DROP FOREIGN TABLE multiprimary2;
--Testcase 149:
DROP FOREIGN TABLE columntest;
--Testcase 150:
DROP FOREIGN TABLE noprimary;
--Testcase 161:
DROP FOREIGN TABLE fts_table;
--Testcase 222:
DROP FOREIGN TABLE grem1_1;
--Testcase 223:
DROP FOREIGN TABLE grem1_2;
--Testcase 235:
DROP FOREIGN TABLE case_exp;
--Testcase 151:
DROP SERVER sqlite_svr;
--Testcase 152:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/bitstring.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 02:
CREATE FOREIGN TABLE "type_BIT"( "i" int OPTIONS (key 'true'), "b" bit(6)) SERVER sqlite_svr OPTIONS (table 'type_BIT');
--Testcase 03:
DROP FOREIGN TABLE IF EXISTS "type_BIT+";
--Testcase 04:
CREATE FOREIGN TABLE "type_BIT+"( "i" int OPTIONS (key 'true'), "b" bit(6), "t" text, "l" smallint, "bi" bigint OPTIONS (column_name 'b')) SERVER sqlite_svr OPTIONS (table 'type_BIT+');
--Testcase 05: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (1, 1);
--Testcase 06: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (2, 2);
--Testcase 07: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (3, '1');
--Testcase 08: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (4, '10');
--Testcase 09: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (5, '101');
--Testcase 10:
INSERT INTO "type_BIT" ("i", "b") VALUES (6, '110110');
--Testcase 11:
INSERT INTO "type_BIT" ("i", "b") VALUES (7, '111001');
--Testcase 12:
INSERT INTO "type_BIT" ("i", "b") VALUES (8, '110000');
--Testcase 13:
INSERT INTO "type_BIT" ("i", "b") VALUES (9, '100001');
--Testcase 14: type mismatch with proper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (10, 53);
--Testcase 15:
SELECT * FROM "type_BIT+";
--Testcase 16:
SELECT * FROM "type_BIT" WHERE b < '110110';
--Testcase 17:
SELECT * FROM "type_BIT" WHERE b > '110110';
--Testcase 18:
SELECT * FROM "type_BIT" WHERE b = '110110';
--Testcase 20:
CREATE FOREIGN TABLE "type_VARBIT"( "i" int OPTIONS (key 'true'), "b" varbit(70)) SERVER sqlite_svr OPTIONS (table 'type_VARBIT');
--Testcase 21:
DROP FOREIGN TABLE IF EXISTS "type_VARBIT+";
--Testcase 22:
CREATE FOREIGN TABLE "type_VARBIT+"( "i" int OPTIONS (key 'true'), "b" varbit(70), "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_VARBIT+');
--Testcase 23:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (1, '1');
--Testcase 24:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (2, '10');
--Testcase 25:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (3, '11');
--Testcase 26:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (4, '100');
--Testcase 27:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (5, '101');
--Testcase 28:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (6, '110110');
--Testcase 29:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (7, '111001');
--Testcase 30:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (8, '110000');
--Testcase 31:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (9, '100001');
--Testcase 32:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (10, '0100100101011001010010101000111110110101101101111011000101010');
--Testcase 33:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (11, '01001001010110010100101010001111101101011011011110110001010101');
--Testcase 34:
SELECT * FROM "type_VARBIT+";
--Testcase 35:
SELECT * FROM "type_VARBIT+" WHERE b < '110110';
--Testcase 36:
SELECT * FROM "type_VARBIT+" WHERE b > '110110';
--Testcase 37:
SELECT * FROM "type_VARBIT+" WHERE b = '110110';
--Testcase 38:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (12, '010010010101100101001010100011111011010110110111101100010101010');
--Testcase 39:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (13, '0100100101011001010010101000111110110101101101111011000101010101');
--Testcase 40: very long bit string, expected ERROR, 65 bits
INSERT INTO "type_VARBIT" ("i", "b") VALUES (14, '01001001010110010100101010001111101101011011011110110001010101010');
--Testcase 41:
SELECT * FROM "type_VARBIT+" WHERE "i" > 10;
--Testcase 42:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 43:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 44:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 45:
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 46:
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 47:
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 48:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 49:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 50:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 51:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 52:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 53:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 54:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 55:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 56:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 57:
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 58:
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 59:
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 60:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 61:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 62:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 63:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 64:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 65:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 66:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 67:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 68:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 69:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 70:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 71:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 72:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 73:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 74:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 75:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 76:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 77:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 78:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 79:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 80:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 81:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 82:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 83:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 84:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 85:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 86:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 87:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 88:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 89:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 90:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 91:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 92:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 93:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 94:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 95:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 005:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/bool.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 000:
CREATE EXTENSION sqlite_fdw;
--Testcase 001:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 01:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int OPTIONS (key 'true'), b bool) SERVER sqlite_svr;
--Testcase 02:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (1, TRUE);
--Testcase 03:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (2, FALSE);
--Testcase 04:
CREATE FOREIGN TABLE "type_BOOLEAN+"( "i" int, "b" bool, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN+');
--Testcase 05:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE text;
--Testcase 06:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (3, TRUE);
--Testcase 07:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (4, FALSE);
--Testcase 08:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (5, true);
--Testcase 09:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (6, false);
--Testcase 10:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (7, 'Yes');
--Testcase 11:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (8, 'YeS');
--Testcase 12:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (9, 'yes');
--Testcase 13:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (10, 'no');
--Testcase 14:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (11, 'No');
--Testcase 15:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (12, 'nO');
--Testcase 16:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (13, 'off');
--Testcase 17:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (14, 'oFf');
--Testcase 18:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (15, 'on');
--Testcase 19:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (16, 'ON');
--Testcase 20:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (17, 't');
--Testcase 21:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (18, 'T');
--Testcase 22:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (19, 'Y');
--Testcase 23:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (20, 'y');
--Testcase 24:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (21, 'F');
--Testcase 25:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (22, 'f');
--Testcase 26:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (23, 'x');
--Testcase 27:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (24, '0');
--Testcase 28:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (25, '1');
--Testcase 29:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (26, NULL);
--Testcase 30:
SELECT * FROM "type_BOOLEAN";
--Testcase 31:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 32:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN";
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN+";
--Testcase 34: ERR - invalid text affinity because not ISO:SQL text input
SELECT * FROM "type_BOOLEAN+";
--Testcase 35
DELETE FROM "type_BOOLEAN" WHERE i = 23;
--Testcase 36:
SELECT * FROM "type_BOOLEAN+";
--Testcase 37:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NULL;
--Testcase 38:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NOT NULL;
--Testcase 39:
SELECT * FROM "type_BOOLEAN+" WHERE b;
--Testcase 40:
SELECT * FROM "type_BOOLEAN+" WHERE NOT b;
--Testcase 41:
CREATE FOREIGN TABLE "type_BOOLEANpk" (col bool OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 42:
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 43:
INSERT INTO "type_BOOLEANpk" VALUES (FALSE);
--Testcase 44: ERR - primary key
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 45:
DELETE FROM "type_BOOLEANpk";
--Testcase 46:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE float8;
--Testcase 47:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (27, 3.14159265358979);
--Testcase 48:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 49: ERR - invalid float for bool column
SELECT * FROM "type_BOOLEAN+";
--Testcase 50
DELETE FROM "type_BOOLEAN" WHERE i = 27;
--Testcase 51:
SELECT * FROM "type_BOOLEAN+";
--Testcase 52:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE b;
--Testcase 53:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE NOT b;
--Testcase 54:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE b;
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE NOT b;
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 57:
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 58:
CREATE FOREIGN TABLE "type_BOOLEAN_oper"( "i" int OPTIONS (key 'true'), i1 smallint, b1 boolean, i2 smallint, b2 boolean) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN_oper');
--Testcase 59: see INIT.SQL with mixed affinity boolean data
SELECT * FROM "type_BOOLEAN_oper";
--Testcase 60:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 61:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 62:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 63:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 64:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 65:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 66:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 67:
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 68:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 69:
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 70:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 71:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 72:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 73:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 74:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 75:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b2;
--Testcase 76:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 77:
DELETE FROM "type_BOOLEAN_oper" WHERE b2;
--Testcase 78:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 79:
DELETE FROM "type_BOOLEAN";
--Testcase 003:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/float4.sql
================================================
--
-- FLOAT4
--
--Testcase 46:
CREATE EXTENSION sqlite_fdw;
--Testcase 47:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 48:
CREATE FOREIGN TABLE FLOAT4_TBL(f1 float4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 49:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0');
--Testcase 2:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 ');
--Testcase 4:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20');
--Testcase 5:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20');
-- test for over and under flow
--Testcase 6:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70');
--Testcase 7:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
--Testcase 8:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
--Testcase 9:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
--Testcase 50:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8);
--Testcase 51:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8);
--Testcase 52:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8);
--Testcase 53:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8);
--Testcase 54:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
--Testcase 55:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
--Testcase 56:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
--Testcase 57:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
-- bad input
--Testcase 10:
INSERT INTO FLOAT4_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
--Testcase 17:
INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
-- Also try it with non-error-throwing API
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_FLOAT4(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
INSERT INTO NON_ERROR_THROWING_API_FLOAT4 VALUES ('34.5', 1), ('xyz', 2), ('1e400', 3);
SELECT pg_input_is_valid(f1, 'float4') FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 1;
SELECT pg_input_is_valid(f1, 'float4') FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 2;
SELECT pg_input_is_valid(f1, 'float4') FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 3;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 3), 'float4');
-- special inputs
--Testcase 18:
DELETE FROM FLOAT4_TMP;
--Testcase 58:
INSERT INTO FLOAT4_TMP VALUES ('NaN'::float4);
--Testcase 59:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 20:
DELETE FROM FLOAT4_TMP;
--Testcase 60:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4);
--Testcase 61:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 21:
DELETE FROM FLOAT4_TMP;
--Testcase 62:
INSERT INTO FLOAT4_TMP VALUES (' NAN '::float4);
--Testcase 63:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 22:
DELETE FROM FLOAT4_TMP;
--Testcase 64:
INSERT INTO FLOAT4_TMP VALUES ('infinity'::float4);
--Testcase 65:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 23:
DELETE FROM FLOAT4_TMP;
--Testcase 66:
INSERT INTO FLOAT4_TMP VALUES (' -INFINiTY '::float4);
--Testcase 67:
SELECT f1 FROM FLOAT4_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT4_TMP;
--Testcase 68:
INSERT INTO FLOAT4_TMP VALUES ('N A N'::float4);
--Testcase 69:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 26:
DELETE FROM FLOAT4_TMP;
--Testcase 70:
INSERT INTO FLOAT4_TMP VALUES ('NaN x'::float4);
--Testcase 71:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 27:
DELETE FROM FLOAT4_TMP;
--Testcase 72:
INSERT INTO FLOAT4_TMP VALUES (' INFINITY x'::float4);
--Testcase 73:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 28:
DELETE FROM FLOAT4_TMP;
--Testcase 74:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 + 100.0);
--Testcase 75:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 30:
DELETE FROM FLOAT4_TMP;
--Testcase 76:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 / 'Infinity'::float4);
--Testcase 77:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 185:
DELETE FROM FLOAT4_TMP;
--Testcase 186:
INSERT INTO FLOAT4_TMP VALUES ('42'::float4 / 'Infinity'::float4);
--Testcase 187:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 31:
DELETE FROM FLOAT4_TMP;
--Testcase 78:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / 'nan'::float4);
--Testcase 79:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 188:
DELETE FROM FLOAT4_TMP;
--Testcase 189:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / '0'::float4);
--Testcase 190:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 32:
DELETE FROM FLOAT4_TMP;
--Testcase 80:
INSERT INTO FLOAT4_TMP VALUES ('nan'::numeric::float4);
--Testcase 81:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 34:
SELECT * FROM FLOAT4_TBL;
--SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3';
--SELECT '' AS one, f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3';
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1;
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3';
--Testcase 35:
SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1;
--Testcase 36:
SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3';
--Testcase 37:
SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 38:
SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 39:
SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 40:
SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
-- test divide by zero
--Testcase 41:
SELECT f.f1 / '0.0' from FLOAT4_TBL f;
--Testcase 42:
SELECT * FROM FLOAT4_TBL;
-- test the unary float4abs operator
--Testcase 43:
SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f;
--Testcase 44:
UPDATE FLOAT4_TBL
SET f1 = FLOAT4_TBL.f1 * '-1'
WHERE FLOAT4_TBL.f1 > '0.0';
--Testcase 45:
SELECT * FROM FLOAT4_TBL;
-- test edge-case coercions to integer
--Testcase 82:
DELETE FROM FLOAT4_TMP;
--Testcase 83:
INSERT INTO FLOAT4_TMP VALUES ('32767.4'::float4);
--Testcase 84:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 85:
DELETE FROM FLOAT4_TMP;
--Testcase 86:
INSERT INTO FLOAT4_TMP VALUES ('32767.6'::float4);
--Testcase 87:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 88:
DELETE FROM FLOAT4_TMP;
--Testcase 89:
INSERT INTO FLOAT4_TMP VALUES ('-32768.4'::float4);
--Testcase 90:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 91:
DELETE FROM FLOAT4_TMP;
--Testcase 92:
INSERT INTO FLOAT4_TMP VALUES ('-32768.6'::float4);
--Testcase 93:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 94:
DELETE FROM FLOAT4_TMP;
--Testcase 95:
INSERT INTO FLOAT4_TMP VALUES ('2147483520'::float4);
--Testcase 96:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 97:
DELETE FROM FLOAT4_TMP;
--Testcase 98:
INSERT INTO FLOAT4_TMP VALUES ('2147483647'::float4);
--Testcase 99:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 100:
DELETE FROM FLOAT4_TMP;
--Testcase 101:
INSERT INTO FLOAT4_TMP VALUES ('-2147483648.5'::float4);
--Testcase 102:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 103:
DELETE FROM FLOAT4_TMP;
--Testcase 104:
INSERT INTO FLOAT4_TMP VALUES ('-2147483900'::float4);
--Testcase 105:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 106:
DELETE FROM FLOAT4_TMP;
--Testcase 107:
INSERT INTO FLOAT4_TMP VALUES ('9223369837831520256'::float4);
--Testcase 108:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 109:
DELETE FROM FLOAT4_TMP;
--Testcase 110:
INSERT INTO FLOAT4_TMP VALUES ('9223372036854775807'::float4);
--Testcase 111:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 112:
DELETE FROM FLOAT4_TMP;
--Testcase 113:
INSERT INTO FLOAT4_TMP VALUES ('-9223372036854775808.5'::float4);
--Testcase 114:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 115:
DELETE FROM FLOAT4_TMP;
--Testcase 116:
INSERT INTO FLOAT4_TMP VALUES ('-9223380000000000000'::float4);
--Testcase 117:
SELECT f1::int8 FROM FLOAT4_TMP;
-- Test for correct input rounding in edge cases.
-- These lists are from Paxson 1991, excluding subnormals and
-- inputs of over 9 sig. digits.
--Testcase 118:
DELETE FROM FLOAT4_TMP;
--Testcase 119:
INSERT INTO FLOAT4_TMP VALUES ('5e-20'::float4);
--Testcase 120:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 121:
DELETE FROM FLOAT4_TMP;
--Testcase 122:
INSERT INTO FLOAT4_TMP VALUES ('67e14'::float4);
--Testcase 123:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 124:
DELETE FROM FLOAT4_TMP;
--Testcase 125:
INSERT INTO FLOAT4_TMP VALUES ('985e15'::float4);
--Testcase 126:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 127:
DELETE FROM FLOAT4_TMP;
--Testcase 128:
INSERT INTO FLOAT4_TMP VALUES ('55895e-16'::float4);
--Testcase 129:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 130:
DELETE FROM FLOAT4_TMP;
--Testcase 131:
INSERT INTO FLOAT4_TMP VALUES ('7038531e-32'::float4);
--Testcase 132:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 133:
DELETE FROM FLOAT4_TMP;
--Testcase 134:
INSERT INTO FLOAT4_TMP VALUES ('702990899e-20'::float4);
--Testcase 135:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 136:
DELETE FROM FLOAT4_TMP;
--Testcase 137:
INSERT INTO FLOAT4_TMP VALUES ('3e-23'::float4);
--Testcase 138:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 139:
DELETE FROM FLOAT4_TMP;
--Testcase 140:
INSERT INTO FLOAT4_TMP VALUES ('57e18'::float4);
--Testcase 141:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 142:
DELETE FROM FLOAT4_TMP;
--Testcase 143:
INSERT INTO FLOAT4_TMP VALUES ('789e-35'::float4);
--Testcase 144:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 145:
DELETE FROM FLOAT4_TMP;
--Testcase 146:
INSERT INTO FLOAT4_TMP VALUES ('2539e-18'::float4);
--Testcase 147:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 148:
DELETE FROM FLOAT4_TMP;
--Testcase 149:
INSERT INTO FLOAT4_TMP VALUES ('76173e28'::float4);
--Testcase 150:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 151:
DELETE FROM FLOAT4_TMP;
--Testcase 152:
INSERT INTO FLOAT4_TMP VALUES ('887745e-11'::float4);
--Testcase 153:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 154:
DELETE FROM FLOAT4_TMP;
--Testcase 155:
INSERT INTO FLOAT4_TMP VALUES ('5382571e-37'::float4);
--Testcase 156:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 157:
DELETE FROM FLOAT4_TMP;
--Testcase 158:
INSERT INTO FLOAT4_TMP VALUES ('82381273e-35'::float4);
--Testcase 159:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 160:
DELETE FROM FLOAT4_TMP;
--Testcase 161:
INSERT INTO FLOAT4_TMP VALUES ('750486563e-38'::float4);
--Testcase 162:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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...
--Testcase 163:
DELETE FROM FLOAT4_TMP;
--Testcase 164:
INSERT INTO FLOAT4_TMP VALUES ('1.17549435e-38'::float4);
--Testcase 165:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 166:
DELETE FROM FLOAT4_TMP;
--Testcase 167:
INSERT INTO FLOAT4_TMP VALUES('1.1754944e-38'::float4);
--Testcase 168:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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).
--Testcase 169:
create type xfloat4;
--Testcase 170:
create function xfloat4in(cstring) returns xfloat4 immutable strict
language internal as 'int4in';
--Testcase 171:
create function xfloat4out(xfloat4) returns cstring immutable strict
language internal as 'int4out';
--Testcase 172:
create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4);
--Testcase 173:
create cast (xfloat4 as float4) without function;
--Testcase 174:
create cast (float4 as xfloat4) without function;
--Testcase 175:
create cast (xfloat4 as integer) without function;
--Testcase 176:
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.
--Testcase 177:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 178:
insert into testdata(bits) 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');
--Testcase 179:
select float4send(flt) as ibits,
flt
from (select bits::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
begin;
--Testcase 180:
insert into testdata(bits) 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');
--Testcase 181:
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::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 182:
drop type xfloat4 cascade;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/float8.sql
================================================
--
-- FLOAT8
--
--Testcase 113:
CREATE EXTENSION sqlite_fdw;
--Testcase 114:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 115:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 116:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 2:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 4:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 5:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- test for underflow and overflow handling
--Testcase 6:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e400'::float8);
--Testcase 7:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e400'::float8);
--Testcase 8:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e-400'::float8);
--Testcase 9:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e-400'::float8);
-- test smallest normalized input
--Testcase 117:
INSERT INTO FLOAT8_TMP(f1) VALUES ('2.2250738585072014E-308'::float8);
--Testcase 118:
SELECT float8send(f1) FROM FLOAT8_TMP;
-- bad input
--Testcase 10:
INSERT INTO FLOAT8_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
--Testcase 17:
INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
-- Also try it with non-error-throwing API
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_FLOAT8(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
INSERT INTO NON_ERROR_THROWING_API_FLOAT8 VALUES ('34.5', 1), ('xyz', 2), ('1e4000', 3);
SELECT pg_input_is_valid(f1, 'float8') FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 1;
SELECT pg_input_is_valid(f1, 'float8') FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 2;
SELECT pg_input_is_valid(f1, 'float8') FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 3;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 3), 'float8');
-- special inputs
--Testcase 19:
DELETE FROM FLOAT8_TMP;
--Testcase 119:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8);
--Testcase 120:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 20:
DELETE FROM FLOAT8_TMP;
--Testcase 121:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8);
--Testcase 122:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 21:
DELETE FROM FLOAT8_TMP;
--Testcase 123:
INSERT INTO FLOAT8_TMP VALUES (' NAN '::float8);
--Testcase 124:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 22:
DELETE FROM FLOAT8_TMP;
--Testcase 125:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8);
--Testcase 126:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 23:
DELETE FROM FLOAT8_TMP;
--Testcase 127:
INSERT INTO FLOAT8_TMP VALUES (' -INFINiTY '::float8);
--Testcase 128:
SELECT f1 FROM FLOAT8_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT8_TMP;
--Testcase 129:
INSERT INTO FLOAT8_TMP VALUES ('N A N'::float8);
--Testcase 130:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 26:
DELETE FROM FLOAT8_TMP;
--Testcase 131:
INSERT INTO FLOAT8_TMP VALUES ('NaN x'::float8);
--Testcase 132:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 27:
DELETE FROM FLOAT8_TMP;
--Testcase 133:
INSERT INTO FLOAT8_TMP VALUES (' INFINITY x'::float8);
--Testcase 134:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 28:
DELETE FROM FLOAT8_TMP;
--Testcase 135:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 + 100.0);
--Testcase 136:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 30:
DELETE FROM FLOAT8_TMP;
--Testcase 137:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 / 'Infinity'::float8);
--Testcase 138:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 272:
DELETE FROM FLOAT8_TMP;
--Testcase 273:
INSERT INTO FLOAT8_TMP VALUES ('42'::float8 / 'Infinity'::float8);
--Testcase 274:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 31:
DELETE FROM FLOAT8_TMP;
--Testcase 139:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / 'nan'::float8);
--Testcase 140:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 275:
DELETE FROM FLOAT8_TMP;
--Testcase 276:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / '0'::float8);
--Testcase 277:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 32:
DELETE FROM FLOAT8_TMP;
--Testcase 141:
INSERT INTO FLOAT8_TMP VALUES ('nan'::numeric::float8);
--Testcase 142:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 34:
SELECT * FROM FLOAT8_TBL;
--Testcase 35:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
--Testcase 36:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
--Testcase 37:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
--Testcase 38:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
--Testcase 39:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
--Testcase 40:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
--Testcase 41:
SELECT f.f1, f.f1 * '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 42:
SELECT f.f1, f.f1 + '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 43:
SELECT f.f1, f.f1 / '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 44:
SELECT f.f1, f.f1 - '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 45:
SELECT f.f1 ^ '2.0' AS square_f1
FROM FLOAT8_TBL f where f.f1 = '1004.3';
-- absolute value
--Testcase 46:
SELECT f.f1, @f.f1 AS abs_f1
FROM FLOAT8_TBL f;
-- truncate
--Testcase 47:
SELECT f.f1, trunc(f.f1) AS trunc_f1
FROM FLOAT8_TBL f;
-- round
--Testcase 48:
SELECT f.f1, round(f.f1) AS round_f1
FROM FLOAT8_TBL f;
-- ceil / ceiling
--Testcase 49:
select ceil(f1) as ceil_f1 from float8_tbl f;
--Testcase 50:
select ceiling(f1) as ceiling_f1 from float8_tbl f;
-- floor
--Testcase 51:
select floor(f1) as floor_f1 from float8_tbl f;
-- sign
--Testcase 52:
select sign(f1) as sign_f1 from float8_tbl f;
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 278:
SET extra_float_digits = 0;
-- square root
BEGIN;
--Testcase 53:
DELETE FROM FLOAT8_TBL;
--Testcase 54:
INSERT INTO FLOAT8_TBL VALUES ('64'::float8);
--Testcase 55:
SELECT sqrt(f1) as eight FROM FLOAT8_TBL;
--Testcase 56:
SELECT |/f1 as eight FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 57:
SELECT f.f1, |/f.f1 AS sqrt_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
-- power
--Testcase 58:
DELETE FROM FLOAT8_TMP;
--Testcase 143:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, '0.5'::float8);
--Testcase 144:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 60:
DELETE FROM FLOAT8_TMP;
--Testcase 145:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, '0.5'::float8);
--Testcase 146:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 61:
DELETE FROM FLOAT8_TMP;
--Testcase 147:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, 'NaN'::float8);
--Testcase 148:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 62:
DELETE FROM FLOAT8_TMP;
--Testcase 149:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, 'NaN'::float8);
--Testcase 150:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 63:
DELETE FROM FLOAT8_TMP;
--Testcase 151:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'NaN'::float8);
--Testcase 152:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 64:
DELETE FROM FLOAT8_TMP;
--Testcase 153:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'NaN'::float8);
--Testcase 154:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 65:
DELETE FROM FLOAT8_TMP;
--Testcase 155:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8 , '0'::float8);
--Testcase 156:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 279:
DELETE FROM FLOAT8_TMP;
--Testcase 280:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '0'::float8);
--Testcase 281:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 282:
DELETE FROM FLOAT8_TMP;
--Testcase 283:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '0'::float8);
--Testcase 284:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 285:
DELETE FROM FLOAT8_TMP;
--Testcase 286:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, 'infinity'::float8);
--Testcase 287:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 288:
DELETE FROM FLOAT8_TMP;
--Testcase 289:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, '-infinity'::float8);
--Testcase 290:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 291:
DELETE FROM FLOAT8_TMP;
--Testcase 292:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'infinity'::float8);
--Testcase 293:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 294:
DELETE FROM FLOAT8_TMP;
--Testcase 295:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, '-infinity'::float8);
--Testcase 296:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 297:
DELETE FROM FLOAT8_TMP;
--Testcase 298:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'infinity'::float8);
--Testcase 299:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 300:
DELETE FROM FLOAT8_TMP;
--Testcase 301:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, '-infinity'::float8);
--Testcase 302:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 303:
DELETE FROM FLOAT8_TMP;
--Testcase 304:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, 'infinity'::float8);
--Testcase 305:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 306:
DELETE FROM FLOAT8_TMP;
--Testcase 307:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, 'infinity'::float8);
--Testcase 308:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 309:
DELETE FROM FLOAT8_TMP;
--Testcase 310:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, 'infinity'::float8);
--Testcase 311:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 312:
DELETE FROM FLOAT8_TMP;
--Testcase 313:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, 'infinity'::float8);
--Testcase 314:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 315:
DELETE FROM FLOAT8_TMP;
--Testcase 316:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, '-infinity'::float8);
--Testcase 317:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 318:
DELETE FROM FLOAT8_TMP;
--Testcase 319:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, '-infinity'::float8);
--Testcase 320:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 321:
DELETE FROM FLOAT8_TMP;
--Testcase 322:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, '-infinity'::float8);
--Testcase 323:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 324:
DELETE FROM FLOAT8_TMP;
--Testcase 325:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, '-infinity'::float8);
--Testcase 326:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 327:
DELETE FROM FLOAT8_TMP;
--Testcase 328:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-2'::float8);
--Testcase 329:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 330:
DELETE FROM FLOAT8_TMP;
--Testcase 331:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '2'::float8);
--Testcase 332:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 333:
DELETE FROM FLOAT8_TMP;
--Testcase 334:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, 'infinity'::float8);
--Testcase 335:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 336:
DELETE FROM FLOAT8_TMP;
--Testcase 337:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-infinity'::float8);
--Testcase 338:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- 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".
--Testcase 339:
DELETE FROM FLOAT8_TMP;
--Testcase 340:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-2'::float8);
--Testcase 341:
SELECT power(f1, f2) = '0' FROM FLOAT8_TMP;
--Testcase 342:
DELETE FROM FLOAT8_TMP;
--Testcase 343:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3'::float8);
--Testcase 344:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 345:
DELETE FROM FLOAT8_TMP;
--Testcase 346:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '2'::float8);
--Testcase 347:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 348:
DELETE FROM FLOAT8_TMP;
--Testcase 349:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '3'::float8);
--Testcase 350:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 351:
DELETE FROM FLOAT8_TMP;
--Testcase 352:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3.5'::float8);
--Testcase 353:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 354:
DELETE FROM FLOAT8_TMP;
--Testcase 355:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, 'infinity'::float8);
--Testcase 356:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 357:
DELETE FROM FLOAT8_TMP;
--Testcase 358:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-infinity'::float8);
--Testcase 359:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- take exp of ln(f.f1)
--Testcase 67:
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
--Testcase 360:
DELETE FROM FLOAT8_TMP;
--Testcase 361:
INSERT INTO FLOAT8_TMP VALUES ('inf'::float8), ('-inf'::float8), ('nan'::float8);
--Testcase 362:
SELECT exp(f1) FROM FLOAT8_TMP;
-- cube root
BEGIN;
--Testcase 68:
DELETE FROM FLOAT8_TBL;
--Testcase 69:
INSERT INTO FLOAT8_TBL VALUES ('27'::float8);
--Testcase 70:
SELECT ||/f1 as three FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 71:
SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
--Testcase 72:
SELECT * FROM FLOAT8_TBL;
--Testcase 73:
UPDATE FLOAT8_TBL
SET f1 = FLOAT8_TBL.f1 * '-1'
WHERE FLOAT8_TBL.f1 > '0.0';
--Testcase 74:
SELECT f.f1 * '1e200' from FLOAT8_TBL f;
--Testcase 75:
SELECT f.f1 ^ '1e200' from FLOAT8_TBL f;
BEGIN;
--Testcase 76:
DELETE FROM FLOAT8_TBL;
--Testcase 77:
INSERT INTO FLOAT8_TBL VALUES (0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5);
--Testcase 78:
SELECT * FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 79:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
--Testcase 80:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
--Testcase 81:
SELECT exp(f.f1) from FLOAT8_TBL f;
--Testcase 82:
SELECT f.f1 / '0.0' from FLOAT8_TBL f;
--Testcase 83:
SELECT * 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.
--Testcase 157:
DELETE FROM FLOAT8_TMP;
--Testcase 158:
INSERT INTO FLOAT8_TMP(f1) VALUES (1);
--Testcase 159:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 160:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 161:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 162:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 163:
DELETE FROM FLOAT8_TMP;
--Testcase 164:
INSERT INTO FLOAT8_TMP(f1) VALUES (2);
--Testcase 165:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 166:
DELETE FROM FLOAT8_TMP;
--Testcase 167:
INSERT INTO FLOAT8_TMP(f1) VALUES (0.5);
--Testcase 168:
SELECT atanh(f1) FROM FLOAT8_TMP;
-- test Inf/NaN cases for hyperbolic functions
--Testcase 169:
DELETE FROM FLOAT8_TMP;
--Testcase 170:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 171:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 172:
DELETE FROM FLOAT8_TMP;
--Testcase 173:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 174:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 175:
DELETE FROM FLOAT8_TMP;
--Testcase 176:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 177:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 178:
DELETE FROM FLOAT8_TMP;
--Testcase 179:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 180:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 181:
DELETE FROM FLOAT8_TMP;
--Testcase 182:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 183:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 184:
DELETE FROM FLOAT8_TMP;
--Testcase 185:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 186:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 187:
DELETE FROM FLOAT8_TMP;
--Testcase 188:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 189:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 190:
DELETE FROM FLOAT8_TMP;
--Testcase 191:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 192:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 193:
DELETE FROM FLOAT8_TMP;
--Testcase 194:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 195:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 196:
DELETE FROM FLOAT8_TMP;
--Testcase 197:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 198:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 199:
DELETE FROM FLOAT8_TMP;
--Testcase 200:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 201:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 202:
DELETE FROM FLOAT8_TMP;
--Testcase 203:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 204:
SELECT asinh(f1) FROM FLOAT8_TMP;
-- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test
-- SELECT acosh(float8 'infinity');
--Testcase 205:
DELETE FROM FLOAT8_TMP;
--Testcase 206:
INSERT INTO FLOAT8_TMP VALUES (float8 '-infinity');
--Testcase 207:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 208:
DELETE FROM FLOAT8_TMP;
--Testcase 209:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 210:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 211:
DELETE FROM FLOAT8_TMP;
--Testcase 212:
INSERT INTO FLOAT8_TMP VALUES ((float8 'infinity'));
--Testcase 213:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 214:
DELETE FROM FLOAT8_TMP;
--Testcase 215:
INSERT INTO FLOAT8_TMP VALUES ((float8 '-infinity'));
--Testcase 216:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 217:
DELETE FROM FLOAT8_TMP;
--Testcase 218:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 219:
SELECT atanh(f1) FROM FLOAT8_TMP;
-- error functions
-- we run these with extra_float_digits = -1, to get consistently rounded
-- results on all platforms.
SET extra_float_digits = -1;
DELETE FROM FLOAT8_TBL;
INSERT INTO FLOAT8_TBL(f1) VALUES (float8 '-infinity'),
(-28), (-6), (-3.4), (-2.1), (-1.1), (-0.45),
(-1.2e-9), (-2.3e-13), (-1.2e-17), (0),
(1.2e-17), (2.3e-13), (1.2e-9),
(0.45), (1.1), (2.1), (3.4), (6), (28),
(float8 'infinity'), (float8 'nan');
SELECT f1,
erf(f1),
erfc(f1)
FROM FLOAT8_TBL;
--Testcase 369:
RESET extra_float_digits;
-- test for over- and underflow
--Testcase 84:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
--Testcase 85:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
--Testcase 86:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
--Testcase 87:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
-- maintain external table consistency across platforms
-- delete all values and reinsert well-behaved ones
--Testcase 88:
DELETE FROM FLOAT8_TBL;
--Testcase 89:
INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
--Testcase 90:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
--Testcase 91:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
--Testcase 92:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
--Testcase 93:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
--Testcase 94:
SELECT * FROM FLOAT8_TBL;
-- test edge-case coercions to integer
--Testcase 220:
DELETE FROM FLOAT8_TMP;
--Testcase 221:
INSERT INTO FLOAT8_TMP VALUES ('32767.4'::float8);
--Testcase 222:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 223:
DELETE FROM FLOAT8_TMP;
--Testcase 224:
INSERT INTO FLOAT8_TMP VALUES ('32767.6'::float8);
--Testcase 225:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 226:
DELETE FROM FLOAT8_TMP;
--Testcase 227:
INSERT INTO FLOAT8_TMP VALUES ('-32768.4'::float8);
--Testcase 228:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 229:
DELETE FROM FLOAT8_TMP;
--Testcase 230:
INSERT INTO FLOAT8_TMP VALUES ('-32768.6'::float8);
--Testcase 231:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 232:
DELETE FROM FLOAT8_TMP;
--Testcase 233:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.4'::float8);
--Testcase 234:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 235:
DELETE FROM FLOAT8_TMP;
--Testcase 236:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.6'::float8);
--Testcase 237:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 238:
DELETE FROM FLOAT8_TMP;
--Testcase 239:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.4'::float8);
--Testcase 240:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 241:
DELETE FROM FLOAT8_TMP;
--Testcase 242:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.6'::float8);
--Testcase 243:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 244:
DELETE FROM FLOAT8_TMP;
--Testcase 245:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854773760'::float8);
--Testcase 246:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 247:
DELETE FROM FLOAT8_TMP;
--Testcase 248:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854775807'::float8);
--Testcase 249:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 250:
DELETE FROM FLOAT8_TMP;
--Testcase 251:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854775808.5'::float8);
--Testcase 252:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 253:
DELETE FROM FLOAT8_TMP;
--Testcase 254:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854780000'::float8);
--Testcase 255:
SELECT f1::int8 FROM FLOAT8_TMP;
-- test exact cases for trigonometric functions in degrees
BEGIN;
--Testcase 95:
DELETE FROM FLOAT8_TBL;
--Testcase 96:
INSERT INTO FLOAT8_TBL VALUES (0), (30), (90), (150), (180),
(210), (270), (330), (360);
--Testcase 97:
SELECT f1,
sind(f1),
sind(f1) IN (-1,-0.5,0,0.5,1) AS sind_exact
FROM FLOAT8_TBL;
--Testcase 98:
DELETE FROM FLOAT8_TBL;
--Testcase 99:
INSERT INTO FLOAT8_TBL VALUES (0), (60), (90), (120), (180),
(240), (270), (300), (360);
--Testcase 100:
SELECT f1,
cosd(f1),
cosd(f1) IN (-1,-0.5,0,0.5,1) AS cosd_exact
FROM FLOAT8_TBL;
--Testcase 101:
DELETE FROM FLOAT8_TBL;
--Testcase 102:
INSERT INTO FLOAT8_TBL VALUES (0), (45), (90), (135), (180),
(225), (270), (315), (360);
--Testcase 103:
SELECT f1,
tand(f1),
tand(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS tand_exact,
cotd(f1),
cotd(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS cotd_exact
FROM FLOAT8_TBL;
--Testcase 104:
DELETE FROM FLOAT8_TBL;
--Testcase 105:
INSERT INTO FLOAT8_TBL VALUES (-1), (-0.5), (0), (0.5), (1);
--Testcase 106:
SELECT f1,
asind(f1),
asind(f1) IN (-90,-30,0,30,90) AS asind_exact,
acosd(f1),
acosd(f1) IN (0,60,90,120,180) AS acosd_exact
FROM FLOAT8_TBL;
--Testcase 107:
DELETE FROM FLOAT8_TBL;
--Testcase 108:
INSERT INTO FLOAT8_TBL VALUES ('-Infinity'::float8), (-1), (0), (1),
('Infinity'::float8);
--Testcase 109:
SELECT f1,
atand(f1),
atand(f1) IN (-90,-45,0,45,90) AS atand_exact
FROM FLOAT8_TBL;
--Testcase 110:
DELETE FROM FLOAT8_TBL;
--Testcase 111:
INSERT INTO FLOAT8_TBL SELECT * FROM generate_series(0, 360, 90);
--Testcase 112:
SELECT x, y,
atan2d(y, x),
atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact
FROM (SELECT 10*cosd(f1), 10*sind(f1)
FROM FLOAT8_TBL) AS t(x,y);
ROLLBACK;
--
-- 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).
--Testcase 256:
create type xfloat8;
--Testcase 257:
create function xfloat8in(cstring) returns xfloat8 immutable strict
language internal as 'int8in';
--Testcase 258:
create function xfloat8out(xfloat8) returns cstring immutable strict
language internal as 'int8out';
--Testcase 259:
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
--Testcase 260:
create cast (xfloat8 as float8) without function;
--Testcase 261:
create cast (float8 as xfloat8) without function;
--Testcase 262:
create cast (xfloat8 as bigint) without function;
--Testcase 263:
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.
--Testcase 264:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 265:
insert into testdata(bits) 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');
--Testcase 266:
select float8send(flt) as ibits,
flt
from (select bits::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- round-trip tests
begin;
--Testcase 267:
insert into testdata(bits) 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');
--Testcase 268:
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::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 269:
drop type xfloat8 cascade;
--Testcase 363:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/int4.sql
================================================
--
-- INT4 Based on PostgreSQL tests, please don't add additional tests here, use other test files
--
--Testcase 61:
CREATE EXTENSION sqlite_fdw;
--Testcase 62:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 63:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 64:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 2:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 3:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 4:
INSERT INTO INT4_TBL(f1) VALUES ('34.5');
-- largest and smallest values
--Testcase 5:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 6:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
-- bad input values -- should give errors
--Testcase 7:
INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
--Testcase 8:
INSERT INTO INT4_TBL(f1) VALUES ('asdf');
--Testcase 9:
INSERT INTO INT4_TBL(f1) VALUES (' ');
--Testcase 10:
INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
--Testcase 11:
INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
--Testcase 12:
INSERT INTO INT4_TBL(f1) VALUES ('123 5');
--Testcase 13:
INSERT INTO INT4_TBL(f1) VALUES ('');
--Testcase 14:
SELECT * FROM INT4_TBL;
-- Also try it with non-error-throwing API
--Testcase 137:
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_INT4(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 138:
INSERT INTO NON_ERROR_THROWING_API_INT4 VALUES ('34', 1), ('asdf', 2), ('1000000000000', 3);
--Testcase 139:
SELECT pg_input_is_valid(f1, 'int4') FROM NON_ERROR_THROWING_API_INT4 WHERE id = 1;
--Testcase 140:
SELECT pg_input_is_valid(f1, 'int4') FROM NON_ERROR_THROWING_API_INT4 WHERE id = 2;
--Testcase 141:
SELECT pg_input_is_valid(f1, 'int4') FROM NON_ERROR_THROWING_API_INT4 WHERE id = 3;
--Testcase 142:
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4 WHERE id = 3), 'int4');
--Testcase 15:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0';
--Testcase 16:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0';
--Testcase 17:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int2 '0';
--Testcase 18:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int4 '0';
--Testcase 19:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int2 '0';
--Testcase 20:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int4 '0';
--Testcase 21:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0';
--Testcase 22:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0';
--Testcase 23:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int2 '0';
--Testcase 24:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int4 '0';
--Testcase 25:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0';
--Testcase 26:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0';
-- positive odds
--Testcase 27:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
-- any evens
--Testcase 28:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
--Testcase 29:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i;
--Testcase 30:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 31:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i;
--Testcase 32:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 33:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i;
--Testcase 34:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 35:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i;
--Testcase 36:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 37:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i;
--Testcase 38:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 39:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i;
--Testcase 40:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 41:
SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i;
--Testcase 42:
SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i;
--
-- more complex expressions
--
-- variations on unary minus parsing
--Testcase 65:
DELETE FROM INT4_TMP;
--Testcase 66:
INSERT INTO INT4_TMP VALUES (-2, 3);
--Testcase 67:
SELECT f1 + f2 as one FROM INT4_TMP;
--Testcase 68:
DELETE FROM INT4_TMP;
--Testcase 69:
INSERT INTO INT4_TMP VALUES (4, 2);
--Testcase 70:
SELECT f1 - f2 as two FROM INT4_TMP;
--Testcase 46:
DELETE FROM INT4_TMP;
--Testcase 71:
INSERT INTO INT4_TMP VALUES (2, 1);
--Testcase 72:
SELECT f1- -f2 as three FROM INT4_TMP;
--Testcase 47:
DELETE FROM INT4_TMP;
--Testcase 73:
INSERT INTO INT4_TMP VALUES (2, 2);
--Testcase 74:
SELECT f1 - -f2 as four FROM INT4_TMP;
--Testcase 75:
DELETE FROM INT4_TMP;
--Testcase 76:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int2, '16'::int2 / '4'::int2);
--Testcase 77:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 78:
DELETE FROM INT4_TMP;
--Testcase 79:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int4, '16'::int2 / '4'::int4);
--Testcase 80:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 81:
DELETE FROM INT4_TMP;
--Testcase 82:
INSERT INTO INT4_TMP VALUES ('2'::int4 * '2'::int2, '16'::int4 / '4'::int2);
--Testcase 83:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 84:
DELETE FROM INT4_TMP;
--Testcase 85:
INSERT INTO INT4_TMP VALUES ('1000'::int4, '999'::int4);
--Testcase 86:
SELECT f1 < f2 AS false FROM INT4_TMP;
--Testcase 50:
DELETE FROM INT4_TMP;
--Testcase 91:
INSERT INTO INT4_TMP VALUES (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1);
--Testcase 92:
SELECT f1 as ten FROM INT4_TMP;
--Testcase 51:
DELETE FROM INT4_TMP;
--Testcase 93:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 94:
SELECT f1 + f1/f2 as three FROM INT4_TMP;
--Testcase 52:
DELETE FROM INT4_TMP;
--Testcase 95:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 96:
SELECT (f1 + f2)/f2 as two FROM INT4_TMP;
-- corner case
--Testcase 54:
DELETE FROM INT4_TMP;
--Testcase 97:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 98:
SELECT (f1<<31)::text FROM INT4_TMP;
--Testcase 56:
DELETE FROM INT4_TMP;
--Testcase 99:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 100:
SELECT ((f1<<31)+1)::text FROM INT4_TMP;
-- check sane handling of INT_MIN overflow cases
--Testcase 58:
DELETE FROM INT4_TMP;
--Testcase 101:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int4);
--Testcase 102:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 103:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 104:
SELECT f1 % f2 FROM INT4_TMP;
--Testcase 60:
DELETE FROM INT4_TMP;
--Testcase 105:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int2);
--Testcase 106:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 107:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 108:
SELECT f1 % f2 FROM INT4_TMP;
-- check rounding when casting from float
--Testcase 109:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 110:
DELETE FROM FLOAT8_TMP;
--Testcase 111:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 112:
SELECT f1 as x, f1::int4 as int4_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 113:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 114:
DELETE FROM NUMERIC_TMP;
--Testcase 115:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 116:
SELECT f1 as x, f1::int4 as int4_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 117:
DELETE FROM INT4_TMP;
--Testcase 118:
INSERT INTO INT4_TMP 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);
--Testcase 119:
SELECT f1, f2, gcd(f1, f2), gcd(f1, -f2), gcd(f2, f1), gcd(-f2, f1) FROM INT4_TMP;
--Testcase 120:
DELETE FROM INT4_TMP;
--Testcase 121:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 0::int4);
--Testcase 122:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 123:
DELETE FROM INT4_TMP;
--Testcase 124:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-2147483648)::int4);
--Testcase 125:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
-- test lcm()
--Testcase 126:
DELETE FROM INT4_TMP;
--Testcase 127:
INSERT INTO INT4_TMP 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);
--Testcase 128:
SELECT f1, f2, lcm(f1, f2), lcm(f1, -f2), lcm(f2, f1), lcm(-f2, f1) FROM INT4_TMP;
--Testcase 129:
DELETE FROM INT4_TMP;
--Testcase 130:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 1::int4);
--Testcase 131:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 132:
DELETE FROM INT4_TMP;
--Testcase 133:
INSERT INTO INT4_TMP VALUES (2147483647::int4, 2147483646::int4);
--Testcase 134:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
-- non-decimal literals
--Testcase 143:
CREATE FOREIGN TABLE special_case_int4 (f1 text, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 144:
INSERT INTO special_case_int4 VALUES ('0b100101'::int4);
--Testcase 145:
SELECT f1 FROM special_case_int4;
--Testcase 146:
DELETE FROM special_case_int4;
--Testcase 147:
INSERT INTO special_case_int4 VALUES ('0o273'::int4);
--Testcase 148:
SELECT f1 FROM special_case_int4;
--Testcase 149:
DELETE FROM special_case_int4;
--Testcase 150:
INSERT INTO special_case_int4 VALUES ('0x42F'::int4);
--Testcase 151:
SELECT f1 FROM special_case_int4;
--Testcase 152:
DELETE FROM special_case_int4;
--Testcase 153:
INSERT INTO special_case_int4 VALUES ('0b'::int4);
--Testcase 154:
SELECT f1 FROM special_case_int4;
--Testcase 155:
DELETE FROM special_case_int4;
--Testcase 156:
INSERT INTO special_case_int4 VALUES ('0x'::int4);
--Testcase 157:
SELECT f1 FROM special_case_int4;
--Testcase 158:
DELETE FROM special_case_int4;
--Testcase 159:
INSERT INTO special_case_int4 VALUES ('0x'::int4);
--Testcase 160:
SELECT f1 FROM special_case_int4;
-- cases near overflow
--Testcase 161:
DELETE FROM special_case_int4;
--Testcase 162:
INSERT INTO special_case_int4 VALUES ('0b1111111111111111111111111111111'::int4);
--Testcase 163:
SELECT f1 FROM special_case_int4;
--Testcase 164:
DELETE FROM special_case_int4;
--Testcase 165:
INSERT INTO special_case_int4 VALUES ('0b10000000000000000000000000000000'::int4);
--Testcase 166:
SELECT f1 FROM special_case_int4;
--Testcase 167:
DELETE FROM special_case_int4;
--Testcase 168:
INSERT INTO special_case_int4 VALUES ('0o17777777777'::int4);
--Testcase 169:
SELECT f1 FROM special_case_int4;
--Testcase 170:
DELETE FROM special_case_int4;
--Testcase 171:
INSERT INTO special_case_int4 VALUES ('0o20000000000'::int4);
--Testcase 172:
SELECT f1 FROM special_case_int4;
--Testcase 173:
DELETE FROM special_case_int4;
--Testcase 174:
INSERT INTO special_case_int4 VALUES ('0x7FFFFFFF'::int4);
--Testcase 175:
SELECT f1 FROM special_case_int4;
--Testcase 176:
DELETE FROM special_case_int4;
--Testcase 177:
INSERT INTO special_case_int4 VALUES ('0x80000000'::int4);
--Testcase 178:
SELECT f1 FROM special_case_int4;
--Testcase 179:
DELETE FROM special_case_int4;
--Testcase 180:
INSERT INTO special_case_int4 VALUES ('-0b10000000000000000000000000000000'::int4);
--Testcase 181:
SELECT f1 FROM special_case_int4;
--Testcase 182:
DELETE FROM special_case_int4;
--Testcase 183:
INSERT INTO special_case_int4 VALUES ('-0b10000000000000000000000000000001'::int4);
--Testcase 184:
SELECT f1 FROM special_case_int4;
--Testcase 185:
DELETE FROM special_case_int4;
--Testcase 186:
INSERT INTO special_case_int4 VALUES ('-0o20000000000'::int4);
--Testcase 187:
SELECT f1 FROM special_case_int4;
--Testcase 188:
DELETE FROM special_case_int4;
--Testcase 189:
INSERT INTO special_case_int4 VALUES ('-0o20000000001'::int4);
--Testcase 190:
SELECT f1 FROM special_case_int4;
--Testcase 191:
DELETE FROM special_case_int4;
--Testcase 192:
INSERT INTO special_case_int4 VALUES ('-0x80000000'::int4);
--Testcase 193:
SELECT f1 FROM special_case_int4;
--Testcase 194:
DELETE FROM special_case_int4;
--Testcase 195:
INSERT INTO special_case_int4 VALUES ('-0x80000001'::int4);
--Testcase 196:
SELECT f1 FROM special_case_int4;
-- underscores
--Testcase 197:
DELETE FROM special_case_int4;
--Testcase 198:
INSERT INTO special_case_int4 VALUES ('1_000_000'::int4);
--Testcase 199:
SELECT f1 FROM special_case_int4;
--Testcase 200:
DELETE FROM special_case_int4;
--Testcase 201:
INSERT INTO special_case_int4 VALUES ('1_2_3'::int4);
--Testcase 202:
SELECT f1 FROM special_case_int4;
--Testcase 203:
DELETE FROM special_case_int4;
--Testcase 204:
INSERT INTO special_case_int4 VALUES ('0x1EEE_FFFF'::int4);
--Testcase 205:
SELECT f1 FROM special_case_int4;
--Testcase 206:
DELETE FROM special_case_int4;
--Testcase 207:
INSERT INTO special_case_int4 VALUES ('0o2_73'::int4);
--Testcase 208:
SELECT f1 FROM special_case_int4;
--Testcase 209:
DELETE FROM special_case_int4;
--Testcase 210:
INSERT INTO special_case_int4 VALUES ('0b_10_0101'::int4);
--Testcase 211:
SELECT f1 FROM special_case_int4;
-- error cases
--Testcase 212:
DELETE FROM special_case_int4;
--Testcase 213:
INSERT INTO special_case_int4 VALUES ('_100'::int4);
--Testcase 214:
SELECT f1 FROM special_case_int4;
--Testcase 215:
DELETE FROM special_case_int4;
--Testcase 216:
INSERT INTO special_case_int4 VALUES ('100_'::int4);
--Testcase 217:
SELECT f1 FROM special_case_int4;
--Testcase 218:
DELETE FROM special_case_int4;
--Testcase 219:
INSERT INTO special_case_int4 VALUES ('100__000'::int4);
--Testcase 220:
SELECT f1 FROM special_case_int4;
--Testcase 221:
DELETE FROM INT4_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 135:
DROP SERVER sqlite_svr;
--Testcase 136:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/int8.sql
================================================
--
-- INT8
-- Test int8 64-bit integers.
--
--Testcase 140:
CREATE EXTENSION sqlite_fdw;
--Testcase 141:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 142:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 143:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 2:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 3:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 4:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 5:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
-- bad inputs
--Testcase 6:
INSERT INTO INT8_TBL(q1) VALUES (' ');
--Testcase 7:
INSERT INTO INT8_TBL(q1) VALUES ('xxx');
--Testcase 8:
INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485');
--Testcase 9:
INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934');
--Testcase 10:
INSERT INTO INT8_TBL(q1) VALUES ('- 123');
--Testcase 11:
INSERT INTO INT8_TBL(q1) VALUES (' 345 5');
--Testcase 12:
INSERT INTO INT8_TBL(q1) VALUES ('');
--Testcase 13:
SELECT * FROM INT8_TBL;
-- Also try it with non-error-throwing API
--Testcase 251:
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_INT8(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 252:
INSERT INTO NON_ERROR_THROWING_API_INT8 VALUES ('34', 1), ('asdf', 2), ('10000000000000000000', 3);
--Testcase 253:
SELECT pg_input_is_valid(f1, 'int8') FROM NON_ERROR_THROWING_API_INT8 WHERE id = 1;
--Testcase 254:
SELECT pg_input_is_valid(f1, 'int8') FROM NON_ERROR_THROWING_API_INT8 WHERE id = 2;
--Testcase 255:
SELECT pg_input_is_valid(f1, 'int8') FROM NON_ERROR_THROWING_API_INT8 WHERE id = 3;
--Testcase 256:
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT8 WHERE id = 3), 'int8');
-- int8/int8 cmp
--Testcase 14:
SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
--Testcase 15:
SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
--Testcase 16:
SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
--Testcase 17:
SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
--Testcase 18:
SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
--Testcase 19:
SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
-- int8/int4 cmp
--Testcase 20:
SELECT * FROM INT8_TBL WHERE q2 = 456;
--Testcase 21:
SELECT * FROM INT8_TBL WHERE q2 <> 456;
--Testcase 22:
SELECT * FROM INT8_TBL WHERE q2 < 456;
--Testcase 23:
SELECT * FROM INT8_TBL WHERE q2 > 456;
--Testcase 24:
SELECT * FROM INT8_TBL WHERE q2 <= 456;
--Testcase 25:
SELECT * FROM INT8_TBL WHERE q2 >= 456;
-- int4/int8 cmp
--Testcase 26:
SELECT * FROM INT8_TBL WHERE 123 = q1;
--Testcase 27:
SELECT * FROM INT8_TBL WHERE 123 <> q1;
--Testcase 28:
SELECT * FROM INT8_TBL WHERE 123 < q1;
--Testcase 29:
SELECT * FROM INT8_TBL WHERE 123 > q1;
--Testcase 30:
SELECT * FROM INT8_TBL WHERE 123 <= q1;
--Testcase 31:
SELECT * FROM INT8_TBL WHERE 123 >= q1;
-- int8/int2 cmp
--Testcase 32:
SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
--Testcase 33:
SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
--Testcase 34:
SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
--Testcase 35:
SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
--Testcase 36:
SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
--Testcase 37:
SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
-- int2/int8 cmp
--Testcase 38:
SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
--Testcase 39:
SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
--Testcase 40:
SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
--Testcase 41:
SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
--Testcase 42:
SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
--Testcase 43:
SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
--Testcase 44:
SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL;
--Testcase 45:
SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL;
--Testcase 46:
SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL;
--Testcase 47:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
--Testcase 48:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL
WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
--Testcase 49:
SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
--Testcase 50:
SELECT q1, float8(q1) FROM INT8_TBL;
--Testcase 51:
SELECT q2, float8(q2) FROM INT8_TBL;
--Testcase 52:
SELECT 37 + q1 AS plus4 FROM INT8_TBL;
--Testcase 53:
SELECT 37 - q1 AS minus4 FROM INT8_TBL;
--Testcase 54:
SELECT 2 * q1 AS "twice int4" FROM INT8_TBL;
--Testcase 55:
SELECT q1 * 2 AS "twice int4" FROM INT8_TBL;
-- int8 op int4
--Testcase 56:
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
--Testcase 57:
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
--Testcase 58:
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
--Testcase 59:
SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
--Testcase 60:
SELECT q2, abs(q2) FROM INT8_TBL;
--Testcase 61:
SELECT min(q1), min(q2) FROM INT8_TBL;
--Testcase 62:
SELECT max(q1), max(q2) FROM INT8_TBL;
-- TO_CHAR()
--
--Testcase 63:
SELECT to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999')
FROM INT8_TBL;
--Testcase 64:
SELECT to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999')
FROM INT8_TBL;
--Testcase 65:
SELECT to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR')
FROM INT8_TBL;
--Testcase 66:
SELECT to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999')
FROM INT8_TBL;
--Testcase 67:
SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL;
--Testcase 68:
SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL;
--Testcase 69:
SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL;
--Testcase 70:
SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL;
--Testcase 71:
SELECT to_char(q2, '0999999999999999') FROM INT8_TBL;
--Testcase 72:
SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL;
--Testcase 73:
SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL;
--Testcase 74:
SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL;
--Testcase 75:
SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL;
--Testcase 76:
SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL;
--Testcase 77:
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;
--Testcase 78:
SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
--Testcase 79:
SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL;
-- check min/max values and overflow behavior
--Testcase 80:
DELETE FROM INT8_TMP;
--Testcase 144:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 145:
SELECT q1 FROM INT8_TMP;
--Testcase 81:
DELETE FROM INT8_TMP;
--Testcase 146:
INSERT INTO INT8_TMP VALUES ('-9223372036854775809'::int8);
--Testcase 147:
SELECT q1 FROM INT8_TMP;
--Testcase 82:
DELETE FROM INT8_TMP;
--Testcase 148:
INSERT INTO INT8_TMP VALUES ('9223372036854775807'::int8);
--Testcase 149:
SELECT q1 FROM INT8_TMP;
--Testcase 83:
DELETE FROM INT8_TMP;
--Testcase 150:
INSERT INTO INT8_TMP VALUES ('9223372036854775808'::int8);
--Testcase 151:
SELECT q1 FROM INT8_TMP;
--Testcase 84:
DELETE FROM INT8_TMP;
--Testcase 152:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775807'::int8));
--Testcase 153:
SELECT q1 FROM INT8_TMP;
--Testcase 86:
DELETE FROM INT8_TMP;
--Testcase 154:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775808'::int8));
--Testcase 155:
SELECT q1 FROM INT8_TMP;
--Testcase 87:
DELETE FROM INT8_TMP;
--Testcase 156:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 157:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 88:
DELETE FROM INT8_TMP;
--Testcase 158:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 159:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 89:
DELETE FROM INT8_TMP;
--Testcase 160:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 161:
SELECT q1-q2 FROM INT8_TMP;
--Testcase 90:
DELETE FROM INT8_TMP;
--Testcase 162:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 163:
SELECT q1 - q2 FROM INT8_TMP;
--Testcase 91:
DELETE FROM INT8_TMP;
--Testcase 164:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 165:
SELECT q1 * q2 FROM INT8_TMP;
--Testcase 92:
DELETE FROM INT8_TMP;
--Testcase 166:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 167:
SELECT q1 / q2 FROM INT8_TMP;
--Testcase 93:
DELETE FROM INT8_TMP;
--Testcase 168:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 169:
SELECT q1 % q2 FROM INT8_TMP;
--Testcase 94:
DELETE FROM INT8_TMP;
--Testcase 170:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 171:
SELECT abs(q1) FROM INT8_TMP;
--Testcase 95:
DELETE FROM INT8_TMP;
--Testcase 172:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 173:
SELECT q1 + q3 FROM INT8_TMP;
--Testcase 96:
DELETE FROM INT8_TMP;
--Testcase 174:
INSERT INTO INT8_TMP(q1, q3) VALUES ('-9223372036854775800'::int8 , '100'::int4);
--Testcase 175:
SELECT q1 - q3 FROM INT8_TMP;
--Testcase 97:
DELETE FROM INT8_TMP;
--Testcase 176:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 177:
SELECT q1 * q3 FROM INT8_TMP;
--Testcase 98:
DELETE FROM INT8_TMP;
--Testcase 178:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 179:
SELECT q3 + q1 FROM INT8_TMP;
--Testcase 99:
DELETE FROM INT8_TMP;
--Testcase 180:
INSERT INTO INT8_TMP(q3, q1) VALUES ('-100'::int4 , '9223372036854775800'::int8);
--Testcase 181:
SELECT q3 - q1 FROM INT8_TMP;
--Testcase 100:
DELETE FROM INT8_TMP;
--Testcase 182:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 183:
SELECT q3 * q1 FROM INT8_TMP;
--Testcase 101:
DELETE FROM INT8_TMP;
--Testcase 184:
INSERT INTO INT8_TMP(q1, q4) VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 185:
SELECT q1 + q4 FROM INT8_TMP;
--Testcase 102:
DELETE FROM INT8_TMP;
--Testcase 186:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775800'::int8 , '100'::int2);
--Testcase 187:
SELECT q1 - q4 FROM INT8_TMP;
--Testcase 103:
DELETE FROM INT8_TMP;
--Testcase 188:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 189:
SELECT q1 * q4 FROM INT8_TMP;
--Testcase 104:
DELETE FROM INT8_TMP;
--Testcase 190:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775808'::int8 , '0'::int2);
--Testcase 191:
SELECT q1 / q4 FROM INT8_TMP;
--Testcase 105:
DELETE FROM INT8_TMP;
--Testcase 192:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 193:
SELECT q4 + q1 FROM INT8_TMP;
--Testcase 106:
DELETE FROM INT8_TMP;
--Testcase 194:
INSERT INTO INT8_TMP(q4, q1) VALUES ('-100'::int2 , '9223372036854775800'::int8);
--Testcase 195:
SELECT q4 - q1 FROM INT8_TMP;
--Testcase 107:
DELETE FROM INT8_TMP;
--Testcase 196:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 197:
SELECT q4 * q1 FROM INT8_TMP;
--Testcase 108:
DELETE FROM INT8_TMP;
--Testcase 198:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '0'::int8);
--Testcase 199:
SELECT q4 / q1 FROM INT8_TMP;
--Testcase 110:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
--Testcase 111:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
--Testcase 112:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
--Testcase 113:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
--Testcase 200:
DELETE FROM INT8_TMP;
--Testcase 201:
INSERT INTO INT8_TMP(q5) VALUES ('42'), ('-37');
--Testcase 202:
SELECT CAST(q5::int2 as int8) FROM INT8_TMP;
--Testcase 114:
SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
--Testcase 203:
DELETE FROM INT8_TMP;
--Testcase 204:
INSERT INTO INT8_TMP(q5) VALUES ('36854775807.0');
--Testcase 205:
SELECT CAST(q5::float4 AS int8) FROM INT8_TMP;
--Testcase 206:
DELETE FROM INT8_TMP;
--Testcase 207:
INSERT INTO INT8_TMP(q5) VALUES ('922337203685477580700.0');
--Testcase 208:
SELECT CAST(q5::float8 AS int8) FROM INT8_TMP;
--Testcase 115:
SELECT CAST(q1 AS oid) FROM INT8_TBL;
--Testcase 209:
SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
-- bit operations
--Testcase 116:
SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
--Testcase 117:
SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
-- generate_series
--Testcase 118:
DELETE FROM INT8_TMP;
--Testcase 210:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8) q1;
--Testcase 211:
SELECT q1 FROM INT8_TMP;
--Testcase 120:
DELETE FROM INT8_TMP;
--Testcase 212:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0) q1; -- should error
--Testcase 213:
SELECT q1 FROM INT8_TMP;
--Testcase 122:
DELETE FROM INT8_TMP;
--Testcase 214:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2) q1;
--Testcase 215:
SELECT q1 FROM INT8_TMP;
-- corner case
--Testcase 216:
DELETE FROM INT8_TMP;
--Testcase 217:
INSERT INTO INT8_TMP VALUES (-1::int8<<63);
--Testcase 218:
SELECT q1::text FROM INT8_TMP;
--Testcase 219:
DELETE FROM INT8_TMP;
--Testcase 220:
INSERT INTO INT8_TMP VALUES ((-1::int8<<63)+1);
--Testcase 221:
SELECT q1::text FROM INT8_TMP;
-- check sane handling of INT64_MIN overflow cases
--Testcase 125:
DELETE FROM INT8_TMP;
--Testcase 222:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int8, 888);
--Testcase 126:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int8, 888);
--Testcase 127:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int8, 888);
--Testcase 128:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 129:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 130:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int4, 888);
--Testcase 131:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int4, 888);
--Testcase 132:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int4, 888);
--Testcase 133:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 134:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 135:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int2, 888);
--Testcase 136:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int2, 888);
--Testcase 137:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int2, 888);
--Testcase 138:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 139:
DELETE FROM INT8_TMP WHERE q2 = 888;
-- check rounding when casting from float
--Testcase 223:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 224:
DELETE FROM FLOAT8_TMP;
--Testcase 225:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 226:
SELECT f1 as x, f1::int8 as int8_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 227:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 228:
DELETE FROM NUMERIC_TMP;
--Testcase 229:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 230:
SELECT f1 as x, f1::int8 as int8_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 231:
DELETE FROM INT8_TMP;
--Testcase 232:
INSERT INTO INT8_TMP 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);
--Testcase 233:
SELECT q1, q2, gcd(q1, q2), gcd(q1, -q2), gcd(q2, q1), gcd(-q2, q1) FROM INT8_TMP;
--Testcase 234:
DELETE FROM INT8_TMP;
--Testcase 235:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 0::int8);
--Testcase 236:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 237:
DELETE FROM INT8_TMP;
--Testcase 238:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, (-9223372036854775808)::int8);
--Testcase 239:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
-- test lcm()
--Testcase 240:
DELETE FROM INT8_TMP;
--Testcase 241:
INSERT INTO INT8_TMP 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);
--Testcase 242:
SELECT q1, q2, lcm(q1, q2), lcm(q1, -q2), lcm(q2, q1), lcm(-q2, q1) FROM INT8_TMP;
--Testcase 243:
DELETE FROM INT8_TMP;
--Testcase 244:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 1::int8);
--Testcase 245:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 246:
DELETE FROM INT8_TMP;
--Testcase 247:
INSERT INTO INT8_TMP VALUES ((9223372036854775807)::int8, (9223372036854775806)::int8);
--Testcase 248:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
-- non-decimal literals
--Testcase 257:
CREATE FOREIGN TABLE special_case_int8 (f1 text, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 258:
INSERT INTO special_case_int8 VALUES ('0b100101'::int8);
--Testcase 259:
SELECT f1 FROM special_case_int8;
--Testcase 260:
DELETE FROM special_case_int8;
--Testcase 261:
INSERT INTO special_case_int8 VALUES ('0o273'::int8);
--Testcase 262:
SELECT f1 FROM special_case_int8;
--Testcase 263:
DELETE FROM special_case_int8;
--Testcase 264:
INSERT INTO special_case_int8 VALUES ('0x42F'::int8);
--Testcase 265:
SELECT f1 FROM special_case_int8;
--Testcase 266:
DELETE FROM special_case_int8;
--Testcase 267:
INSERT INTO special_case_int8 VALUES ('0b'::int8);
--Testcase 268:
SELECT f1 FROM special_case_int8;
--Testcase 269:
DELETE FROM special_case_int8;
--Testcase 270:
INSERT INTO special_case_int8 VALUES ('0o'::int8);
--Testcase 271:
SELECT f1 FROM special_case_int8;
--Testcase 272:
DELETE FROM special_case_int8;
--Testcase 273:
INSERT INTO special_case_int8 VALUES ('0x'::int8);
--Testcase 274:
SELECT f1 FROM special_case_int8;
-- cases near overflow
--Testcase 275:
DELETE FROM special_case_int8;
--Testcase 276:
INSERT INTO special_case_int8 VALUES ('0b111111111111111111111111111111111111111111111111111111111111111'::int8);
--Testcase 277:
SELECT f1 FROM special_case_int8;
--Testcase 278:
DELETE FROM special_case_int8;
--Testcase 279:
INSERT INTO special_case_int8 VALUES ('0b1000000000000000000000000000000000000000000000000000000000000000'::int8);
--Testcase 280:
SELECT f1 FROM special_case_int8;
--Testcase 281:
DELETE FROM special_case_int8;
--Testcase 282:
INSERT INTO special_case_int8 VALUES ('0o777777777777777777777'::int8);
--Testcase 283:
SELECT f1 FROM special_case_int8;
--Testcase 284:
DELETE FROM special_case_int8;
--Testcase 285:
INSERT INTO special_case_int8 VALUES ('0o1000000000000000000000'::int8);
--Testcase 286:
SELECT f1 FROM special_case_int8;
--Testcase 287:
DELETE FROM special_case_int8;
--Testcase 288:
INSERT INTO special_case_int8 VALUES ('0x7FFFFFFFFFFFFFFF'::int8);
--Testcase 289:
SELECT f1 FROM special_case_int8;
--Testcase 290:
DELETE FROM special_case_int8;
--Testcase 291:
INSERT INTO special_case_int8 VALUES ('0x8000000000000000'::int8);
--Testcase 292:
SELECT f1 FROM special_case_int8;
--Testcase 293:
DELETE FROM special_case_int8;
--Testcase 294:
INSERT INTO special_case_int8 VALUES ('-0b1000000000000000000000000000000000000000000000000000000000000000'::int8);
--Testcase 295:
SELECT f1 FROM special_case_int8;
--Testcase 296:
DELETE FROM special_case_int8;
--Testcase 297:
INSERT INTO special_case_int8 VALUES ('-0b1000000000000000000000000000000000000000000000000000000000000001'::int8);
--Testcase 298:
SELECT f1 FROM special_case_int8;
--Testcase 299:
DELETE FROM special_case_int8;
--Testcase 300:
INSERT INTO special_case_int8 VALUES ('-0o1000000000000000000000'::int8);
--Testcase 301:
SELECT f1 FROM special_case_int8;
--Testcase 302:
DELETE FROM special_case_int8;
--Testcase 303:
INSERT INTO special_case_int8 VALUES ('-0o1000000000000000000001'::int8);
--Testcase 304:
SELECT f1 FROM special_case_int8;
--Testcase 305:
DELETE FROM special_case_int8;
--Testcase 306:
INSERT INTO special_case_int8 VALUES ('-0x8000000000000000'::int8);
--Testcase 307:
SELECT f1 FROM special_case_int8;
--Testcase 308:
DELETE FROM special_case_int8;
--Testcase 309:
INSERT INTO special_case_int8 VALUES ('-0x8000000000000001'::int8);
--Testcase 310:
SELECT f1 FROM special_case_int8;
-- underscores
--Testcase 311:
DELETE FROM special_case_int8;
--Testcase 312:
INSERT INTO special_case_int8 VALUES ('1_000_000'::int8);
--Testcase 313:
SELECT f1 FROM special_case_int8;
--Testcase 314:
DELETE FROM special_case_int8;
--Testcase 315:
INSERT INTO special_case_int8 VALUES ('1_2_3'::int8);
--Testcase 316:
SELECT f1 FROM special_case_int8;
--Testcase 317:
DELETE FROM special_case_int8;
--Testcase 318:
INSERT INTO special_case_int8 VALUES ('0x1EEE_FFFF'::int8);
--Testcase 319:
SELECT f1 FROM special_case_int8;
--Testcase 320:
DELETE FROM special_case_int8;
--Testcase 321:
INSERT INTO special_case_int8 VALUES ('0o2_73'::int8);
--Testcase 322:
SELECT f1 FROM special_case_int8;
--Testcase 323:
DELETE FROM special_case_int8;
--Testcase 324:
INSERT INTO special_case_int8 VALUES ('0b_10_0101'::int8);
--Testcase 325:
SELECT f1 FROM special_case_int8;
-- error cases
--Testcase 326:
DELETE FROM special_case_int8;
--Testcase 327:
INSERT INTO special_case_int8 VALUES ('_100'::int8);
--Testcase 328:
SELECT f1 FROM special_case_int8;
--Testcase 329:
DELETE FROM special_case_int8;
--Testcase 330:
INSERT INTO special_case_int8 VALUES ('100_'::int8);
--Testcase 331:
SELECT f1 FROM special_case_int8;
--Testcase 332:
DELETE FROM special_case_int8;
--Testcase 333:
INSERT INTO special_case_int8 VALUES ('100__000'::int8);
--Testcase 334:
SELECT f1 FROM special_case_int8;
--Testcase 335:
DELETE FROM INT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 249:
DROP SERVER sqlite_svr;
--Testcase 250:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/json.sql
================================================
-- SET log_min_messages TO DEBUG3;
-- SET client_min_messages TO DEBUG3;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 010:
CREATE FOREIGN TABLE "type_JSON" (
"i" int OPTIONS (key 'true'),
"j" json,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" json
) SERVER sqlite_svr OPTIONS (table 'type_JSON');
--Testcase 011:
CREATE FOREIGN TABLE "type_JSONB" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB');
--Testcase 012:
CREATE FOREIGN TABLE "type_JSONB+" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
l int, t varchar(16), tx text,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB+');
--Testcase 013:
INSERT INTO "type_JSON" ("i", "j", ot, ot1, oi, oi1) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}],"a+u":47,"5":true,"cc3":["a", "b", "c"], "c3":[true, false]}',
'c', 'c3', 2, 1),
(2, '[11,22,33,44,55,66,77,88,99,10,11,12,13,14]',
'1', '29', 3, 1),
(3, '{"a":"xyz", "π":3.1415926535, "aπ":false }',
'a', 'π', 1, NULL),
(4, '{"a":null, "a22":22.0, "a2":2 }',
'a', '22', 4, NULL),
(5, '[9,null,7,6,5,4,3,2,1,0]',
'1', '5', -4, 5),
(6, '[0.0,1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,null,true]',
'1', '21', -2, 5);
--Testcase 014:
INSERT INTO "type_JSONB" SELECT * FROM "type_JSON";
--Testcase 015: check some SQLite JSONb initial bytes
SELECT i, tx FROM "type_JSONB+";
--Testcase 020:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 021: SQLite queries to type_JSON will be without normalization for j column
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN j OPTIONS (ADD column_type 'text');
--Testcase 022:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 023:
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 024:
SELECT "i", "j", j."j"->'a' res FROM "type_JSON" j;
--Testcase 025:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 026:
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 027:
SELECT "i", "j", j."j"->'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 028:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 029:
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 030:
SELECT "i", "j", j."j"->>'a' res FROM "type_JSON" j;
--Testcase 031:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 032:
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 033:
SELECT "i", "j", j."j"->>'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 034:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 035:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 036:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 037:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 038:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 039:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 040:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 041:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 042:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 044:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 045:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 046:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 047:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 048:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSON" j;
--Testcase 049:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 050:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 051:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSONB" j;
--Testcase 052:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 053:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 054:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSON" j;
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 056:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 057:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSONB" j;
--Testcase 058:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 059:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 060:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 061:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 062:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 063:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 064:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 065:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 066:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 067:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 068:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 069:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 071:
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 072:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 073:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 074:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 075:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 077:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 078:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 079:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 081:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 082:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 083:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 085:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 086:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 087:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 088:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 089:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 090:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 091:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 093:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 095:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 096:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 097:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 099:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
-- extraction with arithmetical an other expressions
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 101:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 103:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 105:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 107:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 109:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 111:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 113:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 115:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 117:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 119:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 120:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 121:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 123:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 125:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 127:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 129:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 131:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 133:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 135:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 137:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 139:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 141:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 143:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 144:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 145:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 146:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 147:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 148:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 149:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 151:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 153:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 155:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 157:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 159:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 161:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 163:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 165:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 167:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 169:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 171:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 172:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 173:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 174:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 175:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 176:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 177:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 178:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 179:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--TCs for SQLite JSON -> format, no sense in PostgreSQL itself
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 201:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 203:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 204:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 205:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 206:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 207:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 208:
DELETE FROM "type_JSON";
--Testcase 209:
DELETE FROM "type_JSONB";
--Testcase 210:
INSERT INTO "type_JSON" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 211:
INSERT INTO "type_JSONB" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 212:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 213:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 214:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 215:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 216:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 217:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 218:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 219:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 220:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 221:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 222:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 223:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 224:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 225:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 226:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
--Testcase 227:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
-- end of SQLite right -> ->> operand test
-- Operators -> ->> in SELECT context
--Testcase 230:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 231:
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 232:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 233:
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 234:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 235:
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 236:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 237:
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 238:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 239:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 240:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 241:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 250:
DELETE FROM "type_JSON";
--Testcase 251:
DELETE FROM "type_JSONB";
--Testcase 252:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text;
--Testcase 253:
INSERT INTO "type_JSON" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 254:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text[];
--Testcase 255:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text;
--Testcase 256:
INSERT INTO "type_JSONB" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 257:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text[];
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 261:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 262:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 263:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 265
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 267:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 269:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 270:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 271:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 272:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 273
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 274:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 275:
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 276:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 277: no such - even wrong JSON gives false
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 278:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 279:
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 280:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 281: no such - even wrong JSON gives false
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 282:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 283:
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 284:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 285: no such
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 286:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 287:
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 288:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 289: no such
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 290:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 291:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 292:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 293:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 294:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 295:
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 296:
SELECT * FROM "type_JSONB+";
--Testcase 297:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 298:
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 299:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Testcase 300: no such
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Multievel extraction chains
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 302:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 304:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 306:
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
--Testcase 308:
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
-- UPDATE tests
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 310:
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 311:
SELECT * FROM "type_JSON" WHERE "i" = 1;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 313:
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 314:
SELECT * FROM "type_JSONB+" WHERE "i" = 1;
-- Real GIS data test, data from https://www.wikidata.org/wiki/Q118122043
-- https://commons.wikimedia.org/wiki/Category:Private_Garden_(Pavlovsk)
-- License of testing data in json_osm_test table: ODbL, © OpenStreetMap contributors
--Testcase 400:
CREATE FOREIGN TABLE json_osm_test (
wkt text NOT NULL,
osm_type varchar(8) OPTIONS (key 'true') NOT NULL,
osm_id int8 OPTIONS (key 'true') NOT NULL,
t json OPTIONS (column_name 'tags') NULL,
way_nodes text NULL
) SERVER sqlite_svr;
--Testcase 401:
INSERT INTO json_osm_test VALUES ('SRID=4326;POINT(30.4536193 59.6847624)', 'node', 1198356775, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4522474 59.6851858)', 'node', 1198357028, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4532025 59.6850113)', 'node', 1738381537, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "description": "Ваза в дендрарии Собственного садика", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529584 59.6849417)', 'node', 3968068680, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526407 59.68497)', 'node', 4487385447, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "late C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4524943 59.6854502)', 'node', 4912270255, '{"fee": "yes", "access": "customers", "barrier": "gate", "vehicle": "no", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "barrier:personnel": "additional"}', NULL),
('SRID=4326;POINT(30.452977 59.6847621)', 'node', 7484858507, '{"name": "Неизвестный мужчина", "ref:okn": "781610399040516", "tourism": "artwork", "alt_name": "Спутник Одиссея", "heritage": "2", "historic": "yes", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6522/"}', NULL),
('SRID=4326;POINT(30.452909 59.6847573)', 'node', 7484858508, '{"name": "Антиной", "ref:okn": "781610399040526", "tourism": "artwork", "alt_name": "Дионис", "heritage": "2", "historic": "yes", "material": "stone", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6521/"}', NULL),
('SRID=4326;POINT(30.4529561 59.6848095)', 'node', 8114975053, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528946 59.6848042)', 'node', 8114975054, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528732 59.6848762)', 'node', 8114975055, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529364 59.6848802)', 'node', 8114975056, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528444 59.6851765)', 'node', 8289295956, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527798 59.6851726)', 'node', 8289295957, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528665 59.6850957)', 'node', 8289295958, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528046 59.685091)', 'node', 8289295959, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528947 59.6850172)', 'node', 8289295960, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528301 59.6850118)', 'node', 8289295961, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529101 59.6849636)', 'node', 8289295962, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528496 59.684959)', 'node', 8289295963, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528359 59.6852187)', 'node', 8331430659, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527605 59.685213)', 'node', 8331430660, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4523414 59.6851726)', 'node', 8331430663, '{"name": "Сатир", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4523561 59.685141)', 'node', 8331430664, '{"name": "Сатиресса", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4527994 59.6847007)', 'node', 8566916332, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4528945 59.6847497)', 'node', 8566916333, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529784 59.6853519)', 'node', 8895996426, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4529255 59.6853861)', 'node', 8895996427, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4525278 59.685471)', 'node', 8895996643, '{"genus": "Tilia", "height": "6", "natural": "tree", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4534153 59.6851412)', 'node', 8899249758, '{"genus": "Elaeagnus", "taxon": "Elaeagnus commutata", "natural": "shrub", "genus:ru": "Лох", "taxon:ru": "Лох серебристый", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4535524 59.6848638)', 'node', 8899249764, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4535202 59.6849613)', 'node', 8899249765, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534934 59.6850486)', 'node', 8899249766, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534679 59.685136)', 'node', 8899249767, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4528899 59.6851725)', 'node', 8899249768, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530448 59.6850046)', 'node', 8899249769, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4533465 59.6850216)', 'node', 8899249770, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4532205 59.6849417)', 'node', 8899249771, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531776 59.6850839)', 'node', 8899249772, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4534136 59.6851265)', 'node', 8899249773, '{"genus": "Malus", "taxon": "Malus niedzwetzkyana", "height": "5", "natural": "tree", "genus:ru": "Яблоня", "taxon:ru": "Яблоня Недзвецкого", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533043 59.6851928)', 'node', 8899249779, '{"height": "4", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.452916 59.6849894)', 'node', 8899249796, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4528248 59.684983)', 'node', 8899249797, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531527 59.685139)', 'node', 8899299127, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529549 59.6850382)', 'node', 8902082041, '{"genus": "Syrínga", "taxon": "Syringa vulgaris", "natural": "shrub", "genus:ru": "Сирень", "taxon:ru": "Сирень обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530139 59.6850101)', 'node', 8902082042, '{"genus": "Amelanchier", "taxon": "Amelanchier canadensis", "natural": "shrub", "genus:ru": "Ирга", "taxon:ru": "Ирга канадская", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530089 59.6850564)', 'node', 8902082048, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529982 59.685072)', 'node', 8902082055, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530213 59.6850872)', 'node', 8902082060, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529918 59.6851617)', 'node', 8902082061, '{"genus": "Berberis", "taxon": "Berberis vulgaris", "natural": "shrub", "genus:ru": "Барбарис", "taxon:ru": "Барбарис обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530615 59.685137)', 'node', 8902082071, '{"genus": "Paeonia", "taxon": "Paeonia suffruticosa", "natural": "shrub", "genus:ru": "Пион", "taxon:ru": "Пион древовидный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531031 59.6851282)', 'node', 8902082072, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530991 59.6851451)', 'node', 8902082073, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531977 59.6851532)', 'node', 8902082074, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453207 59.6851336)', 'node', 8902082075, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532426 59.6850926)', 'node', 8902082171, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532694 59.6851157)', 'node', 8902082172, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533707 59.6851035)', 'node', 8902082173, '{"genus": "Hydrangea", "taxon": "Hydrangea paniculata", "natural": "shrub", "genus:ru": "Гортензия", "taxon:ru": "Гортензия метельчатая"}', NULL),
('SRID=4326;POINT(30.4528986 59.6851502)', 'node', 8902082174, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4530486 59.6848994)', 'node', 8904992674, '{"genus": "Viburnum", "taxon": "Viburnum opulus", "natural": "shrub", "genus:ru": "Калина", "taxon:ru": "Калина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532396 59.6848373)', 'node', 8905335421, '{"genus": "Corylus", "taxon": "Corylus avellana", "natural": "shrub", "genus:ru": "Лещина", "taxon:ru": "Лещина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532946 59.684841)', 'node', 8905335422, '{"genus": "Spiraea", "taxon": "Spiraea chamaedryfolia", "natural": "shrub", "genus:ru": "Спирея", "taxon:ru": "Спирея дубравколистная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533857 59.6849271)', 'node', 8905335423, '{"genus": "Euonymus", "taxon": "Euonymus europaeus", "natural": "shrub", "genus:ru": "Бересклет", "taxon:ru": "Бересклет европейский", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534136 59.6849004)', 'node', 8905335424, '{"genus": "Prunus", "taxon": "Prunus sachalinensis", "height": "5", "natural": "tree", "genus:ru": "Вишня", "taxon:ru": "Вишня сахалинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533998 59.6848611)', 'node', 8905335425, '{"genus": "Buxus", "taxon": "Buxus sempervirens", "height": "1", "natural": "shrub", "genus:ru": "Самшит", "taxon:ru": "Самшит вечнозелёный", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4534776 59.6848679)', 'node', 8905335426, '{"genus": "Rhamnus", "taxon": "Rhamnus cathartica", "height": "4", "natural": "tree", "genus:ru": "Жостер", "taxon:ru": "Жостер слабительный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534324 59.6849515)', 'node', 8905335427, '{"genus": "Lonicera", "taxon": "Lonicera caerulea", "natural": "shrub", "genus:ru": "Жимолость", "taxon:ru": "Жимолость синяя", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453365 59.684981)', 'node', 8905335428, '{"genus": "Philadelphus", "taxon": "Philadelphus coronarius", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник венечный"}', NULL),
('SRID=4326;POINT(30.4533874 59.6849671)', 'node', 8905335429, '{"genus": "Juniperus", "taxon": "Juniperus sabina", "height": "0.5", "natural": "shrub", "genus:ru": "Можжевельник", "taxon:ru": "Можжевельник казацкий", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4531319 59.6849356)', 'node', 8905335430, '{"genus": "Picea", "taxon": "Picea abies", "height": "0.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель европейская", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532466 59.6848527)', 'node', 8905335431, '{"genus": "Ginkgo", "taxon": "Ginkgo biloba", "height": "2.5", "natural": "tree", "genus:ru": "Гингко", "taxon:ru": "Гинкго двулопастный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "label"}', NULL),
('SRID=4326;POINT(30.4532184 59.6848635)', 'node', 8905335468, '{"genus": "Daphne", "taxon": "Daphne mezereum", "natural": "shrub", "genus:ru": "Волчеягодник", "taxon:ru": "Волчеягодник обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532392 59.6848902)', 'node', 8905335469, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526679 59.6846912)', 'node', 8905558225, '{"height": "3", "highway": "street_lamp", "man_made": "surveillance", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530347 59.6849253)', 'node', 8906857477, '{"genus": "Philadelphus lemoinei", "taxon": "Philadelphus lemoinei", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник Лемуана", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530224 59.6849455)', 'node', 8906857478, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530015 59.6847554)', 'node', 8906857479, '{"natural": "tree_stump"}', NULL),
('SRID=4326;LINESTRING(30.4522584 59.6851734,30.4522474 59.6851858)', 'way', 103807093, '{"highway": "footway", "surface": "compacted"}', '{3968068679,1198357028}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525041 59.6846527,30.4522364 59.6845601,30.4516531 59.6843525,30.4513385 59.6842533,30.4513511 59.6841667)', 'way', 103807103, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{8566824024,12023699867,8114975022,1195141497,4014269128,3186425168}'),
('SRID=4326;LINESTRING(30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456)', 'way', 103807114, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{1198357004,303515662,8566916345,1198356771,8566916346,1198356889,1198357009,8906857470}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529382 59.6847803,30.4528051 59.6851927,30.4527793 59.6852746,30.4527609 59.6853349,30.4527422 59.6853961,30.4527263 59.6854482,30.4527224 59.6854618)', 'way', 153761053, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068681,8114975050,8114975107,8895975844,8895975845,8895975847,4912270253,1664064412}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4532459 59.6852254,30.45322 59.6852491)', 'way', 153761054, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975105,3968068669}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4528762 59.6851274,30.4530118 59.6851874)', 'way', 153947121, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381541,1665582246}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4529574 59.6848702,30.4531238 59.6848204)', 'way', 153947122, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1738381532,1665582234}'),
('SRID=4326;LINESTRING(30.4533888 59.6848413,30.4535109 59.6849058,30.4534919 59.684967)', 'way', 153947123, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582235,1738381534,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533267 59.6852228,30.4533391 59.6851996,30.4533483 59.6851876,30.4533556 59.6851828,30.4533653 59.6851769,30.4533784 59.6851717,30.4533901 59.6851678,30.4534147 59.6851629,30.4534315 59.6851615,30.4534524 59.6850941)', 'way', 153947124, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975034,8899249793,8114975035,8902027910,8899249794,8902027909,8899249795,1738381544,8114975036,1665582244}'),
('SRID=4326;LINESTRING(30.4531795 59.685129,30.4533062 59.6850846,30.4534722 59.6850303,30.4534919 59.684967)', 'way', 153947125, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975075,1665582243,1738381539,1665582240}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4530483 59.6850678,30.4529356 59.6849912)', 'way', 153947126, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,1665582242,8902082170}'),
('SRID=4326;LINESTRING(30.4529356 59.6849912,30.4530873 59.6849398,30.453213 59.6848988)', 'way', 153947127, '{"highway": "footway", "surface": "fine_gravel"}', '{8902082170,1665582238,8904992643}'),
('SRID=4326;LINESTRING(30.4532598 59.6849025,30.4533508 59.6849575,30.4534722 59.6850303,30.4534524 59.6850941)', 'way', 153947128, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992648,1665582239,1738381539,1665582244}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4531238 59.6848204,30.4533888 59.6848413,30.4535282 59.6848524)', 'way', 153947130, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1665582234,1665582235,1665582236}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4530873 59.6849398,30.4532201 59.6849487,30.4533508 59.6849575,30.4534919 59.684967)', 'way', 153947131, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1665582238,8902082149,1665582239,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533062 59.6850846,30.4533306 59.6850189,30.4533508 59.6849575,30.4533888 59.6848413)', 'way', 153947132, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,1665582243,8902082150,1665582239,1665582235}'),
('SRID=4326;LINESTRING(30.4534524 59.6850941,30.4533062 59.6850846,30.4531801 59.6850762,30.4530483 59.6850678,30.452898 59.6850578)', 'way', 153947133, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582244,1665582243,8902082168,1665582242,1665582241}'),
('SRID=4326;LINESTRING(30.4532234 59.6850226,30.4533062 59.6850846,30.4534147 59.6851629)', 'way', 153947134, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975088,1665582243,1738381544}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4530483 59.6850678,30.4530675 59.6850048,30.4530873 59.6849398,30.4531238 59.6848204)', 'way', 153947135, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,1665582242,8902082151,1665582238,1665582234}'),
('SRID=4326;LINESTRING(30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858)', 'way', 312745383, '{"barrier": "fence"}', '{1439053672,4912270255,4438910482,8895996664,4438910480,3234125031,4438910477,8893386635,4438910475,8895996665,4438910473,8114975112,8114975111,1198357028}'),
('SRID=4326;LINESTRING(30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554)', 'way', 315626926, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053649,8895996432,8895996430,1439053648,1439053645,8895996431,1439053641,1439053639}'),
('SRID=4326;LINESTRING(30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577)', 'way', 317173782, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{1653641713,8114975028,8114975027,8566824024}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.4526304 59.6847065,30.4529536 59.6847313,30.453482 59.6847765,30.4535921 59.6847856,30.4535778 59.6848316,30.4534654 59.685163)', 'way', 393601662, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774427,8905543616,3968068681,7927774426,3968068674,8114975049,3968068687}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4530118 59.6851874,30.4532501 59.6852048,30.4532657 59.6852057)', 'way', 393601664, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1665582246,8899299159,1665582248}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4528762 59.6851274,30.4530483 59.6850678,30.4531752 59.6850205)', 'way', 393601667, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1738381541,1665582242,8114975100}'),
('SRID=4326;LINESTRING(30.452545 59.6854429,30.4525305 59.6854105,30.4525224 59.6853929,30.4525133 59.6853758,30.4525036 59.6853597,30.4524909 59.6853438,30.4524775 59.6853279,30.4524583 59.6853083,30.4524437 59.6852938,30.4524165 59.6852717,30.4523957 59.6852568,30.452375 59.6852427,30.4523461 59.6852243,30.4523179 59.6852068)', 'way', 393620818, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975116,8895996660,8895996640,4438927787,8895996641,8895996659,8895996642,4438927782,8114975115,8895996661,8895996639,4438927777,8895996638,8114975114}'),
('SRID=4326;LINESTRING(30.45322 59.6852491,30.4530263 59.6852336,30.4529402 59.6852275,30.4528645 59.6852217)', 'way', 393620820, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068669,8895975857,8895975877,8895975841}'),
('SRID=4326;LINESTRING(30.4527686 59.6854977,30.4528746 59.6855048)', 'way', 446650486, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053671,1439053674}'),
('SRID=4326;LINESTRING(30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905)', 'way', 446650506, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053619,8914843795,8895996424,8914843796,1439053616,8914843797,8895996423,8914843798,1439053613,8914843799,8895996422,8895996441,8914843802,8895996421,8914843801,1439053611,8914843800,8895996420,1439053614}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522278 59.6851794)', 'way', 446651403, '{"barrier": "fence"}', '{1198357028,1653641713}'),
('SRID=4326;LINESTRING(30.4524943 59.6854502,30.452545 59.6854429,30.4525879 59.6854383,30.4527263 59.6854482,30.4528729 59.6854587)', 'way', 500077282, '{"highway": "footway", "surface": "fine_gravel"}', '{4912270255,8114975116,4438928092,4912270253,4438928093}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522167 59.6853009)', 'way', 758868053, '{"highway": "footway"}', '{1198357028,1406921754}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529562 59.6847243)', 'way', 849729200, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068681,8905543615}'),
('SRID=4326;LINESTRING(30.453482 59.6847765,30.4534851 59.684767)', 'way', 849729201, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774426,8905543614}'),
('SRID=4326;LINESTRING(30.452599 59.6846895,30.4525675 59.6846756,30.45256 59.6846723,30.452568 59.6846486,30.4535014 59.6847265,30.4534976 59.6847368)', 'way', 849729202, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068677,12023732269,8566916344,8566916343,8566916342,7927774425}'),
('SRID=4326;LINESTRING(30.4528543 59.6851747,30.4529071 59.6850026,30.4529249 59.685004,30.4529333 59.6849769,30.452917 59.6849756,30.4529721 59.6847963)', 'way', 871154683, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8114975041,8899249805,8899249804,8899249803,8899249802,8114975042}'),
('SRID=4326;LINESTRING(30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274,30.4526587 59.6847165)', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8114975046,8114975047,8906857474,8906857473,8114975046}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4531264 59.6851489)', 'way', 871154687, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,8114975076}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257)', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,8114975073,8114975074,8114975057,8114975058,8114975059,8114975075,8114975060,8114975061,8114975067,8114975068,8114975069,8114975077,8114975070,8114975062,8114975063,8114975064,8114975076,8114975065,8114975066,8114975071,8114975072,8114975078}'),
('SRID=4326;LINESTRING(30.4532501 59.6852048,30.4531713 59.6851525)', 'way', 871154689, '{"highway": "footway", "surface": "fine_gravel"}', '{8899299159,8114975077}'),
('SRID=4326;LINESTRING(30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998)', 'way', 871154691, '{"highway": "footway"}', '{8114975097,8114975079,8114975080,8114975081,8114975082,8114975083,8114975099,8114975084,8114975085,8114975086,8114975087,8114975088,8114975089,8114975090,8114975091,8114975092,8114975100,8114975093,8114975094,8114975095,8114975096,8114975097}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4529574 59.6848702,30.4530873 59.6849398,30.4531787 59.684998)', 'way', 871154694, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1738381532,1665582238,8114975097}'),
('SRID=4326;LINESTRING(30.4532281 59.6850005,30.4533508 59.6849575,30.4535109 59.6849058,30.4535282 59.6848524)', 'way', 871154695, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975099,1665582239,1738381534,1665582236}'),
('SRID=4326;LINESTRING(30.4532459 59.6852254,30.4528051 59.6851927,30.4522785 59.6851511)', 'way', 871154698, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8114975105,8114975107,8114975109}'),
('SRID=4326;LINESTRING(30.4526095 59.6853751,30.4526201 59.6853832,30.4527025 59.6853899,30.4527175 59.6853841,30.4527302 59.6853414,30.4527195 59.685334,30.4526348 59.6853281,30.4526225 59.6853328,30.4526095 59.6853751)', 'way', 871154699, '{"landuse": "flowerbed"}', '{8114975123,8114975124,8114975125,8895996607,8895996606,8114975126,8114975127,8114975181,8114975123}'),
('SRID=4326;LINESTRING(30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686)', 'way', 871154701, '{"landuse": "flowerbed"}', '{8114975136,8114975137,8114975138,8114975139,8114975140,8114975141,8114975142,8114975143,8114975136}'),
('SRID=4326;LINESTRING(30.4525419 59.6853075,30.4525505 59.6853142,30.4526031 59.6853185,30.4526157 59.6853129,30.4526268 59.6852724,30.4526177 59.6852659,30.4525671 59.6852621,30.452555 59.6852672,30.4525419 59.6853075)', 'way', 871154702, '{"landuse": "flowerbed"}', '{8114975144,8114975145,8114975146,8114975147,8114975148,8114975149,8114975150,8114975151,8114975144}'),
('SRID=4326;LINESTRING(30.4526478 59.6852554,30.4526557 59.6852612,30.452739 59.6852678,30.4527533 59.685262,30.452765 59.685222,30.4527443 59.68522,30.4527459 59.685216,30.452673 59.6852102,30.4526587 59.6852148,30.4526478 59.6852554)', 'way', 871154706, '{"landuse": "flowerbed"}', '{8114975172,8114975173,8114975174,8114975175,8114975176,8114975177,8114975178,8114975179,8114975180,8114975172}'),
('SRID=4326;LINESTRING(30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)', 'way', 872998899, '{"landuse": "flowerbed"}', '{8129422266,8129422267,8129422268,8129422269,8129422270,8129422271,8129422272,8895996472,8129422273,8895996471,8129422266}'),
('SRID=4326;LINESTRING(30.4536402 59.684764,30.4536193 59.6847624,30.4536067 59.6847614)', 'way', 891865282, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{1635198216,1198356775,8289295975}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232)', 'way', 922841960, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824024,1653641402,8566824025,8566824026}'),
('SRID=4326;LINESTRING(30.453531 59.6847593,30.4531199 59.6847256)', 'way', 922854851, '{"height": "8", "natural": "tree_row", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{5002059748,5002059751}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.452599 59.6846895)', 'way', 922854852, '{"highway": "steps"}', '{7927774427,3968068677}'),
('SRID=4326;LINESTRING(30.4536067 59.6847614,30.4535894 59.6847601)', 'way', 922854853, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{8289295975,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4526552 59.6847274,30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274)))', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398)))', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102)))', 'way', 871154691, '{"highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526095 59.6853751,30.4526225 59.6853328,30.4526348 59.6853281,30.4527195 59.685334,30.4527302 59.6853414,30.4527175 59.6853841,30.4527025 59.6853899,30.4526201 59.6853832,30.4526095 59.6853751)))', 'way', 871154699, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139)))', 'way', 871154701, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525419 59.6853075,30.452555 59.6852672,30.4525671 59.6852621,30.4526177 59.6852659,30.4526268 59.6852724,30.4526157 59.6853129,30.4526031 59.6853185,30.4525505 59.6853142,30.4525419 59.6853075)))', 'way', 871154702, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526478 59.6852554,30.4526587 59.6852148,30.452673 59.6852102,30.4527459 59.685216,30.4527443 59.68522,30.452765 59.685222,30.4527533 59.685262,30.452739 59.6852678,30.4526557 59.6852612,30.4526478 59.6852554)))', 'way', 871154706, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)))', 'way', 872998899, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;LINESTRING(30.4521596 59.6854203,30.4524943 59.6854502)', 'way', 961421780, '{"highway": "footway", "surface": "fine_gravel"}', '{8893386627,4912270255}'),
('SRID=4326;LINESTRING(30.4533818 59.6852214,30.4533763 59.68521)', 'way', 961717566, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053598,1439053596}'),
('SRID=4326;LINESTRING(30.4534979 59.6851951,30.4535038 59.6852069)', 'way', 961717567, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053589,1439053591}'),
('SRID=4326;LINESTRING(30.4533763 59.68521,30.4534979 59.6851951)', 'way', 961717568, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053596,1439053589}'),
('SRID=4326;LINESTRING(30.4527378 59.6852117,30.4526559 59.6852052,30.4525684 59.6851982,30.4524641 59.6851898,30.4522584 59.6851734)', 'way', 961717569, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975842,8895975876,8895975873,8895975858,3968068679}'),
('SRID=4326;LINESTRING(30.4530032 59.685292,30.453022 59.6852839,30.4530407 59.6852758,30.4530635 59.68527,30.4530877 59.685267,30.4531091 59.6852663,30.4531333 59.6852683,30.4531547 59.6852744,30.45322 59.6852491)', 'way', 961717570, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975875,8895975856,8895975855,8895975850,8895975854,8895975853,8895975852,8895975851,3968068669}'),
('SRID=4326;LINESTRING(30.4524419 59.6852441,30.452456 59.6851977,30.4524483 59.6851915,30.4523702 59.6851856,30.4523568 59.6851898,30.4523826 59.6852055,30.4524088 59.6852218,30.4524248 59.6852328,30.4524419 59.6852441)', 'way', 961717571, '{"landuse": "flowerbed"}', '{8895975865,8895975864,8895975863,8895975862,8895975859,8895975861,8895975860,8895975838,8895975865}'),
('SRID=4326;LINESTRING(30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946)', 'way', 961717572, '{"landuse": "flowerbed"}', '{8895975872,8895975871,8895975870,8895975869,8895975868,8895975867,8895975866,8895975872}'),
('SRID=4326;LINESTRING(30.4530263 59.6852336,30.4530032 59.685292,30.4529231 59.6852858,30.4527793 59.6852746,30.452638 59.6852636,30.4525513 59.6852568,30.4524466 59.6852487,30.4524641 59.6851898)', 'way', 961717573, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975857,8895975875,8895975843,8895975844,8895975848,8895975846,8895975874,8895975858}'),
('SRID=4326;LINESTRING(30.4529402 59.6852275,30.4529231 59.6852858,30.4529053 59.6853463,30.4528865 59.6854078)', 'way', 961717574, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975877,8895975843,8895975880,8895975878}'),
('SRID=4326;LINESTRING(30.4526559 59.6852052,30.452638 59.6852636,30.4526195 59.6853238,30.4526009 59.6853847,30.4527422 59.6853961,30.4528865 59.6854078)', 'way', 961717575, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975876,8895975848,8895975849,8895975879,8895975847,8895975878}'),
('SRID=4326;LINESTRING(30.4525684 59.6851982,30.4525513 59.6852568,30.4525338 59.685317,30.4526195 59.6853238,30.4527609 59.6853349,30.4529053 59.6853463)', 'way', 961717576, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975873,8895975846,8895975881,8895975849,8895975845,8895975880}'),
('SRID=4326;LINESTRING(30.4527487 59.6852082,30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082)', 'way', 961717577, '{"landuse": "flowerbed"}', '{8895975885,8895975884,8895975883,8895975882,8895975885}'),
('SRID=4326;LINESTRING(30.4532064 59.6852443,30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443)', 'way', 961717578, '{"landuse": "flowerbed"}', '{8895975889,8895975888,8895975887,8895975886,8895975889}'),
('SRID=4326;LINESTRING(30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696)', 'way', 961717579, '{"landuse": "flowerbed"}', '{8895975901,8895975902,8895975900,8895975903,8895975891,8895975890,8895975901}'),
('SRID=4326;LINESTRING(30.4530554 59.6852658,30.4530414 59.6852392,30.453028 59.6852429,30.4530143 59.6852802,30.4530288 59.6852733,30.453041 59.6852693,30.4530554 59.6852658)', 'way', 961717580, '{"landuse": "flowerbed"}', '{8895975898,8895975895,8895975896,8895975907,8895975897,8895975906,8895975898}'),
('SRID=4326;LINESTRING(30.4530632 59.6852641,30.4530782 59.6852621,30.4530921 59.6852616,30.4531031 59.6852618,30.4531172 59.6852446,30.4530501 59.6852392,30.4530632 59.6852641)', 'way', 961717581, '{"landuse": "flowerbed"}', '{8895975905,8895975899,8895975904,8895975892,8895975893,8895975894,8895975905}'),
('SRID=4326;LINESTRING(30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204)', 'way', 961717582, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053627,8914843793,8895996425,8914843794,1439053619}'),
('SRID=4326;LINESTRING(30.4525812 59.6854845,30.4526564 59.6854895)', 'way', 961717593, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{8895996555,1439053669}'),
('SRID=4326;LINESTRING(30.4527747 59.6854387,30.4528506 59.685445,30.4528681 59.6854402,30.4528755 59.6854172,30.4528654 59.6854091,30.4527852 59.6854026,30.4527687 59.6854078,30.4527618 59.6854305,30.4527747 59.6854387)', 'way', 961717594, '{"landuse": "flowerbed"}', '{8895996465,8895996464,8895996463,8895996462,8895996461,8895996460,8895996459,8895996458,8895996465}'),
('SRID=4326;LINESTRING(30.4525201 59.6853123,30.4525328 59.6853069,30.4525442 59.6852666,30.4525351 59.6852597,30.4524557 59.6852538,30.4524775 59.6852724,30.4524969 59.6852906,30.4525201 59.6853123)', 'way', 961717595, '{"landuse": "flowerbed"}', '{8895996470,8895996469,8895996468,8895996467,8895996466,8895996428,8895996429,8895996470}'),
('SRID=4326;LINESTRING(30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969,30.4523418 59.6851889)', 'way', 961717596, '{"landuse": "grass"}', '{8895996495,8895975839,8895996483,8895996484,8895996485,8895996486,8895996487,8895996488,8895996489,8895996490,8895996491,8895996492,8895996493,8895996494,8895996496,8895996473,8895996479,8895996480,8895996474,8895996509,8895996508,8895996507,8895996506,8895996505,8895996504,8895996503,8895996502,8895996501,8895996500,8895996499,8895996498,8895996497,8895996478,8895996495}'),
('SRID=4326;LINESTRING(30.4523081 59.6852118,30.4522803 59.6851945,30.4522795 59.6852157,30.4523143 59.6852356,30.4523427 59.6852536,30.4523628 59.6852673,30.4523827 59.6852816,30.4524087 59.6853027,30.4524225 59.6853163,30.4524411 59.6853354,30.452454 59.6853507,30.452466 59.6853657,30.4524751 59.6853808,30.4524839 59.6853973,30.4524918 59.6854125,30.4524982 59.6854272,30.452501 59.6854325,30.4525097 59.6854362,30.4525224 59.6854348,30.4525257 59.6854303,30.4525231 59.6854242,30.4525171 59.6854097,30.4525091 59.6853943,30.4525002 59.6853776,30.4524909 59.685362,30.4524785 59.6853465,30.4524653 59.6853309,30.4524465 59.6853116,30.4524322 59.6852976,30.4524056 59.685276,30.4523853 59.6852614,30.4523649 59.6852475,30.4523362 59.6852293,30.4523081 59.6852118)', 'way', 961717597, '{"landuse": "grass"}', '{8895996522,8895996477,8895996536,8895996524,8895996525,8895996526,8895996527,8895996528,8895996529,8895996530,8895996531,8895996532,8895996533,8895996534,8895996535,8895996537,8895996482,8895996476,8895996481,8895996523,8895996475,8895996521,8895996520,8895996519,8895996518,8895996517,8895996516,8895996515,8895996514,8895996513,8895996512,8895996511,8895996510,8895996522}'),
('SRID=4326;LINESTRING(30.4526076 59.685425,30.4526842 59.6854313,30.4527032 59.6854269,30.4527112 59.6854034,30.4527003 59.6853955,30.4526196 59.6853891,30.4526042 59.6853942,30.4525975 59.6854176,30.4526076 59.685425)', 'way', 961717598, '{"landuse": "flowerbed"}', '{8895996545,8895996544,8895996543,8895996542,8895996541,8895996540,8895996539,8895996538,8895996545}'),
('SRID=4326;LINESTRING(30.4528639 59.685494,30.4528702 59.6854731,30.4527911 59.6854671,30.4527849 59.685488,30.4528639 59.685494)', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996549,8895996548,8895996547,8895996546,8895996549}'),
('SRID=4326;LINESTRING(30.4526433 59.6854773,30.4526495 59.6854564,30.4525705 59.6854504,30.4525642 59.6854713,30.4526433 59.6854773)', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996553,8895996552,8895996551,8895996550,8895996553}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528709 59.6855164)', 'way', 961717601, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,8895996554}'),
('SRID=4326;LINESTRING(30.4529138 59.6853368,30.4529235 59.6853445,30.4529678 59.6853472,30.4529853 59.6853413,30.4529963 59.6853005,30.4529866 59.6852936,30.4529427 59.6852903,30.4529263 59.6852951,30.4529138 59.6853368)', 'way', 961717602, '{"landuse": "flowerbed"}', '{8895996564,8895996563,8895996562,8895996561,8895996560,8895996559,8895996558,8895996557,8895996564}'),
('SRID=4326;LINESTRING(30.452933 59.6852753,30.4529441 59.6852838,30.4529886 59.6852873,30.453002 59.6852821,30.4530171 59.6852433,30.4530088 59.6852371,30.4529582 59.685233,30.4529444 59.6852374,30.452933 59.6852753)', 'way', 961717603, '{"landuse": "flowerbed"}', '{8895996572,8895996571,8895996570,8895996569,8895996568,8895996567,8895996566,8895996565,8895996572}'),
('SRID=4326;LINESTRING(30.4525595 59.6852465,30.4525692 59.6852544,30.4526207 59.6852585,30.4526333 59.6852538,30.452645 59.6852146,30.4526353 59.6852076,30.4525847 59.6852036,30.4525709 59.685208,30.4525595 59.6852465)', 'way', 961717604, '{"landuse": "flowerbed"}', '{8895996580,8895996579,8895996578,8895996577,8895996576,8895996575,8895996574,8895996573,8895996580}'),
('SRID=4326;LINESTRING(30.452817 59.6852667,30.4528288 59.6852748,30.4529066 59.6852809,30.45292 59.6852751,30.4529319 59.6852358,30.4529216 59.6852291,30.452851 59.685224,30.4528493 59.6852281,30.452831 59.6852267,30.452817 59.6852667)', 'way', 961717605, '{"landuse": "flowerbed"}', '{8895996589,8895996588,8895996587,8895996586,8895996585,8895996584,8895996581,8895996583,8895996582,8895996589}'),
('SRID=4326;LINESTRING(30.4527946 59.6853272,30.4528053 59.6853349,30.4528878 59.6853416,30.4529031 59.6853359,30.4529154 59.6852941,30.4529042 59.6852874,30.4528247 59.6852816,30.4528087 59.6852864,30.4527946 59.6853272)', 'way', 961717606, '{"landuse": "flowerbed"}', '{8895996597,8895996596,8895996595,8895996594,8895996593,8895996592,8895996591,8895996590,8895996597}'),
('SRID=4326;LINESTRING(30.4527745 59.6853889,30.4527865 59.6853969,30.4528677 59.6854032,30.4528839 59.6853982,30.4528953 59.6853552,30.4528845 59.6853477,30.4528052 59.6853419,30.4527899 59.6853454,30.4527745 59.6853889)', 'way', 961717607, '{"landuse": "flowerbed"}', '{8895996605,8895996604,8895996603,8895996602,8895996601,8895996600,8895996599,8895996598,8895996605}'),
('SRID=4326;LINESTRING(30.452565 59.6854206,30.4525598 59.6854071,30.4525516 59.6853892,30.4525422 59.6853716,30.4525319 59.6853544,30.4525184 59.6853376,30.4525045 59.6853211,30.4524848 59.6853009,30.4524693 59.6852857,30.4524408 59.6852624,30.4524192 59.685247,30.4523979 59.6852324,30.4523685 59.6852137,30.4523402 59.6851962)', 'way', 961717608, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996623,8895996621,8895996620,8895996619,8895996618,8895996617,8895996616,8895996615,8895996614,8895996613,8895996612,8895996611,8895996610,8895996622}'),
('SRID=4326;LINESTRING(30.4525109 59.6854262,30.4525044 59.6854114,30.4524965 59.6853961,30.4524877 59.6853796,30.4524784 59.6853642,30.4524662 59.6853489,30.4524532 59.6853335,30.4524345 59.6853143,30.4524204 59.6853005,30.4523942 59.6852791,30.452374 59.6852647,30.4523538 59.6852509,30.4523252 59.6852327,30.4522972 59.6852153)', 'way', 961717609, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996637,8895996635,8895996634,8895996633,8895996632,8895996631,8895996630,8895996629,8895996628,8895996627,8895996626,8895996625,8895996624,8895996636}'),
('SRID=4326;LINESTRING(30.4523179 59.6852068,30.4522881 59.6851891,30.4522584 59.6851734,30.4522785 59.6851511,30.4525958 59.6847532,30.4529382 59.6847803,30.4535778 59.6848316)', 'way', 961717610, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975114,8895996608,3968068679,8114975109,8114975051,8114975050,8114975049}'),
('SRID=4326;LINESTRING(30.4527224 59.6854618,30.4527166 59.6854798)', 'way', 961717612, '{"highway": "steps", "incline": "up", "surface": "paving_stones"}', '{1664064412,8895996662}'),
('SRID=4326;LINESTRING(30.4534116 59.6851536,30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536)', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249763,8899249762,8899249761,8899249760,8899249759,8899249763}'),
('SRID=4326;LINESTRING(30.4535137 59.6851734,30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437)', 'way', 962062988, '{"source:taxon": "board"}', '{8899249777,8899249776,8899249775,8899249774}'),
('SRID=4326;LINESTRING(30.4534505 59.6851512,30.4535484 59.6848425)', 'way', 962062989, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.5", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8899249781,8899249780}'),
('SRID=4326;LINESTRING(30.4532761 59.6852013,30.4533137 59.6852128,30.453319 59.6851999,30.4533257 59.6851898,30.4533338 59.6851796,30.4533458 59.6851715,30.4533606 59.6851647,30.453378 59.6851586,30.4533941 59.6851559,30.4533211 59.6851024,30.4533083 59.6851038,30.4532761 59.6852013)', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249792,8899249791,8899249790,8899249789,8899249788,8899249787,8899249786,8899249785,8899249784,8899249783,8899249782,8899249792}'),
('SRID=4326;LINESTRING(30.4534315 59.6851615,30.4534654 59.685163)', 'way', 962062991, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975036,3968068687}'),
('SRID=4326;LINESTRING(30.45277 59.6851675,30.4528221 59.6849965,30.4528061 59.6849952,30.4528148 59.6849678,30.4528309 59.6849691,30.4528877 59.684789)', 'way', 962062992, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8899249807,8899249801,8899249800,8899249799,8899249798,8899249806}'),
('SRID=4326;LINESTRING(30.4530825 59.6850727,30.4530768 59.6850789,30.4531357 59.6851196,30.4531475 59.6851179,30.4531599 59.6851179,30.4531731 59.6851201,30.4531813 59.685123,30.4532721 59.6850914,30.45327 59.6850856,30.4530825 59.6850727)', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249816,8899249815,8899249814,8899249813,8899249812,8899249811,8899249810,8899249809,8899249808,8899249816}'),
('SRID=4326;LINESTRING(30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148)', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299126,8899299125,8899299124,8899299123,8899299122,8899299121,8899299120,8899299119,8899299118,8899299117,8899299126}'),
('SRID=4326;LINESTRING(30.4531566 59.6851458,30.4531627 59.6851441,30.4531665 59.6851411,30.4531672 59.6851376,30.4531645 59.6851343,30.4531591 59.685132,30.4531523 59.6851313,30.4531455 59.6851322,30.4531404 59.6851346,30.4531381 59.685138,30.4531391 59.6851415,30.4531433 59.6851444,30.4531496 59.6851459,30.4531566 59.6851458)', 'way', 962062995, '{"landuse": "grass"}', '{8899299139,8899299138,8899299137,8899299136,8899299135,8899299134,8899299133,8899299132,8899299131,8899299130,8899299129,8899299128,8899299140,8899299139}'),
('SRID=4326;LINESTRING(30.4531836 59.6851532,30.45325 59.6851972,30.4532587 59.6851977,30.4532923 59.6851023,30.4532804 59.6850981,30.4531914 59.68513,30.4531946 59.6851353,30.453195 59.6851401,30.4531936 59.6851444,30.45319 59.6851488,30.4531836 59.6851532)', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299150,8899299149,8899299141,8899299148,8899299142,8899299147,8899299146,8899299145,8899299144,8899299143,8899299150}'),
('SRID=4326;LINESTRING(30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299158,8899299157,8899299156,8899299155,8899299154,8899299153,8899299152,8899299151,8899249778,8899299158}'),
('SRID=4326;LINESTRING(30.4532162 59.6852145,30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145)', 'way', 962062998, '{"landuse": "grass"}', '{8899299165,8899299164,8899299163,8899299161,8899299160,8899299162,8899299165}'),
('SRID=4326;LINESTRING(30.4532627 59.6852077,30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077)', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', '{8902082028,8902082027,8902082026,8902082025,8902082024,8902082023,8902082022,8902082021,8902082020,8902027911,8902082019,8902082018,8902082017,8902027912,8902027916,8902027913,8902027915,8902027914,8902082028}'),
('SRID=4326;LINESTRING(30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082032,8902082031,8902082030,8902082029,8902082032}'),
('SRID=4326;LINESTRING(30.4529465 59.6849826,30.4530583 59.6849454,30.4530566 59.6849397,30.4529452 59.6849315,30.4529338 59.6849691,30.4529492 59.6849698,30.4529465 59.6849826)', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082038,8902082037,8902082036,8902082035,8902082034,8902082033,8902082038}'),
('SRID=4326;LINESTRING(30.4530344 59.685052,30.4530456 59.6850508,30.4530757 59.684955,30.4530662 59.6849507,30.4529465 59.6849918,30.4530344 59.685052)', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082047,8902082046,8902082045,8902082044,8902082043,8902082047}'),
('SRID=4326;LINESTRING(30.4529083 59.6850544,30.4530153 59.6850613,30.4530221 59.685056,30.4529398 59.6850009,30.4529378 59.6850121,30.4529184 59.6850114,30.4529083 59.6850544)', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082054,8902082053,8902082052,8902082051,8902082050,8902082049,8902082054}'),
('SRID=4326;LINESTRING(30.4528875 59.6851184,30.4530138 59.6850731,30.4530125 59.6850679,30.4529043 59.6850625,30.4528875 59.6851184)', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082059,8902082058,8902082057,8902082056,8902082059}'),
('SRID=4326;LINESTRING(30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789)', 'way', 962382766, '{"landuse": "grass"}', '{8902082065,8902082064,8902082063,8902082062,8902082065}'),
('SRID=4326;LINESTRING(30.4529896 59.6851748,30.4530072 59.6851719,30.4530311 59.6850841,30.4530206 59.6850798,30.4528885 59.6851275,30.4529896 59.6851748)', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082070,8902082069,8902082068,8902082067,8902082066,8902082070}'),
('SRID=4326;LINESTRING(30.4533332 59.6850719,30.4534612 59.68503,30.4533655 59.6849715,30.4533546 59.6849733,30.4533227 59.6850682,30.4533332 59.6850719)', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082080,8902082079,8902082078,8902082077,8902082076,8902082080}'),
('SRID=4326;LINESTRING(30.4533437 59.685083,30.4534444 59.6850899,30.4534619 59.6850382,30.4533411 59.685078,30.4533437 59.685083)', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082084,8902082083,8902082082,8902082081,8902082084}'),
('SRID=4326;LINESTRING(30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173)', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082090,8902082089,8902082088,8902082087,8902082086,8902082085,8902082090}'),
('SRID=4326;LINESTRING(30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113)', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082096,8902082095,8902082094,8902082093,8902082092,8902082091,8902082096}'),
('SRID=4326;LINESTRING(30.4532258 59.6849527,30.4532116 59.6849902,30.4532207 59.684992,30.4532298 59.6849953,30.4533219 59.6849634,30.4533191 59.6849588,30.4532258 59.6849527)', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082102,8902082101,8902082100,8902082099,8902082098,8902082097,8902082102}'),
('SRID=4326;LINESTRING(30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082108,8902082107,8902082106,8902082105,8902082104,8902082103,8902082108}'),
('SRID=4326;LINESTRING(30.4530763 59.6850024,30.4531619 59.6850065,30.4531647 59.6850018,30.4531695 59.6849976,30.4531032 59.6849548,30.453091 59.6849565,30.4530763 59.6850024)', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082109,8902082114,8902082113,8902082112,8902082111,8902082110,8902082109}'),
('SRID=4326;LINESTRING(30.4530716 59.6850547,30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547)', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082120,8902082119,8902082118,8902082117,8902082116,8902082115,8902082120}'),
('SRID=4326;LINESTRING(30.4531735 59.6850722,30.4531863 59.6850287,30.4531799 59.6850271,30.4531749 59.6850252,30.4530791 59.6850599,30.453083 59.685065,30.4531735 59.6850722)', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082126,8902082125,8902082124,8902082123,8902082122,8902082121,8902082126}'),
('SRID=4326;LINESTRING(30.4531903 59.6850727,30.4532727 59.6850781,30.4532816 59.6850715,30.4532223 59.6850274,30.453211 59.6850297,30.453201 59.6850303,30.4531903 59.6850727)', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082132,8902082131,8902082130,8902082129,8902082128,8902082127,8902082132}'),
('SRID=4326;LINESTRING(30.453206 59.6849937,30.4532201 59.6849487)', 'way', 962382778, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975081,8902082149}'),
('SRID=4326;LINESTRING(30.4532335 59.6850137,30.4533306 59.6850189)', 'way', 962382779, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975086,8902082150}'),
('SRID=4326;LINESTRING(30.4531682 59.6850102,30.4530675 59.6850048)', 'way', 962382780, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975094,8902082151}'),
('SRID=4326;LINESTRING(30.4531253 59.6850083,30.4531256 59.6850158,30.4531288 59.6850232,30.4531349 59.6850302,30.4531434 59.6850364,30.4531543 59.6850416,30.4531669 59.6850457,30.4531809 59.6850485,30.4531957 59.6850498,30.4532107 59.6850496,30.4532253 59.685048,30.4532391 59.685045,30.4532514 59.6850406,30.4532618 59.6850352,30.4532699 59.6850288,30.4532753 59.6850217,30.4532779 59.6850143,30.4532776 59.6850067,30.4532744 59.6849993,30.4532684 59.6849924,30.4532598 59.6849862,30.453249 59.6849809,30.4532363 59.6849768,30.4532224 59.6849741,30.4532076 59.6849728,30.4531926 59.6849729,30.4531779 59.6849745,30.4531642 59.6849776,30.4531519 59.6849819,30.4531415 59.6849874,30.4531334 59.6849938,30.4531279 59.6850008,30.4531253 59.6850083)', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082167,8902082134,8902082166,8902082133,8902082165,8902082148,8902082164,8902082147,8902082163,8902082146,8902082162,8902082145,8902082161,8902082144,8902082160,8902082143,8902082159,8902082142,8902082158,8902082141,8902082157,8902082140,8902082156,8902082139,8902082155,8902082138,8902082154,8902082137,8902082153,8902082136,8902082152,8902082135,8902082167}'),
('SRID=4326;LINESTRING(30.4531956 59.6850267,30.4531801 59.6850762)', 'way', 962382782, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975091,8902082168}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4529124 59.6850066,30.4529307 59.6850078,30.4529356 59.6849912,30.4529412 59.6849735,30.4529245 59.6849722,30.4529389 59.6849276)', 'way', 962382783, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381535,8902082040,8902082170,8902082039,8902082169,1665582237}'),
('SRID=4326;LINESTRING(30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877)', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992660,8904992659,8904992658,8904992657,8904992656,8904992655,8904992654,8904992653,8904992652,8904992651,8904992650,8904992649,8904992648,8904992647,8904992646,8904992645,8904992644,8904992643,8904992642,8904992641,8904992640,8904992639,8904992660}'),
('SRID=4326;LINESTRING(30.4532432 59.6848971,30.4532493 59.6848954,30.4532531 59.6848924,30.4532538 59.6848889,30.4532511 59.6848856,30.4532457 59.6848833,30.4532389 59.6848826,30.4532321 59.6848835,30.453227 59.684886,30.4532247 59.6848893,30.4532257 59.6848928,30.4532299 59.6848957,30.4532362 59.6848972,30.4532432 59.6848971)', 'way', 962678726, '{"landuse": "grass"}', '{8904992673,8904992672,8904992671,8904992670,8904992669,8904992668,8904992667,8904992666,8904992665,8904992664,8904992663,8904992662,8904992661,8904992673}'),
('SRID=4326;LINESTRING(30.4530998 59.6849248,30.4531105 59.684928,30.4532056 59.6848974,30.4532029 59.6848932,30.4532023 59.6848877,30.4532043 59.6848829,30.4532098 59.6848776,30.4531384 59.6848341,30.4531253 59.6848349,30.4530998 59.6849248)', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992682,8904992681,8904992680,8904992679,8904992637,8904992678,8904992677,8904992676,8904992675,8904992682}'),
('SRID=4326;LINESTRING(30.4530724 59.6849262,30.4530868 59.6849239,30.4531127 59.6848333,30.4531034 59.6848301,30.4529683 59.6848711,30.4530724 59.6849262)', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992687,8904992686,8904992685,8904992684,8904992683,8904992687}'),
('SRID=4326;LINESTRING(30.4530589 59.6849341,30.4530633 59.6849302,30.452961 59.6848772,30.4529482 59.6849246,30.4530589 59.6849341)', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992691,8904992690,8904992689,8904992688,8904992691}'),
('SRID=4326;LINESTRING(30.4531212 59.684939,30.4533222 59.6849516,30.4533269 59.6849477,30.4532581 59.6849071,30.4532455 59.6849087,30.4532339 59.6849085,30.4532243 59.684907,30.4532133 59.6849034,30.4531185 59.6849335,30.4531212 59.684939)', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992699,8904992698,8904992697,8904992696,8904992692,8904992638,8904992695,8904992694,8904992693,8904992699}'),
('SRID=4326;LINESTRING(30.453536 59.6848401,30.4529797 59.6847958,30.452977 59.6848046,30.4535329 59.6848493,30.453536 59.6848401)', 'way', 962714214, '{"landuse": "flowerbed"}', '{8905335420,8905335419,8905335418,8905335417,8905335420}'),
('SRID=4326;LINESTRING(30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335435,8905335434,8905335433,8905335432,8905335435}'),
('SRID=4326;LINESTRING(30.4533819 59.6849565,30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565)', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335439,8905335438,8905335437,8905335436,8905335439}'),
('SRID=4326;LINESTRING(30.4533623 59.6849431,30.4533739 59.6849464,30.4534994 59.6849065,30.4534038 59.6848537,30.4533921 59.6848545,30.4533623 59.6849431)', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335444,8905335443,8905335442,8905335441,8905335440,8905335444}'),
('SRID=4326;LINESTRING(30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335454,8905335453,8905335452,8905335451,8905335450,8905335449,8905335448,8905335447,8905335446,8905335454}'),
('SRID=4326;LINESTRING(30.4529663 59.6848632,30.4530962 59.6848253,30.4530928 59.6848201,30.4529831 59.6848107,30.4529663 59.6848632)', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335458,8905335457,8905335456,8905335455,8905335458}'),
('SRID=4326;LINESTRING(30.4532195 59.6848732,30.4532263 59.6848712,30.4532379 59.6848698,30.4532504 59.6848704,30.4532619 59.6848729,30.4532706 59.684876,30.4533642 59.6848467,30.4533614 59.6848416,30.453158 59.6848262,30.4531503 59.6848308,30.4532195 59.6848732)', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335467,8905335466,8905335465,8905335464,8905335463,8905335462,8905335461,8905335445,8905335460,8905335459,8905335467}'),
('SRID=4326;LINESTRING(30.4532684 59.6848807,30.4533888 59.6848413)', 'way', 962714221, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992654,1665582235}'),
('SRID=4326;LINESTRING(30.4531238 59.6848204,30.4532177 59.684877)', 'way', 962714222, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582234,8904992660}'),
('SRID=4326;LINESTRING(30.4527677 59.6846399,30.4528579 59.6846477)', 'way', 962735606, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8905543613,1198356896}'),
('SRID=4326;LINESTRING(30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399)', 'way', 962735608, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824026,1198356935,8566824027,8905543613}'),
('SRID=4326;LINESTRING(30.4534851 59.684767,30.4534913 59.6847521,30.4534976 59.6847368)', 'way', 962735609, '{"highway": "steps"}', '{8905543614,12023732271,7927774425}'),
('SRID=4326;LINESTRING(30.4529562 59.6847243,30.4529615 59.6847082,30.4529628 59.6847041)', 'way', 962735610, '{"highway": "steps"}', '{8905543615,12023732270,3968068678}'),
('SRID=4326;LINESTRING(30.4526304 59.6847065,30.4525958 59.6847532)', 'way', 962735611, '{"highway": "footway", "surface": "fine_gravel"}', '{8905543616,8114975051}'),
('SRID=4326;LINESTRING(30.4528676 59.6847547,30.4526341 59.6847357,30.452631 59.6847454,30.4528645 59.6847644,30.4528676 59.6847547)', 'way', 962735612, '{"landuse": "grass"}', '{8905558220,8905558219,8905558218,8905558217,8905558220}'),
('SRID=4326;LINESTRING(30.4535589 59.6848104,30.4530176 59.6847681,30.4530149 59.6847769,30.4535559 59.6848195,30.4535589 59.6848104)', 'way', 962735613, '{"landuse": "grass"}', '{8905558224,8905558223,8905558222,8905558221,8905558224}'),
('SRID=4326;LINESTRING(30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573,30.4530182 59.6847465)', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8905558227,8905558226,8906857476,8906857475,8905558227}'),
('SRID=4326;LINESTRING(30.4523152 59.6851448,30.4526116 59.6847664)', 'way', 962869359, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.7", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857452,8906857451}'),
('SRID=4326;LINESTRING(30.4526277 59.6846803,30.4526365 59.6846782,30.4526406 59.6846738,30.4526381 59.684669,30.4526302 59.6846662,30.4526205 59.6846666,30.4526137 59.6846701,30.4526128 59.684675,30.4526184 59.684679,30.4526277 59.6846803)', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857461,8906857453,8906857460,8906857459,8906857458,8906857457,8906857456,8906857455,8906857454,8906857461}'),
('SRID=4326;LINESTRING(30.4535863 59.6847456,30.4535811 59.6847595)', 'way', 962869365, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8906857470,8289295976}'),
('SRID=4326;MULTIPOLYGON(((30.4513 59.6845239,30.4513105 59.6845148,30.4513253 59.6844972,30.4513336 59.6844848,30.4513473 59.6844699,30.4513568 59.6844555,30.4513653 59.6844381,30.4513738 59.6844262,30.4513936 59.6844093,30.4514013 59.6843976,30.4514225 59.6843888,30.4514444 59.6843812,30.4514614 59.6843629,30.4514704 59.6843445,30.4514736 59.6843262,30.4514828 59.6842988,30.4514912 59.6842865,30.4514975 59.6842799,30.4515117 59.6842705,30.4515428 59.6842625,30.4516031 59.6842549,30.4518408 59.6843394,30.4519523 59.6843794,30.4520216 59.6844035,30.4520874 59.6844268,30.4521402 59.684444,30.4521943 59.6844606,30.452244 59.6844736,30.4522939 59.6844865,30.4523452 59.6844991,30.4524113 59.6845149,30.4524654 59.6845284,30.4525244 59.6845406,30.4525539 59.6845467,30.452566 59.6845558,30.452571 59.6845656,30.4525675 59.6845745,30.4525615 59.68459,30.4525618 59.6845988,30.4525613 59.6846073,30.4525568 59.6846156,30.4525466 59.6846232,30.4525331 59.6846279,30.4525251 59.684634,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4521768 59.6852884,30.4521573 59.685297,30.4521207 59.6853099,30.4520859 59.6853167,30.4520483 59.6853214,30.4520121 59.6853235,30.4519679 59.6853228,30.4519209 59.685316,30.4518731 59.6853033,30.4518364 59.6852869,30.4518016 59.6852646,30.4517747 59.6852436,30.4517546 59.685224,30.4517399 59.685205,30.4517278 59.6851773,30.4517104 59.6851603,30.4516916 59.6851468,30.4516857 59.6851285,30.4516903 59.6851123,30.4517117 59.6851023,30.4517426 59.685094,30.4517784 59.6850892,30.4518103 59.6850908,30.4518403 59.6851005,30.4518731 59.6850949,30.4518771 59.6850809,30.4518692 59.685051,30.4518777 59.6850294,30.4519043 59.6850131,30.4519376 59.6850028,30.4519737 59.684999,30.4520079 59.6849997,30.4520477 59.685012,30.4520887 59.6850223,30.4521435 59.6850216,30.4521948 59.6850093,30.4522112 59.6849969,30.4522301 59.6849727,30.45222 59.6849586,30.4521979 59.6849496,30.4521524 59.6849328,30.452119 59.6849135,30.452105 59.6848849,30.4521099 59.684868,30.4520932 59.684849,30.4520658 59.6848372,30.4520255 59.6848223,30.4520099 59.6848104,30.4519866 59.6847939,30.4519651 59.6847718,30.4519517 59.6847501,30.4519518 59.6847258,30.4519545 59.6847041,30.4519786 59.6846635,30.4520121 59.6846479,30.452051 59.6846256,30.4520604 59.6846161,30.4520537 59.6846046,30.4520175 59.6845829,30.4519692 59.6845613,30.451933 59.684566,30.4519102 59.6845748,30.4518928 59.6845917,30.4518772 59.6846127,30.4518697 59.684638,30.4518561 59.6846587,30.4518347 59.6846794,30.4518136 59.6846859,30.451785 59.6846963,30.4517612 59.6847117,30.4517363 59.6847257,30.4517004 59.6847328,30.4516678 59.6847376,30.4516243 59.6847395,30.4515783 59.6847426,30.4515624 59.6847383,30.451536 59.6847319,30.4515265 59.6847207,30.4515128 59.6847092,30.4515012 59.6846991,30.4514963 59.6846932,30.4515039 59.6846846,30.4515091 59.6846707,30.4515006 59.6846638,30.4514837 59.6846584,30.4514488 59.6846536,30.4514298 59.6846424,30.4514235 59.6846339,30.451434 59.6846216,30.451452 59.6846104,30.4514721 59.684604,30.4514816 59.6845934,30.4514827 59.6845827,30.4514763 59.6845715,30.4514427 59.6845604,30.4514004 59.6845719,30.4513792 59.6845708,30.451356 59.684566,30.4513317 59.6845601,30.4513137 59.6845489,30.4513042 59.6845393,30.4513 59.6845239)))', 'relation', 12444790, '{"natural": "wood", "leaf_type": "mixed", "leaf_cycle": "mixed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523568 59.6851898,30.4523702 59.6851856,30.4524483 59.6851915,30.452456 59.6851977,30.4524419 59.6852441,30.4524248 59.6852328,30.4524088 59.6852218,30.4523826 59.6852055,30.4523568 59.6851898)))', 'way', 961717571, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459)))', 'way', 961717572, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082,30.4523303 59.6851757)))', 'way', 961717577, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443,30.4528543 59.6852169)))', 'way', 961717578, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622)))', 'way', 961717579, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6852802,30.453028 59.6852429,30.4530414 59.6852392,30.4530554 59.6852658,30.453041 59.6852693,30.4530288 59.6852733,30.4530143 59.6852802)))', 'way', 961717580, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530501 59.6852392,30.4531172 59.6852446,30.4531031 59.6852618,30.4530921 59.6852616,30.4530782 59.6852621,30.4530632 59.6852641,30.4530501 59.6852392)))', 'way', 961717581, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.4531138 59.6852988,30.4530897 59.6853096,30.4530682 59.6853211,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168)))', 'relation', 12935642, '{"height": "6", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530106 59.6853114,30.4530161 59.6853019,30.4530244 59.6852922,30.4530375 59.685285,30.4530534 59.685278,30.4530732 59.685274,30.4530931 59.6852723,30.4531124 59.685272,30.4531329 59.6852751,30.4531443 59.685278,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530111 59.6853217,30.4530106 59.6853114)))', 'relation', 12922491, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530012 59.685359,30.4529724 59.685378,30.4529542 59.6853912,30.4529312 59.685409,30.4529136 59.685403)))', 'relation', 12935641, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527618 59.6854305,30.4527687 59.6854078,30.4527852 59.6854026,30.4528654 59.6854091,30.4528755 59.6854172,30.4528681 59.6854402,30.4528506 59.685445,30.4527747 59.6854387,30.4527618 59.6854305)))', 'way', 961717594, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524557 59.6852538,30.4525351 59.6852597,30.4525442 59.6852666,30.4525328 59.6853069,30.4525201 59.6853123,30.4524969 59.6852906,30.4524775 59.6852724,30.4524557 59.6852538)))', 'way', 961717595, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523226 59.6851969,30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969)))', 'way', 961717596, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522795 59.6852157,30.4522803 59.6851945,30.4523081 59.6852118,30.4523362 59.6852293,30.4523649 59.6852475,30.4523853 59.6852614,30.4524056 59.685276,30.4524322 59.6852976,30.4524465 59.6853116,30.4524653 59.6853309,30.4524785 59.6853465,30.4524909 59.685362,30.4525002 59.6853776,30.4525091 59.6853943,30.4525171 59.6854097,30.4525231 59.6854242,30.4525257 59.6854303,30.4525224 59.6854348,30.4525097 59.6854362,30.452501 59.6854325,30.4524982 59.6854272,30.4524918 59.6854125,30.4524839 59.6853973,30.4524751 59.6853808,30.452466 59.6853657,30.452454 59.6853507,30.4524411 59.6853354,30.4524225 59.6853163,30.4524087 59.6853027,30.4523827 59.6852816,30.4523628 59.6852673,30.4523427 59.6852536,30.4523143 59.6852356,30.4522795 59.6852157)))', 'way', 961717597, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525975 59.6854176,30.4526042 59.6853942,30.4526196 59.6853891,30.4527003 59.6853955,30.4527112 59.6854034,30.4527032 59.6854269,30.4526842 59.6854313,30.4526076 59.685425,30.4525975 59.6854176)))', 'way', 961717598, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527849 59.685488,30.4527911 59.6854671,30.4528702 59.6854731,30.4528639 59.685494,30.4527849 59.685488)))', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525642 59.6854713,30.4525705 59.6854504,30.4526495 59.6854564,30.4526433 59.6854773,30.4525642 59.6854713)))', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529138 59.6853368,30.4529263 59.6852951,30.4529427 59.6852903,30.4529866 59.6852936,30.4529963 59.6853005,30.4529853 59.6853413,30.4529678 59.6853472,30.4529235 59.6853445,30.4529138 59.6853368)))', 'way', 961717602, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452933 59.6852753,30.4529444 59.6852374,30.4529582 59.685233,30.4530088 59.6852371,30.4530171 59.6852433,30.453002 59.6852821,30.4529886 59.6852873,30.4529441 59.6852838,30.452933 59.6852753)))', 'way', 961717603, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525595 59.6852465,30.4525709 59.685208,30.4525847 59.6852036,30.4526353 59.6852076,30.452645 59.6852146,30.4526333 59.6852538,30.4526207 59.6852585,30.4525692 59.6852544,30.4525595 59.6852465)))', 'way', 961717604, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452817 59.6852667,30.452831 59.6852267,30.4528493 59.6852281,30.452851 59.685224,30.4529216 59.6852291,30.4529319 59.6852358,30.45292 59.6852751,30.4529066 59.6852809,30.4528288 59.6852748,30.452817 59.6852667)))', 'way', 961717605, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527946 59.6853272,30.4528087 59.6852864,30.4528247 59.6852816,30.4529042 59.6852874,30.4529154 59.6852941,30.4529031 59.6853359,30.4528878 59.6853416,30.4528053 59.6853349,30.4527946 59.6853272)))', 'way', 961717606, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527745 59.6853889,30.4527899 59.6853454,30.4528052 59.6853419,30.4528845 59.6853477,30.4528953 59.6853552,30.4528839 59.6853982,30.4528677 59.6854032,30.4527865 59.6853969,30.4527745 59.6853889)))', 'way', 961717607, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536,30.4533349 59.6850974)))', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437,30.4535137 59.6851734,30.4534909 59.6851715)))', 'relation', 12925809, '{"crop": "grape", "genus": "Vitis", "taxon": "Vitis amurensis", "landuse": "vineyard", "genus:ru": "Виноград", "taxon:ru": "Виноград амурский"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532761 59.6852013,30.4533083 59.6851038,30.4533211 59.6851024,30.4533941 59.6851559,30.453378 59.6851586,30.4533606 59.6851647,30.4533458 59.6851715,30.4533338 59.6851796,30.4533257 59.6851898,30.453319 59.6851999,30.4533137 59.6852128,30.4532761 59.6852013)))', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530768 59.6850789,30.4530825 59.6850727,30.45327 59.6850856,30.4532721 59.6850914,30.4531813 59.685123,30.4531731 59.6851201,30.4531599 59.6851179,30.4531475 59.6851179,30.4531357 59.6851196,30.4530768 59.6850789)))', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728)))', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531381 59.685138,30.4531404 59.6851346,30.4531455 59.6851322,30.4531523 59.6851313,30.4531591 59.685132,30.4531645 59.6851343,30.4531672 59.6851376,30.4531665 59.6851411,30.4531627 59.6851441,30.4531566 59.6851458,30.4531496 59.6851459,30.4531433 59.6851444,30.4531391 59.6851415,30.4531381 59.685138)))', 'way', 962062995, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531836 59.6851532,30.45319 59.6851488,30.4531936 59.6851444,30.453195 59.6851401,30.4531946 59.6851353,30.4531914 59.68513,30.4532804 59.6850981,30.4532923 59.6851023,30.4532587 59.6851977,30.45325 59.6851972,30.4531836 59.6851532)))', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)))', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145,30.4528382 59.6851861)))', 'way', 962062998, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077,30.4528577 59.6851769)))', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)))', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529338 59.6849691,30.4529452 59.6849315,30.4530566 59.6849397,30.4530583 59.6849454,30.4529465 59.6849826,30.4529492 59.6849698,30.4529338 59.6849691)))', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529465 59.6849918,30.4530662 59.6849507,30.4530757 59.684955,30.4530456 59.6850508,30.4530344 59.685052,30.4529465 59.6849918)))', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529083 59.6850544,30.4529184 59.6850114,30.4529378 59.6850121,30.4529398 59.6850009,30.4530221 59.685056,30.4530153 59.6850613,30.4529083 59.6850544)))', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528875 59.6851184,30.4529043 59.6850625,30.4530125 59.6850679,30.4530138 59.6850731,30.4528875 59.6851184)))', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739)))', 'way', 962382766, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528885 59.6851275,30.4530206 59.6850798,30.4530311 59.6850841,30.4530072 59.6851719,30.4529896 59.6851748,30.4528885 59.6851275)))', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533227 59.6850682,30.4533546 59.6849733,30.4533655 59.6849715,30.4534612 59.68503,30.4533332 59.6850719,30.4533227 59.6850682)))', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533411 59.685078,30.4534619 59.6850382,30.4534444 59.6850899,30.4533437 59.685083,30.4533411 59.685078)))', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233)))', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005)))', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532116 59.6849902,30.4532258 59.6849527,30.4533191 59.6849588,30.4533219 59.6849634,30.4532298 59.6849953,30.4532207 59.684992,30.4532116 59.6849902)))', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)))', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530763 59.6850024,30.453091 59.6849565,30.4531032 59.6849548,30.4531695 59.6849976,30.4531647 59.6850018,30.4531619 59.6850065,30.4530763 59.6850024)))', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547,30.4530603 59.6850515)))', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530791 59.6850599,30.4531749 59.6850252,30.4531799 59.6850271,30.4531863 59.6850287,30.4531735 59.6850722,30.453083 59.685065,30.4530791 59.6850599)))', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531903 59.6850727,30.453201 59.6850303,30.453211 59.6850297,30.4532223 59.6850274,30.4532816 59.6850715,30.4532727 59.6850781,30.4531903 59.6850727)))', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531253 59.6850083,30.4531279 59.6850008,30.4531334 59.6849938,30.4531415 59.6849874,30.4531519 59.6849819,30.4531642 59.6849776,30.4531779 59.6849745,30.4531926 59.6849729,30.4532076 59.6849728,30.4532224 59.6849741,30.4532363 59.6849768,30.453249 59.6849809,30.4532598 59.6849862,30.4532684 59.6849924,30.4532744 59.6849993,30.4532776 59.6850067,30.4532779 59.6850143,30.4532753 59.6850217,30.4532699 59.6850288,30.4532618 59.6850352,30.4532514 59.6850406,30.4532391 59.685045,30.4532253 59.685048,30.4532107 59.6850496,30.4531957 59.6850498,30.4531809 59.6850485,30.4531669 59.6850457,30.4531543 59.6850416,30.4531434 59.6850364,30.4531349 59.6850302,30.4531288 59.6850232,30.4531256 59.6850158,30.4531253 59.6850083)))', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903)))', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532247 59.6848893,30.453227 59.684886,30.4532321 59.6848835,30.4532389 59.6848826,30.4532457 59.6848833,30.4532511 59.6848856,30.4532538 59.6848889,30.4532531 59.6848924,30.4532493 59.6848954,30.4532432 59.6848971,30.4532362 59.6848972,30.4532299 59.6848957,30.4532257 59.6848928,30.4532247 59.6848893)))', 'way', 962678726, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530998 59.6849248,30.4531253 59.6848349,30.4531384 59.6848341,30.4532098 59.6848776,30.4532043 59.6848829,30.4532023 59.6848877,30.4532029 59.6848932,30.4532056 59.6848974,30.4531105 59.684928,30.4530998 59.6849248)))', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529683 59.6848711,30.4531034 59.6848301,30.4531127 59.6848333,30.4530868 59.6849239,30.4530724 59.6849262,30.4529683 59.6848711)))', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529482 59.6849246,30.452961 59.6848772,30.4530633 59.6849302,30.4530589 59.6849341,30.4529482 59.6849246)))', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531185 59.6849335,30.4532133 59.6849034,30.4532243 59.684907,30.4532339 59.6849085,30.4532455 59.6849087,30.4532581 59.6849071,30.4533269 59.6849477,30.4533222 59.6849516,30.4531212 59.684939,30.4531185 59.6849335)))', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452977 59.6848046,30.4529797 59.6847958,30.453536 59.6848401,30.4535329 59.6848493,30.452977 59.6848046)))', 'way', 962714214, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)))', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565,30.4533809 59.6849511)))', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533623 59.6849431,30.4533921 59.6848545,30.4534038 59.6848537,30.4534994 59.6849065,30.4533739 59.6849464,30.4533623 59.6849431)))', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)))', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529663 59.6848632,30.4529831 59.6848107,30.4530928 59.6848201,30.4530962 59.6848253,30.4529663 59.6848632)))', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531503 59.6848308,30.453158 59.6848262,30.4533614 59.6848416,30.4533642 59.6848467,30.4532706 59.684876,30.4532619 59.6848729,30.4532504 59.6848704,30.4532379 59.6848698,30.4532263 59.6848712,30.4532195 59.6848732,30.4531503 59.6848308)))', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452631 59.6847454,30.4526341 59.6847357,30.4528676 59.6847547,30.4528645 59.6847644,30.452631 59.6847454)))', 'way', 962735612, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530149 59.6847769,30.4530176 59.6847681,30.4535589 59.6848104,30.4535559 59.6848195,30.4530149 59.6847769)))', 'way', 962735613, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6847573,30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573)))', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523152 59.6851448,30.4526116 59.6847664,30.4528877 59.684789,30.4528309 59.6849691,30.4528148 59.6849678,30.4528061 59.6849952,30.4528221 59.6849965,30.45277 59.6851675,30.4527658 59.68518,30.4523152 59.6851448)))', 'relation', 12933782, '{"ref": "5", "name": "Кенконс", "genus": "Tilia", "name:en": "The Quincunx", "natural": "wood", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526128 59.684675,30.4526137 59.6846701,30.4526205 59.6846666,30.4526302 59.6846662,30.4526381 59.684669,30.4526406 59.6846738,30.4526365 59.6846782,30.4526277 59.6846803,30.4526184 59.684679,30.4526128 59.684675)))', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526042 59.6846709,30.4526082 59.6846655,30.452617 59.6846635,30.4528469 59.6846817,30.452843 59.684694,30.4528376 59.6847122,30.4526498 59.6846973,30.4526123 59.6846817,30.4526042 59.6846709)))', 'relation', 12933783, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530629 59.6847308,30.4530706 59.6847131,30.4530752 59.684699,30.4535863 59.6847456,30.4535811 59.6847595,30.4535752 59.6847748,30.4530629 59.6847308)))', 'relation', 12933784, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4534977 59.6852035,30.4534967 59.6852111,30.453492 59.6852191,30.4534813 59.6852261,30.4534692 59.6852309,30.4534524 59.6852342,30.453435 59.6852355,30.4534193 59.6852337,30.4534045 59.6852307,30.4533914 59.6852248,30.4533831 59.6852182,30.4533763 59.68521,30.4533752 59.6852006)))', 'relation', 12935640, '{"height": "5.5", "roof:shape": "pyramidal", "roof:colour": "#DADDE2", "roof:height": "0.5", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526773 59.6854805,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.4527511 59.6854859,30.4526773 59.6854805)))', 'relation', 12987950, '{"height": "1", "roof:shape": "skillion", "roof:colour": "grey", "roof:height": "1", "building:part": "yes", "roof:direction": "170", "building:colour": "#E4C78F", "roof:orientation": "along"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4526773 59.6854805,30.4527511 59.6854859,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528709 59.6855164,30.4527091 59.6855042,30.4525787 59.6854944)))', 'relation', 12935639, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4522474 59.6851858,30.4522167 59.6853009,30.4522119 59.6853269,30.4521905 59.6853763,30.4521596 59.6854203,30.4521293 59.6854701,30.4520946 59.6855262,30.4520624 59.6855804,30.4520524 59.6856064,30.452047 59.6856386,30.452047 59.6856666,30.4520551 59.685713,30.4520778 59.685798,30.4520997 59.6858613,30.4521127 59.6859046,30.4521047 59.6859432,30.4520825 59.6859825,30.4520478 59.686026,30.4520492 59.6860479,30.4520658 59.6860755,30.4520819 59.6860924,30.4521387 59.6861383,30.4521581 59.6861556,30.4521822 59.6861782,30.45222 59.6862149,30.4522535 59.6862461,30.4522676 59.6862668,30.4522828 59.6862897,30.4522911 59.6863104,30.4522992 59.6863312,30.4523018 59.6863618,30.4522989 59.6863961,30.4522911 59.6864255,30.452286 59.6864496,30.4522787 59.6864747,30.4522743 59.6864925,30.452274 59.6865148,30.4522776 59.6865312,30.4522888 59.6865538,30.4523045 59.686573,30.4523226 59.6865862,30.4523413 59.6865954,30.4523836 59.686613,30.4524214 59.6866244,30.4524614 59.686634,30.4524912 59.6866392,30.4525264 59.6866438,30.4525641 59.6866457,30.4526585 59.6866455,30.4527524 59.6866414,30.4528825 59.6866353,30.4530173 59.6866255,30.4531259 59.6866181,30.4531936 59.6866133,30.453271 59.6866114,30.4533083 59.686614,30.4534028 59.6866228,30.4535229 59.6866363,30.4536201 59.6866455,30.453691 59.6866508,30.4536976 59.6866508,30.4539823 59.6866673,30.4539778 59.6866919,30.4544217 59.6867427,30.4544227 59.6867377,30.4544646 59.686742,30.4544638 59.6867472,30.4545508 59.6867576,30.4545534 59.6867525,30.4545963 59.6867573,30.4546214 59.6867604,30.4546788 59.6867553,30.4548168 59.686752,30.4551163 59.6867835,30.4552388 59.6868093,30.4553945 59.6868602,30.455491 59.6869022,30.4555769 59.68694,30.4556466 59.6869672,30.4557807 59.6870023,30.4558987 59.6870186,30.4559816 59.68702,30.4560875 59.6870601,30.4561508 59.6871091,30.4561831 59.6871675,30.456183 59.687235,30.4561616 59.6872894,30.4561159 59.6873352,30.4560824 59.6873697,30.4560436 59.6874139,30.4560113 59.687453,30.4559765 59.6875127,30.4559804 59.6875356,30.4559953 59.6875601,30.4560395 59.6875816,30.4560838 59.6875938,30.4561467 59.6876019,30.4561991 59.6876021,30.4563573 59.6875979,30.4565289 59.6875961,30.4566782 59.6875933,30.4567611 59.687592,30.4568899 59.687586,30.4570005 59.6875828,30.4570995 59.6875755,30.4572099 59.6875697,30.4573214 59.6875781,30.4574243 59.6875895,30.4575564 59.6876086,30.4576489 59.6876236,30.4577906 59.6876357,30.4578929 59.687656,30.4579737 59.6876911,30.4580413 59.6877282,30.4581225 59.6877678,30.4581817 59.6878027,30.4582341 59.6878291,30.4583152 59.6878863,30.4583478 59.6879193,30.4583877 59.6879673,30.458411 59.6880122,30.4584387 59.6880452,30.4584657 59.6880811,30.4585427 59.6881373,30.4585748 59.6881735,30.4586375 59.6882236,30.4586938 59.6882576,30.4587833 59.6883125,30.45884 59.6883434,30.4588959 59.6883741,30.4589723 59.6884163,30.4590175 59.6884495,30.4590717 59.6884887,30.4591366 59.6885238,30.4591908 59.6885653,30.4592104 59.6886013,30.4592312 59.6886474,30.4592494 59.6886943,30.4592859 59.6887303,30.4593172 59.688773,30.4593556 59.6888131,30.459429 59.6888677,30.459467 59.6889042,30.4594979 59.688929,30.4595172 59.6889694,30.4595266 59.6890044,30.4595285 59.689042,30.4595248 59.6890919,30.4595255 59.6891719,30.4595317 59.6892178,30.4595442 59.6893129,30.4595387 59.689363,30.4595118 59.6894235,30.4594761 59.689469,30.4594014 59.6895068,30.4593069 59.6895588,30.4592476 59.6895966,30.4591945 59.6896312,30.4591511 59.6896562,30.4591092 59.6896944,30.4590843 59.6897378,30.4590826 59.689771,30.4590853 59.6898069,30.4591078 59.6898435,30.4592007 59.6898882,30.4592339 59.6899293,30.4592628 59.6899874,30.4592762 59.6900429,30.45928 59.6901025,30.4592809 59.6901575,30.4592798 59.6902243,30.4593042 59.6902777,30.4593662 59.6903178,30.4594544 59.6903409,30.4595249 59.6903674,30.4595807 59.6903944,30.4596268 59.6904316,30.4596583 59.6904756,30.4596087 59.690551,30.4596006 59.6905905,30.4595977 59.6906403,30.4595904 59.6906903,30.4595826 59.6907418,30.4595821 59.6908019,30.459583 59.6908375,30.459529 59.6908703,30.4594074 59.6909353,30.4592831 59.6909939,30.459213 59.6910431,30.4591817 59.691066,30.4591361 59.6911201,30.4591012 59.6911675,30.4591012 59.691223,30.4591406 59.6912486,30.4592295 59.6912875,30.4592895 59.6913173,30.4593728 59.6913444,30.4594455 59.6913593,30.459517 59.6913682,30.4596037 59.6913935,30.4596491 59.6914211,30.4596908 59.6914522,30.4597319 59.6914924,30.4597559 59.6915361,30.4597745 59.6915821,30.459787 59.6916313,30.4597852 59.6916643,30.4597718 59.6917238,30.4597396 59.6917861,30.4596859 59.6918429,30.4596685 59.6918693,30.4596383 59.6919054,30.4596009 59.6919405,30.4595315 59.6919991,30.4594652 59.6920502,30.4594082 59.6920946,30.4593773 59.6921151,30.4593545 59.6921348,30.4593366 59.6921529,30.4593399 59.6921734,30.4593659 59.6921939,30.4596045 59.6923272,30.4596496 59.6923362,30.4596901 59.6923377,30.4597398 59.6923315,30.4597933 59.6923156,30.4598526 59.6922792,30.4599141 59.692234,30.4600168 59.6921771,30.4600862 59.6921317,30.4601606 59.6921103,30.4602526 59.6920827,30.460323 59.6920633,30.4603814 59.6920333,30.4604812 59.6919715,30.4605362 59.6919506,30.4606073 59.6919499,30.4606743 59.6919675,30.4607467 59.6920081,30.4608017 59.6920284,30.4608728 59.6920473,30.4609935 59.6920595,30.4610726 59.692067,30.4611517 59.6920866,30.4612403 59.6921299,30.4612939 59.6921759,30.4613569 59.6922104,30.4614227 59.6922341,30.4614964 59.6922659,30.4615568 59.6923059,30.4616211 59.6923729,30.4616748 59.6924466,30.4617579 59.6925197,30.4618368 59.6925614,30.461948 59.6926074,30.4620442 59.6926525,30.4621643 59.6927115,30.4622732 59.6927583,30.4623906 59.6927971,30.4625398 59.6928238,30.4626554 59.6928355,30.4627278 59.6928346,30.4627807 59.6928331,30.4629009 59.6928193,30.4629797 59.6928093,30.4630314 59.6928086,30.4630815 59.6928162,30.4631241 59.6928309,30.4631433 59.692849,30.4631354 59.6928782,30.4630918 59.6929178,30.4629933 59.692982,30.4628509 59.6930395,30.4627989 59.693076,30.4627775 59.6931068,30.4627715 59.6931374,30.4627782 59.6931678,30.4628 59.6931938,30.462816 59.6932161,30.4628201 59.6932352,30.4628276 59.6932642,30.4628055 59.6932947,30.462749 59.6933555,30.4627356 59.6934076,30.4627544 59.6934638,30.4627866 59.6935491,30.4628348 59.6936025,30.4628814 59.6936516,30.4629464 59.6936976,30.4630181 59.6937555,30.4631033 59.6938351,30.463194 59.693908,30.4632997 59.6939707,30.4633997 59.6940315,30.4634563 59.6940722,30.4634978 59.6941112,30.4635448 59.6941433,30.4635995 59.6941633,30.4636618 59.6941785,30.4637065 59.6941778,30.4637604 59.694169,30.4638165 59.6941725,30.4638941 59.6941882,30.463945 59.6941973,30.4639826 59.6942136,30.4640155 59.6942304,30.4640341 59.6942422,30.4640539 59.694259,30.4640781 59.6942943,30.4641097 59.6943536,30.4641054 59.6943849,30.4640955 59.6944214,30.4640677 59.6944543,30.4640278 59.694509,30.4639684 59.6945921,30.4639761 59.694632,30.4640196 59.6946691,30.4640928 59.6947215,30.4641504 59.6947644,30.4642414 59.694848,30.4643013 59.6949614,30.4643265 59.6950347,30.4643629 59.6950927,30.464383 59.6951471,30.4644155 59.6951914,30.4644503 59.6952616,30.464467 59.6953187,30.4644779 59.6953885,30.4644493 59.6954307,30.4644137 59.6954645,30.4643477 59.6955048,30.4642827 59.6955528,30.4641331 59.6956106,30.4640324 59.6956546,30.4639589 59.6956973,30.4639054 59.6957548,30.4638826 59.6958068,30.4638917 59.6958626,30.4638959 59.695908,30.4638913 59.6959452,30.4638761 59.6959807,30.4638581 59.6960266,30.4638387 59.6960774,30.4638353 59.6961315,30.4638514 59.6962235,30.4639031 59.6963079,30.4639806 59.6963837,30.4640641 59.696435,30.4641563 59.6964993,30.4642492 59.6965314,30.464353 59.6965624,30.4645112 59.6966079,30.4646909 59.6966431,30.4648519 59.6966796,30.4649082 59.6966992,30.4649645 59.6967256,30.4650316 59.6967635,30.465104 59.6968014,30.4651737 59.6968352,30.4652724 59.696889,30.4653398 59.6969338,30.4653714 59.6969637,30.4653977 59.6970024,30.4654124 59.6970396,30.4654285 59.6970924,30.4654299 59.6971357,30.4654285 59.6971912,30.4654178 59.6972534,30.4654178 59.6973103,30.4654268 59.6973472,30.465443 59.6973849,30.4654739 59.6974306,30.465535 59.6974889,30.4655776 59.6975263,30.4655998 59.6975497,30.4656249 59.6975948,30.4656281 59.6976305,30.4656291 59.6976586,30.465636 59.697698,30.4656478 59.6977439,30.4656559 59.6977839,30.4656639 59.6978247,30.4656741 59.697865,30.4656808 59.6978977,30.4656931 59.6979479,30.4657242 59.6979888,30.4657651 59.6980369,30.4658049 59.6980618,30.4658569 59.6980859,30.4659085 59.6981101,30.4659691 59.6981356,30.4659934 59.6981619,30.4660187 59.6982125,30.4660434 59.6982506,30.4660765 59.6982913,30.46612 59.6983229,30.46618 59.6983645,30.4662324 59.6983954,30.466279 59.6984245,30.4663222 59.6984585,30.4663422 59.6984839,30.4663508 59.6985161,30.466347 59.6985389,30.4663297 59.6985658,30.4662984 59.6986043,30.4662667 59.6986353,30.4662287 59.6986639,30.4662098 59.6986996,30.4662023 59.698738,30.4662177 59.6987814,30.4662476 59.6988217,30.4662941 59.6988595,30.4663218 59.6988897,30.4663703 59.6989336,30.4664066 59.698983,30.4664342 59.6990318,30.46626 59.699006,30.4662245 59.6990009,30.4661986 59.6989985,30.465736 59.6989731,30.465674 59.6989864,30.4656438 59.6989955,30.4656194 59.6990058,30.4655995 59.6990178,30.4655881 59.6990296,30.4655669 59.6990522,30.4655425 59.6990838,30.4655077 59.6991223,30.4654429 59.6991855,30.4653481 59.6992218,30.4652461 59.6992516,30.4651852 59.6992621,30.4651339 59.6992648,30.4650235 59.6992651,30.4649339 59.6992741,30.4648662 59.6992863,30.4647744 59.6993078,30.4647108 59.6993347,30.4646409 59.6993755,30.4645943 59.6994397,30.4645313 59.6994729,30.464447 59.6994976,30.4643342 59.6995189,30.4641272 59.6995513,30.4601 59.6956121,30.4590933 59.6945995,30.4585195 59.6940453,30.4565283 59.6920253,30.4559963 59.6915691,30.455779 59.6913562,30.4555191 59.6911016,30.4536132 59.6892318,30.4533114 59.6893232,30.4532486 59.6892981,30.453085 59.689221,30.4529871 59.689177,30.4528879 59.6891357,30.4528128 59.6891072,30.4524488 59.6889751,30.4524008 59.688958,30.4523038 59.6889045,30.4522723 59.6888961,30.4522552 59.6888858,30.4522361 59.6888724,30.452216 59.68885,30.4521838 59.6888324,30.4521207 59.6887986,30.4520511 59.6887644,30.4518909 59.6886967,30.4517882 59.6886551,30.4516822 59.6886098,30.4515358 59.6885556,30.4514019 59.6885123,30.4513037 59.6884778,30.4512571 59.6884636,30.4512056 59.6884428,30.4511404 59.6884196,30.4510778 59.6883871,30.4510264 59.6883553,30.4509783 59.6883239,30.4508749 59.6882578,30.4508266 59.688226,30.4507678 59.6881981,30.4505943 59.6881208,30.4501869 59.6879433,30.4499736 59.6878632,30.4499334 59.6878503,30.4498881 59.687841,30.4497871 59.6878092,30.4494924 59.6876814,30.4490926 59.6875099,30.4490362 59.6874936,30.4489854 59.6874759,30.4489383 59.6874638,30.448876 59.687449,30.4487626 59.6874338,30.4486346 59.6874221,30.4485214 59.6874142,30.4483648 59.6874032,30.4474691 59.687337,30.4468361 59.6872873,30.4467403 59.6872722,30.446684 59.6872669,30.4463496 59.6872017,30.4463085 59.6871943,30.4462561 59.6871833,30.4462179 59.6871721,30.446187 59.6871613,30.4461557 59.68715,30.4461253 59.6871366,30.4461066 59.6871274,30.4460918 59.6871135,30.4460273 59.6870454,30.4459552 59.6870078,30.4459436 59.6870073,30.4459073 59.6869902,30.4458766 59.6869748,30.445846 59.6869616,30.4458216 59.6869518,30.4457961 59.6869433,30.4457578 59.6869309,30.4457123 59.6869183,30.4456647 59.6869057,30.4455949 59.6868892,30.4455514 59.68688,30.4455232 59.6868726,30.4455129 59.6868665,30.4453868 59.6868434,30.44531 59.6868381,30.4452457 59.6868322,30.44506 59.686812,30.4450028 59.6868076,30.4449557 59.6868041,30.4449237 59.6868029,30.4448943 59.6868019,30.4448734 59.6868039,30.4448512 59.6868054,30.4448212 59.6868026,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017)))', 'relation', 4187886, '{"ref": "II", "name": "Долина реки Славянки", "place": "quarter", "name:az": "Slavyanka çayının vadisi", "name:fr": "Vallée de la rivière Slavianka", "name:hy": "Սլավյանկա գետի հովիտ", "name:uk": "Долина річки Слов''янки", "name:zh": "谷斯拉维亚卡河", "boundary": "protected_area", "int_name": "Vallée de la rivière Slavianka", "wikidata": "Q121809341", "wikipedia": "ru:Павловский парк#Долина реки Славянки", "description": "Район Павловского парка"}', NULL),
('SRID=4326;LINESTRING(30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392)', 'way', 1297781094, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{8289295976,12023732271,12023732270,12023732269,8114975027,12023699867,12023732331,12023732330,12023732337,12023732336}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528788 59.6854915)', 'way', 1093902027, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,1439053668}'),
('SRID=4326;LINESTRING(30.4535894 59.6847601,30.4535811 59.6847595)', 'way', 1297781085, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{12023732332,8289295976}'),
('SRID=4326;LINESTRING(30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601)', 'way', 1297781086, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{12023732335,12023732334,12023732333,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4519927 59.6856654,30.451993 59.6856352,30.4519974 59.6856085,30.4520057 59.6855861,30.452033 59.685533,30.4520717 59.6854725,30.4521073 59.6854196,30.4521538 59.6853554,30.4521646 59.6853419,30.4521729 59.6853289,30.4521751 59.685321,30.4521778 59.6853033,30.4521768 59.6852884,30.4522278 59.6851794,30.4522474 59.6851858,30.4522695 59.6851929,30.4522692 59.6852184,30.452307 59.6852409,30.4523333 59.6852571,30.4523534 59.6852701,30.4523836 59.685295,30.4524088 59.6853175,30.4524395 59.6853504,30.4524616 59.6853789,30.4524735 59.685401,30.4524845 59.6854195,30.4524943 59.6854502,30.452497 59.6854882,30.452346 59.6854768,30.4523217 59.6855588,30.4522802 59.6855556,30.4522258 59.6855515,30.4522191 59.6855742,30.4522002 59.685638,30.4521808 59.6857036,30.4521745 59.6857248,30.4522289 59.6857289,30.4522705 59.6857319,30.4522477 59.6858088,30.4522804 59.6858113,30.4525803 59.6858339,30.4526091 59.6858361,30.4526832 59.6858416,30.4528205 59.685852,30.4528174 59.6858982,30.4527279 59.6859036,30.4527314 59.6859191,30.4527383 59.6859422,30.4527472 59.6859643,30.4527643 59.6859927,30.4527791 59.6860133,30.4527956 59.6860336,30.4528174 59.6860572,30.4528406 59.6860793,30.4528659 59.6861008,30.4528879 59.6861175,30.4529175 59.6861373,30.4529497 59.6861561,30.4529804 59.6861727,30.4530167 59.6861897,30.4530418 59.6861992,30.4530963 59.6861616,30.4531534 59.686184,30.4531278 59.6862023,30.453137 59.6862056,30.4531608 59.6862141,30.4531704 59.6862175,30.453196 59.6861992,30.4531795 59.686249,30.4531642 59.6862975,30.453138 59.686381,30.4531363 59.6863866,30.4532826 59.6863983,30.4532725 59.6864305,30.4532916 59.686432,30.4532869 59.6864462,30.4532998 59.6864473,30.4533248 59.6864494,30.4533485 59.6864515,30.4533611 59.6864525,30.4533659 59.6864383,30.4534768 59.6864467,30.453575 59.6864544,30.4535812 59.6864636,30.4536188 59.68646,30.4536556 59.6864553,30.4536952 59.6864492,30.4537376 59.6864434,30.4537814 59.6864354,30.4538212 59.6864281,30.453863 59.6864194,30.4538817 59.6864353,30.4539287 59.6864214,30.4539454 59.6864356,30.4539576 59.686432,30.4540057 59.6864176,30.4540172 59.6864141,30.4540005 59.6863999,30.4540399 59.6863883,30.4540219 59.6863729,30.4540549 59.6863624,30.4540887 59.6863495,30.4541297 59.6863344,30.4541407 59.6863296,30.4541607 59.6863411,30.4541696 59.6863371,30.4542 59.6863235,30.4542091 59.6863195,30.4541887 59.6863078,30.4541965 59.6863041,30.4542363 59.6862844,30.4542705 59.6862654,30.4542999 59.6862773,30.4544137 59.6862059,30.4543849 59.6861942,30.4544059 59.686181,30.4544395 59.686154,30.4544728 59.6861239,30.4544964 59.6860973,30.4545494 59.6861117,30.4546053 59.6861282,30.4545922 59.6861427,30.4545784 59.6861572,30.4545449 59.6861862,30.4545138 59.6862131,30.4544576 59.6862495,30.4543906 59.6862854,30.4543294 59.6863147,30.4542746 59.6863415,30.454221 59.6863683,30.454115 59.6864133,30.454039 59.6864407,30.4539464 59.6864693,30.4539252 59.6864763,30.4538233 59.6865047,30.4536724 59.6865094,30.4536724 59.6865223,30.4536503 59.6865223,30.4535973 59.686521,30.4535465 59.6865208,30.4535021 59.6865209,30.4534712 59.6865222,30.4534473 59.6865255,30.453429 59.6865331,30.4534215 59.6865438,30.4534132 59.686574,30.4534136 59.6865866,30.453423 59.6865971,30.4534445 59.6866075,30.4534686 59.686613,30.4534579 59.6866461,30.4534073 59.6866421,30.4533332 59.6866345,30.4532837 59.6866305,30.453254 59.6866292,30.4532071 59.6866305,30.4531615 59.686632,30.4531191 59.6866347,30.4531041 59.6865988,30.4531448 59.6865925,30.4531695 59.6865869,30.4531966 59.6865772,30.4532138 59.6865676,30.4532231 59.6865589,30.453199 59.6865568,30.4531811 59.6865532,30.4531596 59.6865468,30.4531373 59.6865396,30.4531219 59.6865326,30.4530964 59.6865196,30.4530733 59.6865042,30.4530555 59.6864887,30.4530367 59.6864681,30.4530227 59.6864499,30.4530105 59.6864274,30.4530012 59.6864103,30.4529945 59.6863933,30.4529919 59.6863759,30.4529905 59.686347,30.4529907 59.6863231,30.4529911 59.6862911,30.4529891 59.686281,30.4529827 59.6862715,30.4529634 59.6862545,30.4529402 59.6862373,30.4529067 59.6862141,30.4528563 59.6861801,30.4528201 59.6861533,30.4527906 59.6861317,30.4527578 59.6861047,30.452731 59.6860823,30.4527092 59.6860609,30.4526947 59.6860457,30.4526816 59.6860278,30.4526652 59.6860011,30.4526541 59.6859782,30.4526337 59.6859283,30.4526256 59.6859159,30.4526103 59.685908,30.4525905 59.6859034,30.4525603 59.6859009,30.452391 59.6858965,30.4523675 59.6858999,30.4523504 59.685904,30.4523333 59.6859114,30.452312 59.685923,30.4522313 59.6859637,30.4521811 59.6859882,30.452085 59.686032,30.4520765 59.6860386,30.4520753 59.6860476,30.4520797 59.6860577,30.4520264 59.6860652,30.4520201 59.6860504,30.4520162 59.6860346,30.4520143 59.6860207,30.4520168 59.6860051,30.4520203 59.685989,30.4520274 59.6859769,30.4520341 59.6859612,30.4520405 59.6859506,30.452047 59.6859415,30.4520537 59.6859259,30.4520544 59.6859134,30.4520523 59.6858956,30.4520465 59.6858708,30.4520254 59.6858069,30.4519995 59.68571,30.4519927 59.6856654),(30.4521704 59.6857398,30.4521704 59.6857513,30.4521744 59.6857635,30.4521811 59.6857763,30.4521945 59.6857899,30.4522187 59.6858021,30.4522414 59.6858088,30.4522629 59.685735,30.4521731 59.6857289,30.4521704 59.6857398),(30.452226 59.6855475,30.4523159 59.6855543,30.4523387 59.6854798,30.4523212 59.6854826,30.4523011 59.6854866,30.452277 59.6854941,30.4522596 59.6855015,30.4522448 59.6855117,30.4522354 59.6855225,30.4522301 59.6855347,30.452226 59.6855475),(30.4522508 59.6858359,30.4525647 59.6858582,30.4525714 59.6858373,30.4522575 59.6858142,30.4522508 59.6858359),(30.4523249 59.685462,30.4523727 59.6854667,30.4523804 59.6854465,30.4523327 59.6854418,30.4523249 59.685462)))', 'relation', 6636677, '{"surface": "fine_gravel", "area:highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533763 59.68521,30.4534979 59.6851951,30.4535038 59.6852069,30.4534995 59.6852209,30.4533878 59.6852355,30.4533818 59.6852214,30.4533763 59.68521)))', 'relation', 12947389, '{"height": "6", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523253 59.6851768,30.4523286 59.6851637,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4525881 59.6854311,30.452574 59.6853959,30.4525486 59.6853522,30.4525291 59.6853286,30.4525137 59.6853106,30.452501 59.6852981,30.4524755 59.6852751,30.452455 59.6852592,30.4524366 59.6852453,30.4524178 59.6852321,30.4523994 59.6852201,30.4523706 59.6852014,30.452339 59.6851839,30.4523253 59.6851768)))', 'relation', 5906400, '{"ref": "2", "name": "Цветочный партер", "leisure": "garden", "name:en": "The Flower Parterre", "ref:okn": "781620399040956", "alt_name": "Цветники Марии Фёдоровны", "wikidata": "Q118122045", "garden:type": "flowerbed", "garden:style": "french"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.4533268 59.6853074,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532343 59.6853363,30.453156 59.6852825)))', 'relation', 17755883, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4531158 59.6853933,30.4531719 59.6854212,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530216 59.6854636,30.4529242 59.6854401,30.4529045 59.6854337)))', 'relation', 17755885, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4532343 59.6853363,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.453238 59.6853862,30.453207 59.6854026,30.4531719 59.6854212,30.4531158 59.6853933,30.4530217 59.6853466)))', 'relation', 17755884, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527677 59.6846399,30.4527719 59.6846286,30.4527799 59.6846212,30.4527933 59.6846157,30.4528134 59.6846137,30.4528403 59.6846144,30.4528537 59.6846178,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399)))', 'relation', 12932608, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 1721132, '{"ref": "3", "name": "Павильон Трёх граций", "note": "Геометрические теги крыши павильона размещены отдельно", "name:es": "Pabellón de las tres gracias", "name:fr": "Pavillon des Trois Grâces", "name:pt": "Pavilhão das Três Graças", "name:zh": "三美人亭", "ref:okn": "781610399040356", "tourism": "attraction", "building": "yes", "heritage": "2", "historic": "yes", "wikidata": "Q112716431", "addr:city": "Павловск", "architect": "Чарльз Камерон", "start_date": "1800", "addr:street": "Садовая улица", "architect:en": "Charles Cameron", "addr:housenumber": "20 литЧ", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6514/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12202573, '{"height": "7", "min_height": "5.5", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "1", "building:part": "yes", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12497925, '{"height": "1.5", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525466 59.6846232,30.4525568 59.6846156,30.4525613 59.6846073,30.4525618 59.6845988,30.4525615 59.68459,30.4525675 59.6845745,30.452571 59.6845656,30.452566 59.6845558,30.4525539 59.6845467,30.4526659 59.6845694,30.4527826 59.6845897,30.4528946 59.6846069,30.4530012 59.6846212,30.4535732 59.6846878,30.4535916 59.6846905,30.453606 59.6846946,30.4536164 59.684701,30.4536208 59.6847085,30.4536214 59.684718,30.4536181 59.6847274,30.4536067 59.6847614,30.4535894 59.6847601,30.4535811 59.6847595,30.4535863 59.6847456,30.4535923 59.6847296,30.4535925 59.6847224,30.4535886 59.6847164,30.4535807 59.6847121,30.4535698 59.6847103,30.4535555 59.6847085,30.4530859 59.6846667,30.4530887 59.6846582,30.4530942 59.6846416,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399,30.4525841 59.6846239,30.4525626 59.6846222,30.4525466 59.6846232)))', 'relation', 12131779, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452047 59.6856386,30.4520524 59.6856064,30.4520624 59.6855804,30.4520946 59.6855262,30.4521293 59.6854701,30.4521596 59.6854203,30.4521905 59.6853763,30.4522119 59.6853269,30.4522167 59.6853009,30.4522474 59.6851858,30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4601554 59.6854805,30.4601767 59.6856005,30.4601793 59.6857568,30.4601468 59.6858374,30.4600081 59.6860973,30.459853 59.68614,30.459704 59.6863415,30.4596832 59.6864086,30.4596712 59.686482,30.4596638 59.6865545,30.459666 59.6866369,30.4596929 59.6867933,30.4597047 59.6868418,30.4597409 59.6869365,30.4598403 59.6871335,30.4599111 59.6872432,30.4599552 59.6873116,30.4600453 59.6874469,30.460134 59.687572,30.4600858 59.6875668,30.4600427 59.6875593,30.4599863 59.6875559,30.4598958 59.6875545,30.4597744 59.6875619,30.4597289 59.6875627,30.4596698 59.687583,30.4596323 59.6876026,30.4595974 59.6876371,30.4595625 59.6876658,30.4595236 59.6876852,30.459478 59.6876967,30.459407 59.6877062,30.4593453 59.6877028,30.4592849 59.6876838,30.4592367 59.6876553,30.4591509 59.6875883,30.4590905 59.6875599,30.4590355 59.6875424,30.4589524 59.6875261,30.4588343 59.6875105,30.4586868 59.6875038,30.4585474 59.6875038,30.4584333 59.6875086,30.4583274 59.6875126,30.4582348 59.6875193,30.4581437 59.6875301,30.4580095 59.6875505,30.4579371 59.6875654,30.4579009 59.6875782,30.4578312 59.6876019,30.4577386 59.6876249,30.4576489 59.6876236,30.4575564 59.6876086,30.4574243 59.6875895,30.4573214 59.6875781,30.4572099 59.6875697,30.4570995 59.6875755,30.4570005 59.6875828,30.4568899 59.687586,30.4567611 59.687592,30.4566782 59.6875933,30.4565289 59.6875961,30.4563573 59.6875979,30.4561991 59.6876021,30.4561467 59.6876019,30.4560838 59.6875938,30.4560395 59.6875816,30.4559953 59.6875601,30.4559804 59.6875356,30.4559765 59.6875127,30.4560113 59.687453,30.4560436 59.6874139,30.4560824 59.6873697,30.4561159 59.6873352,30.4561616 59.6872894,30.456183 59.687235,30.4561831 59.6871675,30.4561508 59.6871091,30.4560875 59.6870601,30.4559816 59.68702,30.4558987 59.6870186,30.4557807 59.6870023,30.4556466 59.6869672,30.4555769 59.68694,30.455491 59.6869022,30.4553945 59.6868602,30.4552388 59.6868093,30.4551163 59.6867835,30.4548168 59.686752,30.4546788 59.6867553,30.4546214 59.6867604,30.4545963 59.6867573,30.4545534 59.6867525,30.4545508 59.6867576,30.4544638 59.6867472,30.4544646 59.686742,30.4544227 59.6867377,30.4544217 59.6867427,30.4539778 59.6866919,30.4539823 59.6866673,30.4536976 59.6866508,30.453691 59.6866508,30.4536201 59.6866455,30.4535229 59.6866363,30.4534028 59.6866228,30.4533083 59.686614,30.453271 59.6866114,30.4531936 59.6866133,30.4531259 59.6866181,30.4530173 59.6866255,30.4528825 59.6866353,30.4527524 59.6866414,30.4526585 59.6866455,30.4525641 59.6866457,30.4525264 59.6866438,30.4524912 59.6866392,30.4524614 59.686634,30.4524214 59.6866244,30.4523836 59.686613,30.4523413 59.6865954,30.4523226 59.6865862,30.4523045 59.686573,30.4522888 59.6865538,30.4522776 59.6865312,30.452274 59.6865148,30.4522743 59.6864925,30.4522787 59.6864747,30.452286 59.6864496,30.4522911 59.6864255,30.4522989 59.6863961,30.4523018 59.6863618,30.4522992 59.6863312,30.4522911 59.6863104,30.4522828 59.6862897,30.4522676 59.6862668,30.4522535 59.6862461,30.45222 59.6862149,30.4521822 59.6861782,30.4521581 59.6861556,30.4521387 59.6861383,30.4520819 59.6860924,30.4520658 59.6860755,30.4520492 59.6860479,30.4520478 59.686026,30.4520825 59.6859825,30.4521047 59.6859432,30.4521127 59.6859046,30.4520997 59.6858613,30.4520778 59.685798,30.4520551 59.685713,30.452047 59.6856666,30.452047 59.6856386)))', 'relation', 4194432, '{"ref": "III", "name": "Придворцовый район", "place": "quarter", "name:fr": "Secteur central", "website": "https://pavlovskmuseum.ru/about/park/layout/36/", "boundary": "protected_area", "wikidata": "Q121809724", "wikipedia": "ru:Павловский парк#Центральный (Придворцовый) район", "description": "Район исторического Павловского парка"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4366882 59.6889898,30.4370373 59.6889668,30.4370736 59.6889644,30.4371138 59.6889367,30.4374634 59.6889115,30.4375002 59.6889088,30.4375427 59.6889059,30.4380171 59.6888738,30.438182 59.6888616,30.4383254 59.6888487,30.4384589 59.6888338,30.4385849 59.6888182,30.4388652 59.6887778,30.4389016 59.6887728,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346802 59.6935317,30.4346817 59.6935045,30.4346729 59.6934955,30.4346017 59.6934439,30.4344133 59.6933106,30.4344523 59.6932882,30.4344971 59.6932601,30.4345233 59.6932407,30.4345424 59.6932254,30.4345634 59.6932027,30.4345863 59.693171,30.4345979 59.6931498,30.4346066 59.6931248,30.4346128 59.6930889,30.434612 59.693054,30.4346077 59.6930245,30.4346019 59.6930124,30.4345969 59.693,30.4345757 59.6929702,30.4345621 59.6929518,30.434542 59.6929299,30.4345091 59.6928998,30.4344756 59.6928775,30.4344413 59.6928581,30.4343883 59.6928337,30.4343603 59.6928224,30.4343198 59.692809,30.4342705 59.6927958,30.4342429 59.6927909,30.4341796 59.6927811,30.4341217 59.6927737,30.4340777 59.6927708,30.4340075 59.6927673,30.4339293 59.6927692,30.4338474 59.6927768,30.433767 59.6927902,30.4337225 59.6928016,30.4335043 59.6926756,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)))', 'relation', 1721131, '{"name": "Павловский парк", "note": "https://wiki.openstreetmap.org/wiki/RU:Павловск/Павловский_парк", "leisure": "park", "name:be": "Паўлаўскі парк", "name:bg": "Павловски парк", "name:ca": "Parc Pàvlovsk", "name:en": "Pavlovsk Park", "name:es": "Parque Pávlovsk", "name:fr": "Parc de Pavlovsk", "name:he": "פארק פבלובסק", "name:hy": "Պավլովսկ պարկը", "name:nl": "Pavlovskpark", "name:ru": "Павловский парк", "name:zh": "巴甫洛夫斯克公园", "ref:okn": "781720399040986", "website": "https://pavlovskmuseum.ru/about/park/", "boundary": "protected_area", "heritage": "2", "historic": "yes", "int_name": "Parc de Pavlovsk", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q2506336", "wikipedia": "ru:Павловский парк", "fee:amount": "100", "start_date": "1777", "opening_hours": "07:00-19:00", "protect_class": "22", "operator:phone": "+7 (812) 452-15-36", "fee:conditional": "yes @ 9:00-17:00", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6407/", "operator:tourism": "museum", "operator:website": "http://www.pavlovskmuseum.ru", "protection_title": "Государственный музей-заповедник"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4368674 59.6896812,30.4373083 59.6896203,30.4383622 59.6894747,30.4383925 59.6894699,30.4387768 59.6894091,30.4389533 59.6893793,30.4395631 59.6892765,30.4395975 59.6896826,30.43963 59.6897841,30.4411104 59.6895883,30.4411759 59.6892872,30.4412059 59.6891298,30.4412229 59.6890714,30.4402547 59.6891154,30.4398722 59.6891396,30.4395358 59.6891608,30.4394903 59.6891472,30.4392717 59.6889536,30.4391469 59.6889286,30.4391174 59.6889211,30.4390705 59.6889062,30.4390316 59.6888852,30.4390007 59.6888636,30.4389819 59.6888446,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346174 59.6935301,30.4346147 59.6935224,30.4346086 59.6935129,30.4345932 59.6935014,30.4344744 59.6934215,30.4344752 59.6934118,30.4344684 59.6934032,30.4343048 59.693294,30.4335858 59.6928433,30.4335672 59.6928378,30.4335491 59.692831,30.4335344 59.6928246,30.4335169 59.6928158,30.4334908 59.6928019,30.4334747 59.6927935,30.4334378 59.6927735,30.4334063 59.6927569,30.4333486 59.6927221,30.4332896 59.6926848,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)),((30.4459925 59.6840515,30.4465029 59.6838166,30.4469327 59.6836721,30.4472874 59.6834226,30.4479163 59.6832392,30.4483415 59.6832476,30.4484247 59.6832514,30.4484595 59.6832547,30.4484884 59.6832585,30.4485108 59.6832641,30.4489705 59.6834352,30.4489993 59.6834563,30.4490069 59.6834636,30.4492468 59.6836887,30.4491255 59.6840718,30.4490543 59.6840686,30.4483928 59.684035,30.4478277 59.6840459,30.4469355 59.6841321,30.4462744 59.6842068,30.4459925 59.6840515)))', 'relation', 17990902, '{"name": "Государственный музей-заповедник «Павловск»", "note": "граница имущественного комплекса организации, не граница парка", "boundary": "protected_area", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q405637"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601,30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698)))', 'relation', 17786995, '{"landuse": "construction", "start_date": "06.204", "description": "реставрация Павильона Трех граций"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522477 59.6858088,30.4522705 59.6857319,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4527091 59.6855042,30.4528709 59.6855164,30.4529043 59.6855189,30.4529835 59.685525,30.4530542 59.6855302,30.4530286 59.6856166,30.4529796 59.6857822,30.4529559 59.6858622,30.4528897 59.6858572,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088)))', 'relation', 6636658, '{"height": "19.650", "architect": "Чарльз Камерон", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2.45", "building:part": "yes", "building:colour": "#FFE19C", "source:building:part": "http://pancer.ru/images/project/012/2.jpg"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4530216 59.6854636,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.453064 59.6855044,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 6636659, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528709 59.6855164,30.4528746 59.6855048,30.4528788 59.6854915,30.4529122 59.6854936,30.4529942 59.6854993,30.4529881 59.6855114,30.4529835 59.685525,30.4529043 59.6855189,30.4528709 59.6855164)))', 'relation', 14572596, '{"height": "6.65", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533818 59.6852214,30.453417 59.6852162,30.4534578 59.6852115,30.4535038 59.6852069,30.4535289 59.6853164,30.4535075 59.6853177,30.4534847 59.6853198,30.4534688 59.6853212,30.4534368 59.6853262,30.453436 59.6853248,30.4534146 59.6852887,30.4533878 59.6852355,30.4533818 59.6852214)))', 'relation', 17755881, '{"height": "13", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.453436 59.6853248,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533268 59.6853074,30.4532684 59.6852465)))', 'relation', 17755882, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.4533836 59.6852944,30.4533532 59.6853009,30.4533268 59.6853074,30.4532946 59.6853162,30.4532665 59.6853249,30.4532343 59.6853363,30.4532132 59.6853445,30.4531881 59.6853553,30.453164 59.6853668,30.4531411 59.6853788,30.4531158 59.6853933,30.4530954 59.6854062,30.4530746 59.6854199,30.4530552 59.6854344,30.4530382 59.6854491,30.4530216 59.6854636,30.4530079 59.6854761,30.4530004 59.6854886,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 17904735, '{"height": "10", "roof:shape": "flat", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.4528469 59.6846817,30.452843 59.684694,30.4529628 59.6847041,30.4530706 59.6847131,30.4530752 59.684699,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4535302 59.6851198,30.4535229 59.6851437,30.4535137 59.6851734,30.4535124 59.6851786,30.4535038 59.6852069,30.4534979 59.6851951,30.4534914 59.6851874,30.4534811 59.6851808,30.4534678 59.6851758,30.4534524 59.6851728,30.453436 59.6851719,30.4534196 59.6851732,30.4534028 59.6851772,30.4533891 59.6851835,30.4533796 59.6851915,30.4533752 59.6852006,30.4533763 59.68521,30.4533818 59.6852214,30.4533524 59.685227,30.4533302 59.6852316,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4528993 59.6854656,30.4528865 59.6854815,30.4528788 59.6854915,30.4528746 59.6855048,30.4527686 59.6854977,30.452777 59.6854654,30.4527565 59.685464,30.4527224 59.6854618,30.4526841 59.6854592,30.4526646 59.6854579,30.4526564 59.6854895,30.4525812 59.6854845,30.4525787 59.6854944,30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858,30.4522278 59.6851794)))', 'relation', 4274530, '{"fee": "yes", "ref": "IIIа", "name": "Собственный сад", "leisure": "garden", "name:fr": "Jardin privé", "ref:okn": "781620399040366", "tourism": "attraction", "alt_name": "Собственный садик", "boundary": "protected_area", "heritage": "2", "wikidata": "Q118122043", "start_date": "1803", "garden:style": "french", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6518/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4521745 59.6857248,30.4521808 59.6857036,30.4522002 59.685638,30.4522191 59.6855742,30.4522258 59.6855515,30.4522802 59.6855556,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533763 59.68521,30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540229 59.6848667,30.4540358 59.6848708,30.454047 59.6848759,30.4540561 59.6848821,30.454063 59.6848889,30.4540674 59.6848962,30.4540691 59.6849039,30.454068 59.6849115,30.4540643 59.6849189,30.454058 59.6849259,30.4540493 59.6849322,30.4540386 59.6849376,30.4540261 59.684942,30.4540122 59.6849452,30.4539975 59.684947,30.4539823 59.6849475,30.4539763 59.6849646,30.453965 59.6849637,30.4539277 59.6849606,30.4538688 59.6849558,30.4538059 59.6849506,30.4537818 59.6849487,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537483 59.6850789,30.4538612 59.6850876,30.4539247 59.6850925,30.4539406 59.6850424,30.4539786 59.6850519,30.4540221 59.685063,30.4540417 59.6850686,30.4540646 59.6850751,30.4541059 59.6850881,30.4541472 59.6851025,30.4541871 59.685118,30.4542254 59.6851343,30.4542622 59.6851516,30.4542942 59.6851377,30.4544115 59.6852076,30.4543838 59.6852203,30.4544141 59.6852392,30.4544426 59.6852588,30.4544691 59.6852791,30.4544972 59.6853031,30.4545225 59.6853279,30.4545451 59.6853534,30.4545829 59.6853462,30.4546442 59.6854282,30.4546081 59.6854351,30.4546263 59.6854611,30.4546407 59.6854917,30.4546513 59.6855211,30.4546577 59.6855509,30.4545667 59.6855569,30.4545695 59.6855677,30.4545502 59.6855689,30.4545521 59.6855762,30.454475 59.6855814,30.454473 59.685574,30.4544524 59.6855754,30.4544496 59.6855646,30.4544349 59.6855656,30.4543687 59.68557,30.4543619 59.6855441,30.4543522 59.6855184,30.4543439 59.6854971,30.4543247 59.685468,30.454307 59.6854434,30.4542866 59.6854194,30.4542636 59.6853959,30.4542381 59.6853732,30.4542062 59.685347,30.4541753 59.6853248,30.4541426 59.6853062,30.4541083 59.6852876,30.4540689 59.6852681,30.4540273 59.6852498,30.4539837 59.6852328,30.4539382 59.685217,30.4538908 59.6852026,30.4538877 59.6852126,30.4539316 59.6852158,30.4539299 59.6852218,30.4539248 59.68524,30.453923 59.6852463,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536921 59.6853643,30.4536766 59.6853631,30.453626 59.6853592,30.4536111 59.6853581,30.4536187 59.6853329,30.4534688 59.6853212,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.4532824 59.685393,30.4532679 59.6854007,30.4532019 59.6854356,30.4531881 59.6854429,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.45306 59.6855156,30.4530542 59.6855302,30.4530286 59.6856166,30.4530752 59.6856201,30.4531272 59.685624,30.4531226 59.6856395,30.4531 59.6857159,30.4530826 59.6857747,30.4530781 59.6857896,30.4530261 59.6857857,30.4529796 59.6857822,30.4529559 59.6858622,30.4529512 59.6858765,30.4529486 59.6858896,30.4529478 59.6859011,30.4529482 59.6859112,30.452952 59.685926,30.4529569 59.6859385,30.4529638 59.6859523,30.4529718 59.6859649,30.4529791 59.6859757,30.4529856 59.6859841,30.4530246 59.6859742,30.4530338 59.6859834,30.4530767 59.6860278,30.4530861 59.6860371,30.4530482 59.6860471,30.4530568 59.6860536,30.4530663 59.6860602,30.4530779 59.6860674,30.4530898 59.6860742,30.4531018 59.6860809,30.4531136 59.6860871,30.4531293 59.6860946,30.453148 59.6861029,30.4531695 59.6861116,30.4532167 59.6861306,30.4533686 59.6861421,30.453376 59.6861189,30.4533898 59.68612,30.4534436 59.6861244,30.453457 59.6861255,30.4534496 59.6861487,30.4536027 59.6861615,30.4535556 59.6863114,30.4535958 59.6863065,30.4536563 59.6862959,30.4537014 59.6862868,30.4537731 59.6862682,30.4538342 59.6862493,30.453879 59.6862345,30.4539364 59.686214,30.4539768 59.686198,30.45402 59.6861768,30.4540703 59.686148,30.4541119 59.6861223,30.4541469 59.6860952,30.4541742 59.6860729,30.4541995 59.6860505,30.4542215 59.6860272,30.4542918 59.6860451,30.4543031 59.6860479,30.4543127 59.6860386,30.45433 59.6860429,30.4543365 59.6860363,30.4544062 59.6860538,30.4543997 59.6860604,30.4544185 59.6860651,30.4544086 59.6860746,30.4544964 59.6860973,30.4544728 59.6861239,30.4544395 59.686154,30.4544059 59.686181,30.4543849 59.6861942,30.4544137 59.6862059,30.4542999 59.6862773,30.4542705 59.6862654,30.4542363 59.6862844,30.4541965 59.6863041,30.4541887 59.6863078,30.4542091 59.6863195,30.4542 59.6863235,30.4541696 59.6863371,30.4541607 59.6863411,30.4541407 59.6863296,30.4541297 59.6863344,30.4540887 59.6863495,30.4540549 59.6863624,30.4540219 59.6863729,30.4540399 59.6863883,30.4540005 59.6863999,30.4540172 59.6864141,30.4540057 59.6864176,30.4539576 59.686432,30.4539454 59.6864356,30.4539287 59.6864214,30.4538817 59.6864353,30.453863 59.6864194,30.4538212 59.6864281,30.4537814 59.6864354,30.4537376 59.6864434,30.4536952 59.6864492,30.4536556 59.6864553,30.4536188 59.68646,30.4535812 59.6864636,30.453575 59.6864544,30.4534768 59.6864467,30.4533659 59.6864383,30.4533611 59.6864525,30.4533485 59.6864515,30.4533248 59.6864494,30.4532998 59.6864473,30.4532869 59.6864462,30.4532916 59.686432,30.4532725 59.6864305,30.4532826 59.6863983,30.4531363 59.6863866,30.453138 59.686381,30.4531642 59.6862975,30.4531215 59.686294,30.4531372 59.6862455,30.4531795 59.686249,30.453196 59.6861992,30.4531704 59.6862175,30.4531608 59.6862141,30.453137 59.6862056,30.4531278 59.6862023,30.4531534 59.686184,30.4530963 59.6861616,30.4530418 59.6861992,30.4530167 59.6861897,30.4529804 59.6861727,30.4529497 59.6861561,30.4529175 59.6861373,30.4528879 59.6861175,30.4528659 59.6861008,30.4528406 59.6860793,30.4528174 59.6860572,30.4527956 59.6860336,30.4527791 59.6860133,30.4527643 59.6859927,30.4527472 59.6859643,30.4527383 59.6859422,30.4527314 59.6859191,30.4527279 59.6859036,30.4528174 59.6858982,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088,30.4522705 59.6857319,30.4522289 59.6857289,30.4521745 59.6857248)))', 'relation', 1759666, '{"name": "Павловский дворец", "name:ca": "Palau Pàvlovsk", "name:en": "Pavlovsk Palace", "name:fi": "Pavlovskin_palatsi", "name:fr": "Palais de Pavlovsk", "name:pt": "Palácio de Pavlovsk", "name:uz": "Pavlovsk saroyi", "name:zh": "巴甫洛夫斯克的宫殿", "ref:okn": "781610399040316", "tourism": "museum", "building": "palace", "historic": "yes", "int_name": "Palais de Pavlovsk", "wikidata": "Q118121947", "wikipedia": "ru:Павловский дворец", "start_date": "1782", "addr:street": "Садовая улица", "roof:colour": "#DADDE2", "building:colour": "#FFE19C", "addr:housenumber": "20 литА"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534688 59.6853212,30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536666 59.6853366,30.4536187 59.6853329,30.4534688 59.6853212)))', 'relation', 6636665, '{"name": "Южный корпус", "height": "15", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4534995 59.6852209)))', 'relation', 14572597, '{"height": "15", "roof:shape": "gabled", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540054 59.6848752,30.4537854 59.6848579,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537003 59.685133,30.453682 59.6851921,30.4535124 59.6851786)))', 'relation', 18019154, '{"height": "13", "roof:shape": "hipped", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL);
--Testcase 402:
SELECT count(*) FROM json_osm_test;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 404: オーク / Sồi
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 406:
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 407:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 408: 落葉性 / Cây rụng lá
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 409:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 410: 常緑植物 / Cây thường xanh
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 411:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 412: XVIII cent.
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 413:
DELETE FROM json_osm_test;
--Testcase 500:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/macaddr.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR"( "i" int OPTIONS (key 'true'), "m" macaddr) SERVER sqlite_svr OPTIONS (table 'type_MACADDR');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (1, '08:00:2b:01:02:03');
--Testcase 012:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (2, '08-00-2b-01-02-03');
--Testcase 013:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (3, '08002b:010203');
--Testcase 014:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (4, '08002b-010203');
--Testcase 015:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (5, '0800.2b01.0203');
--Testcase 016:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (6, '0800-2b01-0203');
--Testcase 017:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (7, '08002b010203');
--Testcase 018:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (8, '08:00:2F:01:02:03');
--Testcase 019:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (9, '08-00-2F-01-02-03');
--Testcase 020:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (10, '08002F:010203');
--Testcase 021:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (11, '08002F-010203');
--Testcase 022:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (12, '0800.2F01.0203');
--Testcase 023:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (13, '0800-2F01-0203');
--Testcase 024:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (14, '08002F010203');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (15, decode('08002F010203', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (16, decode('08002b010203', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE macaddr;
--Testcase 029:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (17, '08:00:2b:01:02:03');
--Testcase 030:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (18, '08-00-2b-01-02-03');
--Testcase 031:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (19, '08002b:010203');
--Testcase 032:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (20, '08002b-010203');
--Testcase 033:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (21, '0800.2b01.0203');
--Testcase 034:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (22, '0800-2b01-0203');
--Testcase 035:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (23, '08002b010203');
--Testcase 036:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (24, '08:00:2F:01:02:03');
--Testcase 037:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (25, '08-00-2F-01-02-03');
--Testcase 038:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (26, '08002F:010203');
--Testcase 039:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (27, '08002F-010203');
--Testcase 040:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (28, '0800.2F01.0203');
--Testcase 041:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (29, '0800-2F01-0203');
--Testcase 042:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (31, '08:00:2b:01:02:03');
--Testcase 046:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (32, '08-00-2b-01-02-03');
--Testcase 047:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (33, '08002b:010203');
--Testcase 048:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (34, '08002b-010203');
--Testcase 049:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (35, '0800.2b01.0203');
--Testcase 050:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (36, '0800-2b01-0203');
--Testcase 051:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (37, '08002b010203');
--Testcase 052:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (38, '08:00:2F:01:02:03');
--Testcase 053:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (39, '08-00-2F-01-02-03');
--Testcase 054:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (40, '08002F:010203');
--Testcase 055:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (41, '08002F-010203');
--Testcase 056:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (42, '0800.2F01.0203');
--Testcase 057:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (43, '0800-2F01-0203');
--Testcase 058:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (45, '08:00:2b:01:02:03');
--Testcase 062:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (46, '08-00-2b-01-02-03');
--Testcase 063:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (47, '08002b:010203');
--Testcase 064:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (48, '08002b-010203');
--Testcase 065:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (49, '0800.2b01.0203');
--Testcase 066:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (50, '0800-2b01-0203');
--Testcase 067:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (51, '08002b010203');
--Testcase 068:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (52, '08:00:2F:01:02:03');
--Testcase 069:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (53, '08-00-2F-01-02-03');
--Testcase 070:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (54, '08002F:010203');
--Testcase 071:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (55, '08002F-010203');
--Testcase 072:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (56, '0800.2F01.0203');
--Testcase 073:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (57, '0800-2F01-0203');
--Testcase 074:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR+"( "i" int OPTIONS (key 'true'), "m" macaddr, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR+');
--Testcase 077:
SELECT * FROM "type_MACADDR+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 084:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 088:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 091:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17; -- 9527026057731
--Testcase 098:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 106:
SELECT * FROM "type_MACADDR+";
--Testcase 107:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (59, '08:AA:2F:01:02:04');
--Testcase 108:
SELECT * FROM "type_MACADDR+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 111:
SELECT * FROM "type_MACADDR+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 115:
SELECT * FROM "type_MACADDR+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 119:
SELECT * FROM "type_MACADDR+";
--Testcase 120:
DELETE FROM "type_MACADDR";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (60, '01:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (61, '02:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (62, '03:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (63, '00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (64, '00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (65, '00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (66, '00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (67, '00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (68, '00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDRpk" (col macaddr OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDRpk" VALUES ('01-02-03-04-05-06');
--Testcase 159:
SELECT * FROM "type_MACADDRpk";
--Testcase 160:
DELETE FROM "type_MACADDRpk";
--no macaddr operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/macaddr8.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR8"( "i" int OPTIONS (key 'true'), "m" macaddr8) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (1, '08:00:2b:01:02:03:04:05');
--Testcase 012:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (2, '08-00-2b-01-02-03-04-05');
--Testcase 013:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (3, '08002b01:02030405');
--Testcase 014:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (4, '08002b01-02030405');
--Testcase 015:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (5, '0800.2b01.0203.0405');
--Testcase 016:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (6, '0800-2b01-0203-0405');
--Testcase 017:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (7, '08002b0102030405');
--Testcase 018:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (8, '08:00:2F:01:02:03:04:05');
--Testcase 019:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (9, '08-00-2F-01-02-03-04-05');
--Testcase 020:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (10, '08002F01:02030405');
--Testcase 021:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (11, '08002F01-02030405');
--Testcase 022:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (12, '0800.2F01.0203.0405');
--Testcase 023:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (13, '0800-2F01-0203-0405');
--Testcase 024:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (14, '08002F0102030405');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (15, decode('08002F0102030405', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (16, decode('08002b0102030405', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE macaddr8;
--Testcase 029:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (17, '08:00:2b:01:02:03:04:05');
--Testcase 030:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (18, '08-00-2b-01-02-03-04-05');
--Testcase 031:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (19, '08002b01:02030405');
--Testcase 032:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (20, '08002b01-02030405');
--Testcase 033:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (21, '0800.2b01.0203.0405');
--Testcase 034:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (22, '0800-2b01-0203-0405');
--Testcase 035:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (23, '08002b0102030405');
--Testcase 036:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (24, '08:00:2F:01:02:03:04:05');
--Testcase 037:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (25, '08-00-2F-01-02-03-04-05');
--Testcase 038:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (26, '08002F01:02030405');
--Testcase 039:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (27, '08002F01-02030405');
--Testcase 040:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (28, '0800.2F01.0203.0405');
--Testcase 041:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (29, '0800-2F01-0203-0405');
--Testcase 042:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (31, '08:00:2b:01:02:03:04:05');
--Testcase 046:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (32, '08-00-2b-01-02-03-04-05');
--Testcase 047:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (33, '08002b01:02030405');
--Testcase 048:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (34, '08002b01-02030405');
--Testcase 049:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (35, '0800.2b01.0203.0405');
--Testcase 050:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (36, '0800-2b01-0203-0405');
--Testcase 051:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (37, '08002b0102030405');
--Testcase 052:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (38, '08:00:2F:01:02:03:04:05');
--Testcase 053:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (39, '08-00-2F-01-02-03-04-05');
--Testcase 054:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (40, '08002F01:02030405');
--Testcase 055:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (41, '08002F01-02030405');
--Testcase 056:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (42, '0800.2F01.0203.0405');
--Testcase 057:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (43, '0800-2F01-0203-0405');
--Testcase 058:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (45, '08:00:2b:01:02:03:04:05');
--Testcase 062:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (46, '08-00-2b-01-02-03-04-05');
--Testcase 063:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (47, '08002b01:02030405');
--Testcase 064:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (48, '08002b01-02030405');
--Testcase 065:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (49, '0800.2b01.0203.0405');
--Testcase 066:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (50, '0800-2b01-0203-0405');
--Testcase 067:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (51, '08002b0102030405');
--Testcase 068:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (52, '08:00:2F:01:02:03:04:05');
--Testcase 069:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (53, '08-00-2F-01-02-03-04-05');
--Testcase 070:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (54, '08002F01:02030405');
--Testcase 071:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (55, '08002F01-02030405');
--Testcase 072:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (56, '0800.2F01.0203.0405');
--Testcase 073:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (57, '0800-2F01-0203-0405');
--Testcase 074:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR8+"( "i" int OPTIONS (key 'true'), "m" macaddr8, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8+');
--Testcase 077:
SELECT * FROM "type_MACADDR8+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 084:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 088:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 091:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 098:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 106:
SELECT * FROM "type_MACADDR8+";
--Testcase 107:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (59, '08:AA:2F:01:02:04:04:05');
--Testcase 108:
SELECT * FROM "type_MACADDR8+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 111:
SELECT * FROM "type_MACADDR8+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 115:
SELECT * FROM "type_MACADDR8+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 119:
SELECT * FROM "type_MACADDR8+";
--Testcase 120:
DELETE FROM "type_MACADDR8";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (60, '01:00:00:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (61, '02:00:00:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (62, '03:00:00:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (63, '00:00:00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (64, '00:00:00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (65, '00:00:00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (66, '00:00:00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (67, '00:00:00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (68, '00:00:00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR8" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR8" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDR8pk" (col macaddr8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDR8pk" VALUES ('01-02-03-04-05-06-07-08');
--Testcase 159:
SELECT * FROM "type_MACADDR8pk";
--Testcase 160:
DELETE FROM "type_MACADDR8pk";
--no macaddr8 operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR8";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/numeric.sql
================================================
--
-- NUMERIC
--
--Testcase 567:
CREATE EXTENSION sqlite_fdw;
--Testcase 568:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 569:
CREATE FOREIGN TABLE num_data (id int4 OPTIONS (key 'true'), val numeric(210,10)) SERVER sqlite_svr;
--Testcase 570:
CREATE FOREIGN TABLE num_exp_add (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 571:
CREATE FOREIGN TABLE num_exp_sub (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 572:
CREATE FOREIGN TABLE num_exp_div (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 573:
CREATE FOREIGN TABLE num_exp_mul (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 574:
CREATE FOREIGN TABLE num_exp_sqrt (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 575:
CREATE FOREIGN TABLE num_exp_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 576:
CREATE FOREIGN TABLE num_exp_log10 (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 577:
CREATE FOREIGN TABLE num_exp_power_10_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 1556:
CREATE FOREIGN TABLE num_variance (a numeric) SERVER sqlite_svr;
--Testcase 578:
CREATE FOREIGN TABLE num_result (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), result numeric(210,10)) SERVER sqlite_svr;
-- ******************************
-- * The following EXPECTED results are computed by bc(1)
-- * with a scale of 200
-- ******************************
BEGIN TRANSACTION;
--Testcase 1:
INSERT INTO num_exp_add VALUES (0,0,'0');
--Testcase 2:
INSERT INTO num_exp_sub VALUES (0,0,'0');
--Testcase 3:
INSERT INTO num_exp_mul VALUES (0,0,'0');
--Testcase 4:
INSERT INTO num_exp_div VALUES (0,0,'NaN');
--Testcase 5:
INSERT INTO num_exp_add VALUES (0,1,'0');
--Testcase 6:
INSERT INTO num_exp_sub VALUES (0,1,'0');
--Testcase 7:
INSERT INTO num_exp_mul VALUES (0,1,'0');
--Testcase 8:
INSERT INTO num_exp_div VALUES (0,1,'NaN');
--Testcase 9:
INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047');
--Testcase 10:
INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047');
--Testcase 11:
INSERT INTO num_exp_mul VALUES (0,2,'0');
--Testcase 12:
INSERT INTO num_exp_div VALUES (0,2,'0');
--Testcase 13:
INSERT INTO num_exp_add VALUES (0,3,'4.31');
--Testcase 14:
INSERT INTO num_exp_sub VALUES (0,3,'-4.31');
--Testcase 15:
INSERT INTO num_exp_mul VALUES (0,3,'0');
--Testcase 16:
INSERT INTO num_exp_div VALUES (0,3,'0');
--Testcase 17:
INSERT INTO num_exp_add VALUES (0,4,'7799461.4119');
--Testcase 18:
INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119');
--Testcase 19:
INSERT INTO num_exp_mul VALUES (0,4,'0');
--Testcase 20:
INSERT INTO num_exp_div VALUES (0,4,'0');
--Testcase 21:
INSERT INTO num_exp_add VALUES (0,5,'16397.038491');
--Testcase 22:
INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491');
--Testcase 23:
INSERT INTO num_exp_mul VALUES (0,5,'0');
--Testcase 24:
INSERT INTO num_exp_div VALUES (0,5,'0');
--Testcase 25:
INSERT INTO num_exp_add VALUES (0,6,'93901.57763026');
--Testcase 26:
INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026');
--Testcase 27:
INSERT INTO num_exp_mul VALUES (0,6,'0');
--Testcase 28:
INSERT INTO num_exp_div VALUES (0,6,'0');
--Testcase 29:
INSERT INTO num_exp_add VALUES (0,7,'-83028485');
--Testcase 30:
INSERT INTO num_exp_sub VALUES (0,7,'83028485');
--Testcase 31:
INSERT INTO num_exp_mul VALUES (0,7,'0');
--Testcase 32:
INSERT INTO num_exp_div VALUES (0,7,'0');
--Testcase 33:
INSERT INTO num_exp_add VALUES (0,8,'74881');
--Testcase 34:
INSERT INTO num_exp_sub VALUES (0,8,'-74881');
--Testcase 35:
INSERT INTO num_exp_mul VALUES (0,8,'0');
--Testcase 36:
INSERT INTO num_exp_div VALUES (0,8,'0');
--Testcase 37:
INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420');
--Testcase 38:
INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420');
--Testcase 39:
INSERT INTO num_exp_mul VALUES (0,9,'0');
--Testcase 40:
INSERT INTO num_exp_div VALUES (0,9,'0');
--Testcase 41:
INSERT INTO num_exp_add VALUES (1,0,'0');
--Testcase 42:
INSERT INTO num_exp_sub VALUES (1,0,'0');
--Testcase 43:
INSERT INTO num_exp_mul VALUES (1,0,'0');
--Testcase 44:
INSERT INTO num_exp_div VALUES (1,0,'NaN');
--Testcase 45:
INSERT INTO num_exp_add VALUES (1,1,'0');
--Testcase 46:
INSERT INTO num_exp_sub VALUES (1,1,'0');
--Testcase 47:
INSERT INTO num_exp_mul VALUES (1,1,'0');
--Testcase 48:
INSERT INTO num_exp_div VALUES (1,1,'NaN');
--Testcase 49:
INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047');
--Testcase 50:
INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047');
--Testcase 51:
INSERT INTO num_exp_mul VALUES (1,2,'0');
--Testcase 52:
INSERT INTO num_exp_div VALUES (1,2,'0');
--Testcase 53:
INSERT INTO num_exp_add VALUES (1,3,'4.31');
--Testcase 54:
INSERT INTO num_exp_sub VALUES (1,3,'-4.31');
--Testcase 55:
INSERT INTO num_exp_mul VALUES (1,3,'0');
--Testcase 56:
INSERT INTO num_exp_div VALUES (1,3,'0');
--Testcase 57:
INSERT INTO num_exp_add VALUES (1,4,'7799461.4119');
--Testcase 58:
INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119');
--Testcase 59:
INSERT INTO num_exp_mul VALUES (1,4,'0');
--Testcase 60:
INSERT INTO num_exp_div VALUES (1,4,'0');
--Testcase 61:
INSERT INTO num_exp_add VALUES (1,5,'16397.038491');
--Testcase 62:
INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491');
--Testcase 63:
INSERT INTO num_exp_mul VALUES (1,5,'0');
--Testcase 64:
INSERT INTO num_exp_div VALUES (1,5,'0');
--Testcase 65:
INSERT INTO num_exp_add VALUES (1,6,'93901.57763026');
--Testcase 66:
INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026');
--Testcase 67:
INSERT INTO num_exp_mul VALUES (1,6,'0');
--Testcase 68:
INSERT INTO num_exp_div VALUES (1,6,'0');
--Testcase 69:
INSERT INTO num_exp_add VALUES (1,7,'-83028485');
--Testcase 70:
INSERT INTO num_exp_sub VALUES (1,7,'83028485');
--Testcase 71:
INSERT INTO num_exp_mul VALUES (1,7,'0');
--Testcase 72:
INSERT INTO num_exp_div VALUES (1,7,'0');
--Testcase 73:
INSERT INTO num_exp_add VALUES (1,8,'74881');
--Testcase 74:
INSERT INTO num_exp_sub VALUES (1,8,'-74881');
--Testcase 75:
INSERT INTO num_exp_mul VALUES (1,8,'0');
--Testcase 76:
INSERT INTO num_exp_div VALUES (1,8,'0');
--Testcase 77:
INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420');
--Testcase 78:
INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420');
--Testcase 79:
INSERT INTO num_exp_mul VALUES (1,9,'0');
--Testcase 80:
INSERT INTO num_exp_div VALUES (1,9,'0');
--Testcase 81:
INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047');
--Testcase 82:
INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047');
--Testcase 83:
INSERT INTO num_exp_mul VALUES (2,0,'0');
--Testcase 84:
INSERT INTO num_exp_div VALUES (2,0,'NaN');
--Testcase 85:
INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047');
--Testcase 86:
INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047');
--Testcase 87:
INSERT INTO num_exp_mul VALUES (2,1,'0');
--Testcase 88:
INSERT INTO num_exp_div VALUES (2,1,'NaN');
--Testcase 89:
INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094');
--Testcase 90:
INSERT INTO num_exp_sub VALUES (2,2,'0');
--Testcase 91:
INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209');
--Testcase 92:
INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000');
--Testcase 93:
INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047');
--Testcase 94:
INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047');
--Testcase 95:
INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257');
--Testcase 96:
INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266');
--Testcase 97:
INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047');
--Testcase 98:
INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047');
--Testcase 99:
INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593');
--Testcase 100:
INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685');
--Testcase 101:
INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047');
--Testcase 102:
INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047');
--Testcase 103:
INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077');
--Testcase 104:
INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429');
--Testcase 105:
INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787');
--Testcase 106:
INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307');
--Testcase 107:
INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222');
--Testcase 108:
INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940');
--Testcase 109:
INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047');
--Testcase 110:
INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953');
--Testcase 111:
INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795');
--Testcase 112:
INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518');
--Testcase 113:
INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047');
--Testcase 114:
INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047');
--Testcase 115:
INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407');
--Testcase 116:
INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476');
--Testcase 117:
INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467');
--Testcase 118:
INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627');
--Testcase 119:
INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740');
--Testcase 120:
INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811');
--Testcase 121:
INSERT INTO num_exp_add VALUES (3,0,'4.31');
--Testcase 122:
INSERT INTO num_exp_sub VALUES (3,0,'4.31');
--Testcase 123:
INSERT INTO num_exp_mul VALUES (3,0,'0');
--Testcase 124:
INSERT INTO num_exp_div VALUES (3,0,'NaN');
--Testcase 125:
INSERT INTO num_exp_add VALUES (3,1,'4.31');
--Testcase 126:
INSERT INTO num_exp_sub VALUES (3,1,'4.31');
--Testcase 127:
INSERT INTO num_exp_mul VALUES (3,1,'0');
--Testcase 128:
INSERT INTO num_exp_div VALUES (3,1,'NaN');
--Testcase 129:
INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047');
--Testcase 130:
INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047');
--Testcase 131:
INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257');
--Testcase 132:
INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352');
--Testcase 133:
INSERT INTO num_exp_add VALUES (3,3,'8.62');
--Testcase 134:
INSERT INTO num_exp_sub VALUES (3,3,'0');
--Testcase 135:
INSERT INTO num_exp_mul VALUES (3,3,'18.5761');
--Testcase 136:
INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000');
--Testcase 137:
INSERT INTO num_exp_add VALUES (3,4,'7799465.7219');
--Testcase 138:
INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019');
--Testcase 139:
INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289');
--Testcase 140:
INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552');
--Testcase 141:
INSERT INTO num_exp_add VALUES (3,5,'16401.348491');
--Testcase 142:
INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491');
--Testcase 143:
INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621');
--Testcase 144:
INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504');
--Testcase 145:
INSERT INTO num_exp_add VALUES (3,6,'93905.88763026');
--Testcase 146:
INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026');
--Testcase 147:
INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206');
--Testcase 148:
INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595');
--Testcase 149:
INSERT INTO num_exp_add VALUES (3,7,'-83028480.69');
--Testcase 150:
INSERT INTO num_exp_sub VALUES (3,7,'83028489.31');
--Testcase 151:
INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35');
--Testcase 152:
INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240');
--Testcase 153:
INSERT INTO num_exp_add VALUES (3,8,'74885.31');
--Testcase 154:
INSERT INTO num_exp_sub VALUES (3,8,'-74876.69');
--Testcase 155:
INSERT INTO num_exp_mul VALUES (3,8,'322737.11');
--Testcase 156:
INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553');
--Testcase 157:
INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420');
--Testcase 158:
INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420');
--Testcase 159:
INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020');
--Testcase 160:
INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854');
--Testcase 161:
INSERT INTO num_exp_add VALUES (4,0,'7799461.4119');
--Testcase 162:
INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119');
--Testcase 163:
INSERT INTO num_exp_mul VALUES (4,0,'0');
--Testcase 164:
INSERT INTO num_exp_div VALUES (4,0,'NaN');
--Testcase 165:
INSERT INTO num_exp_add VALUES (4,1,'7799461.4119');
--Testcase 166:
INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119');
--Testcase 167:
INSERT INTO num_exp_mul VALUES (4,1,'0');
--Testcase 168:
INSERT INTO num_exp_div VALUES (4,1,'NaN');
--Testcase 169:
INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047');
--Testcase 170:
INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047');
--Testcase 171:
INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593');
--Testcase 172:
INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385');
--Testcase 173:
INSERT INTO num_exp_add VALUES (4,3,'7799465.7219');
--Testcase 174:
INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019');
--Testcase 175:
INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289');
--Testcase 176:
INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883');
--Testcase 177:
INSERT INTO num_exp_add VALUES (4,4,'15598922.8238');
--Testcase 178:
INSERT INTO num_exp_sub VALUES (4,4,'0');
--Testcase 179:
INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161');
--Testcase 180:
INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000');
--Testcase 181:
INSERT INTO num_exp_add VALUES (4,5,'7815858.450391');
--Testcase 182:
INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409');
--Testcase 183:
INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429');
--Testcase 184:
INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061');
--Testcase 185:
INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026');
--Testcase 186:
INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974');
--Testcase 187:
INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094');
--Testcase 188:
INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606');
--Testcase 189:
INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881');
--Testcase 190:
INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119');
--Testcase 191:
INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715');
--Testcase 192:
INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637');
--Testcase 193:
INSERT INTO num_exp_add VALUES (4,8,'7874342.4119');
--Testcase 194:
INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119');
--Testcase 195:
INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839');
--Testcase 196:
INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143');
--Testcase 197:
INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420');
--Testcase 198:
INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420');
--Testcase 199:
INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980');
--Testcase 200:
INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409');
--Testcase 201:
INSERT INTO num_exp_add VALUES (5,0,'16397.038491');
--Testcase 202:
INSERT INTO num_exp_sub VALUES (5,0,'16397.038491');
--Testcase 203:
INSERT INTO num_exp_mul VALUES (5,0,'0');
--Testcase 204:
INSERT INTO num_exp_div VALUES (5,0,'NaN');
--Testcase 205:
INSERT INTO num_exp_add VALUES (5,1,'16397.038491');
--Testcase 206:
INSERT INTO num_exp_sub VALUES (5,1,'16397.038491');
--Testcase 207:
INSERT INTO num_exp_mul VALUES (5,1,'0');
--Testcase 208:
INSERT INTO num_exp_div VALUES (5,1,'NaN');
--Testcase 209:
INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047');
--Testcase 210:
INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047');
--Testcase 211:
INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077');
--Testcase 212:
INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446');
--Testcase 213:
INSERT INTO num_exp_add VALUES (5,3,'16401.348491');
--Testcase 214:
INSERT INTO num_exp_sub VALUES (5,3,'16392.728491');
--Testcase 215:
INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621');
--Testcase 216:
INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584');
--Testcase 217:
INSERT INTO num_exp_add VALUES (5,4,'7815858.450391');
--Testcase 218:
INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409');
--Testcase 219:
INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429');
--Testcase 220:
INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192');
--Testcase 221:
INSERT INTO num_exp_add VALUES (5,5,'32794.076982');
--Testcase 222:
INSERT INTO num_exp_sub VALUES (5,5,'0');
--Testcase 223:
INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081');
--Testcase 224:
INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000');
--Testcase 225:
INSERT INTO num_exp_add VALUES (5,6,'110298.61612126');
--Testcase 226:
INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926');
--Testcase 227:
INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766');
--Testcase 228:
INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689');
--Testcase 229:
INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509');
--Testcase 230:
INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491');
--Testcase 231:
INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135');
--Testcase 232:
INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710');
--Testcase 233:
INSERT INTO num_exp_add VALUES (5,8,'91278.038491');
--Testcase 234:
INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509');
--Testcase 235:
INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571');
--Testcase 236:
INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228');
--Testcase 237:
INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420');
--Testcase 238:
INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420');
--Testcase 239:
INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220');
--Testcase 240:
INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427');
--Testcase 241:
INSERT INTO num_exp_add VALUES (6,0,'93901.57763026');
--Testcase 242:
INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026');
--Testcase 243:
INSERT INTO num_exp_mul VALUES (6,0,'0');
--Testcase 244:
INSERT INTO num_exp_div VALUES (6,0,'NaN');
--Testcase 245:
INSERT INTO num_exp_add VALUES (6,1,'93901.57763026');
--Testcase 246:
INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026');
--Testcase 247:
INSERT INTO num_exp_mul VALUES (6,1,'0');
--Testcase 248:
INSERT INTO num_exp_div VALUES (6,1,'NaN');
--Testcase 249:
INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787');
--Testcase 250:
INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307');
--Testcase 251:
INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222');
--Testcase 252:
INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823');
--Testcase 253:
INSERT INTO num_exp_add VALUES (6,3,'93905.88763026');
--Testcase 254:
INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026');
--Testcase 255:
INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206');
--Testcase 256:
INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907');
--Testcase 257:
INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026');
--Testcase 258:
INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974');
--Testcase 259:
INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094');
--Testcase 260:
INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469');
--Testcase 261:
INSERT INTO num_exp_add VALUES (6,5,'110298.61612126');
--Testcase 262:
INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926');
--Testcase 263:
INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766');
--Testcase 264:
INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679');
--Testcase 265:
INSERT INTO num_exp_add VALUES (6,6,'187803.15526052');
--Testcase 266:
INSERT INTO num_exp_sub VALUES (6,6,'0');
--Testcase 267:
INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676');
--Testcase 268:
INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000');
--Testcase 269:
INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974');
--Testcase 270:
INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026');
--Testcase 271:
INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610');
--Testcase 272:
INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980');
--Testcase 273:
INSERT INTO num_exp_add VALUES (6,8,'168782.57763026');
--Testcase 274:
INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026');
--Testcase 275:
INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906');
--Testcase 276:
INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184');
--Testcase 277:
INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160');
--Testcase 278:
INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680');
--Testcase 279:
INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920');
--Testcase 280:
INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789');
--Testcase 281:
INSERT INTO num_exp_add VALUES (7,0,'-83028485');
--Testcase 282:
INSERT INTO num_exp_sub VALUES (7,0,'-83028485');
--Testcase 283:
INSERT INTO num_exp_mul VALUES (7,0,'0');
--Testcase 284:
INSERT INTO num_exp_div VALUES (7,0,'NaN');
--Testcase 285:
INSERT INTO num_exp_add VALUES (7,1,'-83028485');
--Testcase 286:
INSERT INTO num_exp_sub VALUES (7,1,'-83028485');
--Testcase 287:
INSERT INTO num_exp_mul VALUES (7,1,'0');
--Testcase 288:
INSERT INTO num_exp_div VALUES (7,1,'NaN');
--Testcase 289:
INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047');
--Testcase 290:
INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953');
--Testcase 291:
INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795');
--Testcase 292:
INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700');
--Testcase 293:
INSERT INTO num_exp_add VALUES (7,3,'-83028480.69');
--Testcase 294:
INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31');
--Testcase 295:
INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35');
--Testcase 296:
INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974');
--Testcase 297:
INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881');
--Testcase 298:
INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119');
--Testcase 299:
INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715');
--Testcase 300:
INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686');
--Testcase 301:
INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509');
--Testcase 302:
INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491');
--Testcase 303:
INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135');
--Testcase 304:
INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574');
--Testcase 305:
INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974');
--Testcase 306:
INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026');
--Testcase 307:
INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610');
--Testcase 308:
INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294');
--Testcase 309:
INSERT INTO num_exp_add VALUES (7,7,'-166056970');
--Testcase 310:
INSERT INTO num_exp_sub VALUES (7,7,'0');
--Testcase 311:
INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225');
--Testcase 312:
INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000');
--Testcase 313:
INSERT INTO num_exp_add VALUES (7,8,'-82953604');
--Testcase 314:
INSERT INTO num_exp_sub VALUES (7,8,'-83103366');
--Testcase 315:
INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285');
--Testcase 316:
INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118');
--Testcase 317:
INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420');
--Testcase 318:
INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580');
--Testcase 319:
INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700');
--Testcase 320:
INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382');
--Testcase 321:
INSERT INTO num_exp_add VALUES (8,0,'74881');
--Testcase 322:
INSERT INTO num_exp_sub VALUES (8,0,'74881');
--Testcase 323:
INSERT INTO num_exp_mul VALUES (8,0,'0');
--Testcase 324:
INSERT INTO num_exp_div VALUES (8,0,'NaN');
--Testcase 325:
INSERT INTO num_exp_add VALUES (8,1,'74881');
--Testcase 326:
INSERT INTO num_exp_sub VALUES (8,1,'74881');
--Testcase 327:
INSERT INTO num_exp_mul VALUES (8,1,'0');
--Testcase 328:
INSERT INTO num_exp_div VALUES (8,1,'NaN');
--Testcase 329:
INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047');
--Testcase 330:
INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047');
--Testcase 331:
INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407');
--Testcase 332:
INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615');
--Testcase 333:
INSERT INTO num_exp_add VALUES (8,3,'74885.31');
--Testcase 334:
INSERT INTO num_exp_sub VALUES (8,3,'74876.69');
--Testcase 335:
INSERT INTO num_exp_mul VALUES (8,3,'322737.11');
--Testcase 336:
INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410');
--Testcase 337:
INSERT INTO num_exp_add VALUES (8,4,'7874342.4119');
--Testcase 338:
INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119');
--Testcase 339:
INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839');
--Testcase 340:
INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956');
--Testcase 341:
INSERT INTO num_exp_add VALUES (8,5,'91278.038491');
--Testcase 342:
INSERT INTO num_exp_sub VALUES (8,5,'58483.961509');
--Testcase 343:
INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571');
--Testcase 344:
INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456');
--Testcase 345:
INSERT INTO num_exp_add VALUES (8,6,'168782.57763026');
--Testcase 346:
INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026');
--Testcase 347:
INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906');
--Testcase 348:
INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424');
--Testcase 349:
INSERT INTO num_exp_add VALUES (8,7,'-82953604');
--Testcase 350:
INSERT INTO num_exp_sub VALUES (8,7,'83103366');
--Testcase 351:
INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285');
--Testcase 352:
INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172');
--Testcase 353:
INSERT INTO num_exp_add VALUES (8,8,'149762');
--Testcase 354:
INSERT INTO num_exp_sub VALUES (8,8,'0');
--Testcase 355:
INSERT INTO num_exp_mul VALUES (8,8,'5607164161');
--Testcase 356:
INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000');
--Testcase 357:
INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420');
--Testcase 358:
INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420');
--Testcase 359:
INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020');
--Testcase 360:
INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735');
--Testcase 361:
INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420');
--Testcase 362:
INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420');
--Testcase 363:
INSERT INTO num_exp_mul VALUES (9,0,'0');
--Testcase 364:
INSERT INTO num_exp_div VALUES (9,0,'NaN');
--Testcase 365:
INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420');
--Testcase 366:
INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420');
--Testcase 367:
INSERT INTO num_exp_mul VALUES (9,1,'0');
--Testcase 368:
INSERT INTO num_exp_div VALUES (9,1,'NaN');
--Testcase 369:
INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467');
--Testcase 370:
INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627');
--Testcase 371:
INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740');
--Testcase 372:
INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526');
--Testcase 373:
INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420');
--Testcase 374:
INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420');
--Testcase 375:
INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020');
--Testcase 376:
INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677');
--Testcase 377:
INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420');
--Testcase 378:
INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420');
--Testcase 379:
INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980');
--Testcase 380:
INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484');
--Testcase 381:
INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420');
--Testcase 382:
INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420');
--Testcase 383:
INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220');
--Testcase 384:
INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807');
--Testcase 385:
INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160');
--Testcase 386:
INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680');
--Testcase 387:
INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920');
--Testcase 388:
INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280');
--Testcase 389:
INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420');
--Testcase 390:
INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580');
--Testcase 391:
INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700');
--Testcase 392:
INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689');
--Testcase 393:
INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420');
--Testcase 394:
INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420');
--Testcase 395:
INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020');
--Testcase 396:
INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748');
--Testcase 397:
INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840');
--Testcase 398:
INSERT INTO num_exp_sub VALUES (9,9,'0');
--Testcase 399:
INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400');
--Testcase 400:
INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 401:
INSERT INTO num_exp_sqrt VALUES (0,'0');
--Testcase 402:
INSERT INTO num_exp_sqrt VALUES (1,'0');
--Testcase 403:
INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505');
--Testcase 404:
INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396');
--Testcase 405:
INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923');
--Testcase 406:
INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473');
--Testcase 407:
INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406');
--Testcase 408:
INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230');
--Testcase 409:
INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542');
--Testcase 410:
INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 411:
INSERT INTO num_exp_ln VALUES (0,'NaN');
--Testcase 412:
INSERT INTO num_exp_ln VALUES (1,'NaN');
--Testcase 413:
INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514');
--Testcase 414:
INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971');
--Testcase 415:
INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464');
--Testcase 416:
INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038');
--Testcase 417:
INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127');
--Testcase 418:
INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991');
--Testcase 419:
INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668');
--Testcase 420:
INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 421:
INSERT INTO num_exp_log10 VALUES (0,'NaN');
--Testcase 422:
INSERT INTO num_exp_log10 VALUES (1,'NaN');
--Testcase 423:
INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459');
--Testcase 424:
INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075');
--Testcase 425:
INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345');
--Testcase 426:
INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626');
--Testcase 427:
INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671');
--Testcase 428:
INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914');
--Testcase 429:
INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138');
--Testcase 430:
INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 431:
INSERT INTO num_exp_power_10_ln VALUES (0,'NaN');
--Testcase 432:
INSERT INTO num_exp_power_10_ln VALUES (1,'NaN');
--Testcase 433:
INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184');
--Testcase 434:
INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393');
--Testcase 435:
INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636');
--Testcase 436:
INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098');
--Testcase 437:
INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067');
--Testcase 438:
INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627');
--Testcase 439:
INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952');
--Testcase 440:
INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 441:
INSERT INTO num_data VALUES (0, '0');
--Testcase 442:
INSERT INTO num_data VALUES (1, '0');
--Testcase 443:
INSERT INTO num_data VALUES (2, '-34338492.215397047');
--Testcase 444:
INSERT INTO num_data VALUES (3, '4.31');
--Testcase 445:
INSERT INTO num_data VALUES (4, '7799461.4119');
--Testcase 446:
INSERT INTO num_data VALUES (5, '16397.038491');
--Testcase 447:
INSERT INTO num_data VALUES (6, '93901.57763026');
--Testcase 448:
INSERT INTO num_data VALUES (7, '-83028485');
--Testcase 449:
INSERT INTO num_data VALUES (8, '74881');
--Testcase 450:
INSERT INTO num_data VALUES (9, '-24926804.045047420');
COMMIT TRANSACTION;
-- ******************************
-- * Create indices for faster checks
-- ******************************
-- Skip these setting, creating foreign table with primary key already covered.
--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
-- ******************************
--Testcase 451:
DELETE FROM num_result;
--Testcase 452:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val
FROM num_data t1, num_data t2;
--Testcase 453:
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;
--Testcase 454:
DELETE FROM num_result;
--Testcase 455:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10)
FROM num_data t1, num_data t2;
--Testcase 456:
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
-- ******************************
--Testcase 457:
DELETE FROM num_result;
--Testcase 458:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val
FROM num_data t1, num_data t2;
--Testcase 459:
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;
--Testcase 460:
DELETE FROM num_result;
--Testcase 461:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40)
FROM num_data t1, num_data t2;
--Testcase 462:
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
-- ******************************
--Testcase 463:
DELETE FROM num_result;
--Testcase 464:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val
FROM num_data t1, num_data t2;
--Testcase 465:
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;
--Testcase 466:
DELETE FROM num_result;
--Testcase 467:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30)
FROM num_data t1, num_data t2;
--Testcase 468:
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
-- ******************************
--Testcase 469:
DELETE FROM num_result;
--Testcase 470:
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';
--Testcase 471:
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;
--Testcase 472:
DELETE FROM num_result;
--Testcase 473:
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';
--Testcase 474:
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
-- ******************************
--Testcase 475:
DELETE FROM num_result;
--Testcase 476:
INSERT INTO num_result SELECT id, 0, SQRT(ABS(val))
FROM num_data;
--Testcase 477:
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
-- ******************************
--Testcase 478:
DELETE FROM num_result;
--Testcase 479:
INSERT INTO num_result SELECT id, 0, LN(ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 480:
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
-- ******************************
--Testcase 481:
DELETE FROM num_result;
--Testcase 482:
INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 483:
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
-- ******************************
--Testcase 484:
DELETE FROM num_result;
--Testcase 485:
INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
FROM num_data
WHERE val != '0.0';
--Testcase 486:
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.
-- ******************************
--Testcase 1451:
CREATE FOREIGN TABLE v (id int4 OPTIONS (key 'true'), x numeric, val float8) SERVER sqlite_svr;
BEGIN;
--Testcase 1452:
DELETE FROM v;
--Testcase 1453:
INSERT INTO v(x) VALUES ('0'::float8),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan');
--Testcase 1454:
SELECT x1, x2,
x1::numeric + x2::numeric AS sum,
x1::numeric - x2::numeric AS diff,
x1::numeric * x2::numeric AS prod
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1455:
SELECT x1, x2,
x1::numeric / x2::numeric AS quot,
x1::numeric % x2::numeric AS mod,
div(x1::numeric, x2::numeric) AS div
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x2 != 0;
ROLLBACK;
BEGIN;
--Testcase 1286:
DELETE FROM v;
--Testcase 1287:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1288:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1289:
DELETE FROM v;
--Testcase 1290:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1291:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1292:
DELETE FROM v;
--Testcase 1293:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1294:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1295:
DELETE FROM v;
--Testcase 1296:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1297:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1298:
DELETE FROM v;
--Testcase 1299:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1300:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1301:
DELETE FROM v;
--Testcase 1302:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1303:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1304:
DELETE FROM v;
--Testcase 1305:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1306:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1307:
DELETE FROM v;
--Testcase 1308:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1309:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1310:
DELETE FROM v;
--Testcase 1311:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1312:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1313:
DELETE FROM v;
--Testcase 1314:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1315:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1316:
DELETE FROM v;
--Testcase 1317:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1318:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1319:
DELETE FROM v;
--Testcase 1320:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1321:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1456:
DELETE FROM v;
--Testcase 1457:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1458:
SELECT x, -x as minusx, abs(x::numeric), floor(x::numeric), ceil(x::numeric), sign(x::numeric), numeric_inc(x::numeric) as inc
FROM v;
ROLLBACK;
BEGIN;
--Testcase 1459:
DELETE FROM v;
--Testcase 1460:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1461:
SELECT x, round(x::numeric), round(x::numeric,1) as round1, trunc(x::numeric), trunc(x::numeric,1) as trunc1
FROM v;
ROLLBACK;
-- the large values fall into the numeric abbreviation code's maximal classes
BEGIN;
--Testcase 1462:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),
('inf'),('-inf'),('nan'),
('inf'),('-inf'),('nan');
--Testcase 1463:
SELECT substring(x::text, 1, 32) FROM v ORDER BY x;
ROLLBACK;
--Testcase 1464:
DELETE FROM v;
--Testcase 1465:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('4.2'),('inf'),('nan');
--Testcase 1466:
SELECT x, sqrt(x) FROM v;
--Testcase 1333:
DELETE FROM v;
--Testcase 1334:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1335:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1336:
DELETE FROM v;
--Testcase 1337:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1338:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1467:
DELETE FROM v;
--Testcase 1468:
INSERT INTO v(x) VALUES ('1'::numeric),('4.2'),('inf'),('nan');
--Testcase 1469:
SELECT x,
log(x::numeric),
log10(x::numeric),
ln(x::numeric)
FROM v;
--Testcase 1342:
DELETE FROM v;
--Testcase 1343:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1344:
SELECT ln(x::numeric) FROM v;
--Testcase 1345:
DELETE FROM v;
--Testcase 1346:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1347:
SELECT ln(x::numeric) FROM v;
--Testcase 1348:
DELETE FROM v;
--Testcase 1349:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1350:
SELECT ln(x::numeric) FROM v;
--Testcase 1470:
DELETE FROM v;
--Testcase 1471:
INSERT INTO v(x) VALUES ('2'::numeric),('4.2'),('inf'),('nan');
--Testcase 1472:
SELECT x1, x2,
log(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1354:
DELETE FROM v;
--Testcase 1355:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1356:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1357:
DELETE FROM v;
--Testcase 1358:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1359:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1360:
DELETE FROM v;
--Testcase 1361:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1362:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1363:
DELETE FROM v;
--Testcase 1364:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1365:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1366:
DELETE FROM v;
--Testcase 1367:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1368:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1369:
DELETE FROM v;
--Testcase 1370:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1371:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1372:
DELETE FROM v;
--Testcase 1373:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1374:
SELECT log(x::numeric, 'inf') FROM v;
--Testcase 1473:
DELETE FROM v;
--Testcase 1474:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('2'),('4.2'),('inf'),('nan');
--Testcase 1475:
SELECT x1, x2,
power(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x1 != 0 OR x2 >= 0;
--Testcase 1378:
DELETE FROM v;
--Testcase 1379:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1380:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1381:
DELETE FROM v;
--Testcase 1382:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1383:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1384:
DELETE FROM v;
--Testcase 1385:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1386:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1387:
DELETE FROM v;
--Testcase 1388:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1389:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1390:
DELETE FROM v;
--Testcase 1391:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1392:
SELECT power(x::numeric, '3.3') FROM v;
--Testcase 1393:
DELETE FROM v;
--Testcase 1394:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1395:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1396:
DELETE FROM v;
--Testcase 1397:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1398:
SELECT power(x::numeric, '-1.5') FROM v;
--Testcase 1399:
DELETE FROM v;
--Testcase 1400:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1401:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1402:
DELETE FROM v;
--Testcase 1403:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1404:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1405:
DELETE FROM v;
--Testcase 1406:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1407:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1408:
DELETE FROM v;
--Testcase 1409:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1410:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1411:
DELETE FROM v;
--Testcase 1412:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1413:
SELECT power(x::numeric, '2') FROM v;
--Testcase 1414:
DELETE FROM v;
--Testcase 1415:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1416:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1417:
DELETE FROM v;
--Testcase 1418:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1419:
SELECT power(x::numeric, '4.5') FROM v;
--Testcase 1420:
DELETE FROM v;
--Testcase 1421:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1422:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1423:
DELETE FROM v;
--Testcase 1424:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1425:
SELECT power(x::numeric, '-3') FROM v;
--Testcase 1426:
DELETE FROM v;
--Testcase 1427:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1428:
SELECT power(x::numeric, '0') FROM v;
--Testcase 1429:
DELETE FROM v;
--Testcase 1430:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1431:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1432:
DELETE FROM v;
--Testcase 1433:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1434:
SELECT power(x::numeric, '-inf') FROM v;
-- ******************************
-- * miscellaneous checks for things that have been broken in the past...
-- ******************************
-- numeric AVG used to fail on some platforms
--Testcase 487:
SELECT AVG(val) FROM num_data;
--Testcase 1137:
SELECT MAX(val) FROM num_data;
--Testcase 1138:
SELECT MIN(val) FROM num_data;
--Testcase 488:
SELECT STDDEV(val) FROM num_data;
--Testcase 489:
SELECT VARIANCE(val) FROM num_data;
-- Check for appropriate rounding and overflow
--Testcase 579:
CREATE FOREIGN TABLE fract_only (id int, val numeric(4,4)) SERVER sqlite_svr;
--Testcase 490:
INSERT INTO fract_only VALUES (1, '0.0');
--Testcase 491:
INSERT INTO fract_only VALUES (2, '0.1');
--Testcase 492:
INSERT INTO fract_only VALUES (3, '1.0'); -- should fail
--Testcase 493:
INSERT INTO fract_only VALUES (4, '-0.9999');
--Testcase 494:
INSERT INTO fract_only VALUES (5, '0.99994');
--Testcase 495:
INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail
--Testcase 496:
INSERT INTO fract_only VALUES (7, '0.00001');
--Testcase 497:
INSERT INTO fract_only VALUES (8, '0.00017');
--Testcase 1139:
INSERT INTO fract_only VALUES (9, 'NaN');
--Testcase 1140:
INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail
--Testcase 1141:
INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail
--Testcase 498:
SELECT * FROM fract_only;
--Testcase 580:
DROP FOREIGN TABLE fract_only;
-- Check conversion to integers
-- SQLite promises to preserve the first 15 significant decimal digits of the floating point value.
-- However, it makes no guarantees about the accuracy of computations on floating point values, as no such guarantees are possible.
-- A floating-point value as written in an SQL statement may not be the same as the value represented internally.
-- Actual result is different from expected result.
--Testcase 1485:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 1486:
DELETE FROM num_tmp;
--Testcase 1487:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.5);
--Testcase 1488:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1489:
DELETE FROM num_tmp;
--Testcase 1490:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.4);
--Testcase 1491:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1492:
DELETE FROM num_tmp;
--Testcase 1493:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.4);
--Testcase 1494:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1495:
DELETE FROM num_tmp;
--Testcase 1496:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.5);
--Testcase 1497:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1498:
DELETE FROM num_tmp;
--Testcase 1499:
INSERT INTO num_tmp(n1) VALUES (-2147483648.5);
--Testcase 1500:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1501:
DELETE FROM num_tmp;
--Testcase 1502:
INSERT INTO num_tmp(n1) VALUES (-2147483648.4);
--Testcase 1503:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1504:
DELETE FROM num_tmp;
--Testcase 1505:
INSERT INTO num_tmp(n1) VALUES (2147483647.4);
--Testcase 1506:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1507:
DELETE FROM num_tmp;
--Testcase 1508:
INSERT INTO num_tmp(n1) VALUES (2147483647.5);
--Testcase 1509:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1510:
DELETE FROM num_tmp;
--Testcase 1511:
INSERT INTO num_tmp(n1) VALUES (-32768.5);
--Testcase 1512:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1513:
DELETE FROM num_tmp;
--Testcase 1514:
INSERT INTO num_tmp(n1) VALUES (-32768.4);
--Testcase 1515:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1516:
DELETE FROM num_tmp;
--Testcase 1517:
INSERT INTO num_tmp(n1) VALUES (32767.4);
--Testcase 1518:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1519:
DELETE FROM num_tmp;
--Testcase 1520:
INSERT INTO num_tmp(n1) VALUES (32767.5);
--Testcase 1521:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1555:
DELETE FROM num_tmp;
--Testcase 1555:
DROP FOREIGN TABLE num_tmp;
-- Check inf/nan conversion behavior
--Testcase 581:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 582:
DELETE FROM FLOAT8_TMP;
--Testcase 583:
INSERT INTO FLOAT8_TMP VALUES ('NaN');
--Testcase 584:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 585:
DELETE FROM FLOAT8_TMP;
--Testcase 586:
INSERT INTO FLOAT8_TMP VALUES ('Infinity');
--Testcase 587:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 588:
DELETE FROM FLOAT8_TMP;
--Testcase 589:
INSERT INTO FLOAT8_TMP VALUES ('-Infinity');
--Testcase 590:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 1142:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, f2 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1143:
DELETE FROM NUMERIC_TMP;
--Testcase 1144:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1145:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1146:
DELETE FROM NUMERIC_TMP;
--Testcase 1147:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1148:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1149:
DELETE FROM NUMERIC_TMP;
--Testcase 1150:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1151:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 591:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 592:
DELETE FROM FLOAT4_TMP;
--Testcase 593:
INSERT INTO FLOAT4_TMP VALUES ('NaN');
--Testcase 594:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 595:
DELETE FROM FLOAT4_TMP;
--Testcase 596:
INSERT INTO FLOAT4_TMP VALUES ('Infinity');
--Testcase 597:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 598:
DELETE FROM FLOAT4_TMP;
--Testcase 599:
INSERT INTO FLOAT4_TMP VALUES ('-Infinity');
--Testcase 600:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 1152:
DELETE FROM NUMERIC_TMP;
--Testcase 1153:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1154:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1155:
DELETE FROM NUMERIC_TMP;
--Testcase 1156:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1157:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1158:
DELETE FROM NUMERIC_TMP;
--Testcase 1159:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1160:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1161:
DELETE FROM NUMERIC_TMP;
--Testcase 1162:
INSERT INTO NUMERIC_TMP VALUES ('42'::int2);
--Testcase 1163:
SELECT f1::numeric FROM NUMERIC_TMP;
--Testcase 1164:
DELETE FROM NUMERIC_TMP;
--Testcase 1165:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1166:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1167:
DELETE FROM NUMERIC_TMP;
--Testcase 1168:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1169:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1170:
DELETE FROM NUMERIC_TMP;
--Testcase 1171:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1172:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1173:
DELETE FROM NUMERIC_TMP;
--Testcase 1174:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1175:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1176:
DELETE FROM NUMERIC_TMP;
--Testcase 1177:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1178:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1179:
DELETE FROM NUMERIC_TMP;
--Testcase 1180:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1181:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1182:
DELETE FROM NUMERIC_TMP;
--Testcase 1183:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1184:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1185:
DELETE FROM NUMERIC_TMP;
--Testcase 1186:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1187:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1188:
DELETE FROM NUMERIC_TMP;
--Testcase 1189:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1190:
SELECT f1::int8 FROM NUMERIC_TMP;
-- Simple check that ceil(), floor(), and round() work correctly
--Testcase 601:
CREATE FOREIGN TABLE ceil_floor_round (a numeric OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 499:
INSERT INTO ceil_floor_round VALUES ('-5.5');
--Testcase 500:
INSERT INTO ceil_floor_round VALUES ('-5.499999');
--Testcase 501:
INSERT INTO ceil_floor_round VALUES ('9.5');
--Testcase 502:
INSERT INTO ceil_floor_round VALUES ('9.4999999');
--Testcase 503:
INSERT INTO ceil_floor_round VALUES ('0.0');
--Testcase 504:
INSERT INTO ceil_floor_round VALUES ('0.0000001');
--Testcase 505:
INSERT INTO ceil_floor_round VALUES ('-0.000001');
--Testcase 506:
SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round ORDER BY a;
-- Check rounding, it should round ties away from zero.
--Testcase 602:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 603:
DELETE FROM INT4_TMP;
--Testcase 604:
INSERT INTO INT4_TMP SELECT a FROM generate_series(-5,5) a;
--Testcase 605:
SELECT f1 as pow,
round((-2.5 * 10 ^ f1)::numeric, -f1),
round((-1.5 * 10 ^ f1)::numeric, -f1),
round((-0.5 * 10 ^ f1)::numeric, -f1),
round((0.5 * 10 ^ f1)::numeric, -f1),
round((1.5 * 10 ^ f1)::numeric, -f1),
round((2.5 * 10 ^ f1)::numeric, -f1)
FROM INT4_TMP;
-- Testing for width_bucket(). For convenience, we test both the
-- numeric and float8 versions of the function in this file.
-- errors
--Testcase 606:
CREATE FOREIGN TABLE width_bucket_tbl (
id1 numeric,
id2 numeric,
id3 numeric,
id4 int,
id int OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 607:
DELETE FROM width_bucket_tbl;
--Testcase 608:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 609:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 610:
DELETE FROM width_bucket_tbl;
--Testcase 611:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 612:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 613:
DELETE FROM width_bucket_tbl;
--Testcase 614:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 615:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 616:
DELETE FROM width_bucket_tbl;
--Testcase 617:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 618:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 619:
DELETE FROM width_bucket_tbl;
--Testcase 620:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 621:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 622:
DELETE FROM width_bucket_tbl;
--Testcase 623:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 624:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 625:
DELETE FROM width_bucket_tbl;
--Testcase 626:
INSERT INTO width_bucket_tbl VALUES ('NaN'::numeric, 3.0, 4.0, 888);
--Testcase 627:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 628:
DELETE FROM width_bucket_tbl;
--Testcase 629:
INSERT INTO width_bucket_tbl VALUES (0, 'NaN'::numeric, 4.0, 888);
--Testcase 630:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 1191:
DELETE FROM width_bucket_tbl;
--Testcase 1192:
INSERT INTO width_bucket_tbl VALUES (2.0, 3.0, '-inf'::numeric, 888);
--Testcase 1193:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 1194:
DELETE FROM width_bucket_tbl;
--Testcase 1195:
INSERT INTO width_bucket_tbl VALUES (0, '-inf'::numeric, 4.0 , 888);
--Testcase 1196:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
-- normal operation
--Testcase 631:
CREATE FOREIGN TABLE width_bucket_test (
operand_num numeric OPTIONS (key 'true'),
operand_f8 float8
) SERVER sqlite_svr;
--COPY width_bucket_test (operand_num) FROM stdin;
--Testcase 507:
INSERT INTO width_bucket_test (operand_num) 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);
--Testcase 508:
UPDATE width_bucket_test SET operand_f8 = operand_num::float8;
--Testcase 509:
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
--Testcase 1197:
DELETE FROM width_bucket_tbl;
--Testcase 1198:
INSERT INTO width_bucket_tbl VALUES (0.0, 'Infinity'::numeric , 5, 10);
--Testcase 1199:
SELECT width_bucket(id1::numeric, 'Infinity'::numeric, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 1200:
DELETE FROM width_bucket_tbl;
--Testcase 1201:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, '-Infinity'::numeric, 20);
--Testcase 1202:
SELECT width_bucket(id1::numeric, id2, '-Infinity'::numeric, id4) FROM width_bucket_tbl; -- error
--Testcase 1203:
DELETE FROM width_bucket_tbl;
--Testcase 1204:
INSERT INTO width_bucket_tbl VALUES ('Infinity'::numeric, 1, 10, 10), ('-Infinity'::numeric, 1, 10, 10);
--Testcase 1205:
SELECT width_bucket(id1::numeric, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 510:
DELETE FROM width_bucket_tbl;
-- postgres does not support insert 'Infinity' and '-Infinity' as numeric.
--Testcase 632:
INSERT INTO width_bucket_tbl VALUES (0.0, 0.0, 5, 10);
--Testcase 633:
SELECT width_bucket(id1::float8, 'Infinity'::float8, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 511:
DELETE FROM width_bucket_tbl;
--Testcase 634:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, 0.0, 20);
--Testcase 635:
SELECT width_bucket(id1::float8, id2, 'Infinity'::float8, id4) FROM width_bucket_tbl; -- error
--Testcase 512:
DELETE FROM width_bucket_tbl;
--Testcase 636:
INSERT INTO width_bucket_tbl VALUES (0.0, 1, 10, 10);
--Testcase 637:
SELECT width_bucket('Infinity'::float8, id2, id3, id4), width_bucket('-Infinity'::float8, id2, id3, id4) FROM width_bucket_tbl;
-- Simple test for roundoff error when results should be exact
--Testcase 1445:
DELETE FROM width_bucket_tbl;
--Testcase 1446:
INSERT INTO width_bucket_tbl SELECT x, 10, 100, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1447:
SELECT id1, width_bucket(id1::float8, id2, id3, id4) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
--Testcase 1448:
DELETE FROM width_bucket_tbl;
--Testcase 1449:
INSERT INTO width_bucket_tbl SELECT x, 100, 10, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1450:
SELECT id1, width_bucket(id1::float8, 100, 10, 9) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(0, -1e100::numeric, 1, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(0, -1e100::float8, 1, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(1, 1e100::numeric, 0, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(1, 1e100::float8, 0, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
-- Check cases that could trigger overflow or underflow within the calculation
SELECT oper, low, high, cnt, width_bucket(oper, low, high, cnt)
FROM
(SELECT 1.797e+308::float8 AS big, 5e-324::float8 AS tiny) as v,
LATERAL (VALUES
(10.5::float8, -big, big, 1),
(10.5::float8, -big, big, 2),
(10.5::float8, -big, big, 3),
(big / 4, -big / 2, big / 2, 10),
(10.5::float8, big, -big, 1),
(10.5::float8, big, -big, 2),
(10.5::float8, big, -big, 3),
(big / 4, big / 2, -big / 2, 10),
(0, 0, tiny, 4),
(tiny, 0, tiny, 4),
(0, 0, 1, 2147483647),
(1, 1, 0, 2147483647)
) as sample(oper, low, high, cnt);
-- These fail because the result would be out of int32 range:
-- Do not convert to check right.
SELECT width_bucket(1::float8, 0, 1, 2147483647);
SELECT width_bucket(0::float8, 1, 0, 2147483647);
--Testcase 638:
DROP FOREIGN TABLE width_bucket_test;
-- TO_CHAR()
--
--Testcase 513:
SELECT to_char(val, '9G999G999G999G999G999')
FROM num_data;
--Testcase 514:
SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999')
FROM num_data;
--Testcase 515:
SELECT to_char(val, '9999999999999999.999999999999999PR')
FROM num_data;
--Testcase 516:
SELECT to_char(val, '9999999999999999.999999999999999S')
FROM num_data;
--Testcase 517:
SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data;
--Testcase 518:
SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data;
--Testcase 519:
SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data;
--Testcase 520:
SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data;
--Testcase 521:
SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data;
--Testcase 522:
SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data;
--Testcase 523:
SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data;
--Testcase 524:
SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data;
--Testcase 525:
SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data;
--Testcase 526:
SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data;
--Testcase 527:
SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data;
--Testcase 528:
SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data;
--Testcase 529:
SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data;
--Testcase 530:
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;
--Testcase 531:
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;
--Testcase 532:
SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data;
--Testcase 533:
SELECT to_char(val, '999999SG9999999999') FROM num_data;
--Testcase 534:
SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data;
--Testcase 535:
SELECT to_char(val, '9.999EEEE') FROM num_data;
--Testcase 1476:
DELETE FROM v;
--Testcase 1477:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1478:
SELECT x,
to_char(x, '9.999EEEE') as numeric,
to_char(x::float8, '9.999EEEE') as float8,
to_char(x::float4, '9.999EEEE') as float4
FROM v;
--Testcase 1522:
DELETE FROM v;
--Testcase 1523:
INSERT INTO v(x) VALUES (-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0),
(1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071);
--Testcase 1524:
SELECT x,
to_char(('1.2345e'||x)::numeric, '9.999EEEE') as numeric
FROM v;
--Testcase 1479:
DELETE FROM v;
--Testcase 1480:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1481:
SELECT x,
to_char(x, 'MI9999999999.99') as numeric,
to_char(x::float8, 'MI9999999999.99') as float8,
to_char(x::float4, 'MI9999999999.99') as float4
FROM v;
--Testcase 1482:
DELETE FROM v;
--Testcase 1483:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1484:
SELECT x,
to_char(x, 'MI99.99') as numeric,
to_char(x::float8, 'MI99.99') as float8,
to_char(x::float4, 'MI99.99') as float4
FROM v;
--Testcase 536:
DELETE FROM ceil_floor_round;
--Testcase 537:
INSERT INTO ceil_floor_round VALUES ('100'::numeric);
--Testcase 538:
SELECT to_char(a, 'FM999.9') FROM ceil_floor_round;
--Testcase 539:
SELECT to_char(a, 'FM999.') FROM ceil_floor_round;
--Testcase 540:
SELECT to_char(a, 'FM999') FROM ceil_floor_round;
CREATE FOREIGN TABLE ceil_round_float8(a float8) SERVER sqlite_svr;
INSERT INTO ceil_round_float8 VALUES ('12345678901'::float8);
SELECT to_char(a, 'FM9999999999D9999900000000000000000') FROM ceil_round_float8;
-- Check parsing of literal text in a format string
--Testcase 541:
SELECT to_char(a, 'foo999') FROM ceil_floor_round;
--Testcase 542:
SELECT to_char(a, 'f\oo999') FROM ceil_floor_round;
--Testcase 543:
SELECT to_char(a, 'f\\oo999') FROM ceil_floor_round;
--Testcase 544:
SELECT to_char(a, 'f\"oo999') FROM ceil_floor_round;
--Testcase 545:
SELECT to_char(a, 'f\\"oo999') FROM ceil_floor_round;
--Testcase 546:
SELECT to_char(a, 'f"ool"999') FROM ceil_floor_round;
--Testcase 547:
SELECT to_char(a, 'f"\ool"999') FROM ceil_floor_round;
--Testcase 548:
SELECT to_char(a, 'f"\\ool"999') FROM ceil_floor_round;
--Testcase 549:
SELECT to_char(a, 'f"ool\"999') FROM ceil_floor_round;
--Testcase 550:
SELECT to_char(a, 'f"ool\\"999') FROM ceil_floor_round;
-- TO_NUMBER()
--
--Testcase 639:
create foreign table to_number_tbl (a text, id int options (key 'true')) server sqlite_svr;
--Testcase 1211:
SET lc_numeric = 'C';
--Testcase 640:
DELETE FROM to_number_tbl;
--Testcase 641:
INSERT INTO to_number_tbl VALUES ('-34,338,492');
--Testcase 642:
SELECT to_number(a, '99G999G999') FROM to_number_tbl;
--Testcase 643:
DELETE FROM to_number_tbl;
--Testcase 644:
INSERT INTO to_number_tbl VALUES ('-34,338,492.654,878');
--Testcase 645:
SELECT to_number(a, '99G999G999D999G999') FROM to_number_tbl;
--Testcase 646:
DELETE FROM to_number_tbl;
--Testcase 647:
INSERT INTO to_number_tbl VALUES ('<564646.654564>');
--Testcase 648:
SELECT to_number(a, '999999.999999PR') FROM to_number_tbl;
--Testcase 649:
DELETE FROM to_number_tbl;
--Testcase 650:
INSERT INTO to_number_tbl VALUES ('0.00001-');
--Testcase 651:
SELECT to_number(a, '9.999999S') FROM to_number_tbl;
--Testcase 652:
DELETE FROM to_number_tbl;
--Testcase 653:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 654:
SELECT to_number(a, 'FM9.999999S') FROM to_number_tbl;
--Testcase 655:
DELETE FROM to_number_tbl;
--Testcase 656:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 657:
SELECT to_number(a, 'FM9.999999MI') FROM to_number_tbl;
--Testcase 658:
DELETE FROM to_number_tbl;
--Testcase 659:
INSERT INTO to_number_tbl VALUES ('5 4 4 4 4 8 . 7 8');
--Testcase 660:
SELECT to_number(a, '9 9 9 9 9 9 . 9 9') FROM to_number_tbl;
--Testcase 661:
DELETE FROM to_number_tbl;
--Testcase 662:
INSERT INTO to_number_tbl VALUES ('.01');
--Testcase 663:
SELECT to_number(a, 'FM9.99') FROM to_number_tbl;
--Testcase 664:
DELETE FROM to_number_tbl;
--Testcase 665:
INSERT INTO to_number_tbl VALUES ('.0');
--Testcase 666:
SELECT to_number(a, '99999999.99999999') FROM to_number_tbl;
--Testcase 667:
DELETE FROM to_number_tbl;
--Testcase 668:
INSERT INTO to_number_tbl VALUES ('0');
--Testcase 669:
SELECT to_number(a, '99.99') FROM to_number_tbl;
--Testcase 670:
DELETE FROM to_number_tbl;
--Testcase 671:
INSERT INTO to_number_tbl VALUES ('.-01');
--Testcase 672:
SELECT to_number(a, 'S99.99') FROM to_number_tbl;
--Testcase 673:
DELETE FROM to_number_tbl;
--Testcase 674:
INSERT INTO to_number_tbl VALUES ('.01-');
--Testcase 675:
SELECT to_number(a, '99.99S') FROM to_number_tbl;
--Testcase 676:
DELETE FROM to_number_tbl;
--Testcase 677:
INSERT INTO to_number_tbl VALUES (' . 0 1-');
--Testcase 678:
SELECT to_number(a, ' 9 9 . 9 9 S') FROM to_number_tbl;
--Testcase 679:
DELETE FROM to_number_tbl;
--Testcase 680:
INSERT INTO to_number_tbl VALUES ('34,50');
--Testcase 681:
SELECT to_number(a,'999,99') FROM to_number_tbl;
--Testcase 682:
DELETE FROM to_number_tbl;
--Testcase 683:
INSERT INTO to_number_tbl VALUES ('123,000');
--Testcase 684:
SELECT to_number(a,'999G') FROM to_number_tbl;
--Testcase 685:
DELETE FROM to_number_tbl;
--Testcase 686:
INSERT INTO to_number_tbl VALUES ('123456');
--Testcase 687:
SELECT to_number(a,'999G999') FROM to_number_tbl;
--Testcase 688:
DELETE FROM to_number_tbl;
--Testcase 689:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 690:
SELECT to_number(a,'L9,999.99') FROM to_number_tbl;
--Testcase 691:
DELETE FROM to_number_tbl;
--Testcase 692:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 693:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 694:
DELETE FROM to_number_tbl;
--Testcase 695:
INSERT INTO to_number_tbl VALUES ('$1,234.56');
--Testcase 696:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 697:
DELETE FROM to_number_tbl;
--Testcase 698:
INSERT INTO to_number_tbl VALUES ('1234.56');
--Testcase 699:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 700:
DELETE FROM to_number_tbl;
--Testcase 701:
INSERT INTO to_number_tbl VALUES ('1,234.56');
--Testcase 702:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 703:
DELETE FROM to_number_tbl;
--Testcase 704:
INSERT INTO to_number_tbl VALUES ('42nd');
--Testcase 705:
SELECT to_number(a, '99th') FROM to_number_tbl;
--Testcase 1212:
RESET lc_numeric;
--
-- Input syntax
--
--Testcase 706:
CREATE FOREIGN TABLE num_input_test (n1 numeric) SERVER sqlite_svr;
-- good inputs
--Testcase 551:
INSERT INTO num_input_test(n1) VALUES (' 123');
--Testcase 552:
INSERT INTO num_input_test(n1) VALUES (' 3245874 ');
--Testcase 553:
INSERT INTO num_input_test(n1) VALUES (' -93853');
--Testcase 554:
INSERT INTO num_input_test(n1) VALUES ('555.50');
--Testcase 555:
INSERT INTO num_input_test(n1) VALUES ('-555.50');
--Testcase 556:
INSERT INTO num_input_test(n1) VALUES ('NaN ');
--Testcase 557:
INSERT INTO num_input_test(n1) VALUES (' nan');
--Testcase 1213:
INSERT INTO num_input_test(n1) VALUES (' inf ');
--Testcase 1214:
INSERT INTO num_input_test(n1) VALUES (' +inf ');
--Testcase 1215:
INSERT INTO num_input_test(n1) VALUES (' -inf ');
--Testcase 1216:
INSERT INTO num_input_test(n1) VALUES (' Infinity ');
--Testcase 1217:
INSERT INTO num_input_test(n1) VALUES (' +inFinity ');
--Testcase 1218:
INSERT INTO num_input_test(n1) VALUES (' -INFINITY ');
INSERT INTO num_input_test(n1) VALUES ('12_000_000_000');
INSERT INTO num_input_test(n1) VALUES ('12_000.123_456');
INSERT INTO num_input_test(n1) VALUES ('23_000_000_000e-1_0');
INSERT INTO num_input_test(n1) VALUES ('.000_000_000_123e1_0');
INSERT INTO num_input_test(n1) VALUES ('.000_000_000_123e+1_1');
INSERT INTO num_input_test(n1) VALUES ('0b10001110111100111100001001010');
INSERT INTO num_input_test(n1) VALUES (' -0B_1010_1011_0101_0100_1010_1001_1000_1100_1110_1011_0001_1111_0000_1010_1101_0010 ');
INSERT INTO num_input_test(n1) VALUES (' +0o112402761777 ');
INSERT INTO num_input_test(n1) VALUES ('-0O0012_5524_5230_6334_3167_0261');
INSERT INTO num_input_test(n1) VALUES ('-0x0000000000000000000000000deadbeef');
INSERT INTO num_input_test(n1) VALUES (' 0X_30b1_F33a_6DF0_bD4E_64DF_9BdA_7D15 ');
-- bad inputs
--Testcase 558:
INSERT INTO num_input_test(n1) VALUES (' ');
--Testcase 559:
INSERT INTO num_input_test(n1) VALUES (' 1234 %');
--Testcase 560:
INSERT INTO num_input_test(n1) VALUES ('xyz');
--Testcase 561:
INSERT INTO num_input_test(n1) VALUES ('- 1234');
--Testcase 562:
INSERT INTO num_input_test(n1) VALUES ('5 . 0');
--Testcase 563:
INSERT INTO num_input_test(n1) VALUES ('5. 0 ');
--Testcase 564:
INSERT INTO num_input_test(n1) VALUES ('');
--Testcase 565:
INSERT INTO num_input_test(n1) VALUES (' N aN ');
INSERT INTO num_input_test(n1) VALUES ('+NaN');
INSERT INTO num_input_test(n1) VALUES ('-NaN');
--Testcase 1219:
INSERT INTO num_input_test(n1) VALUES ('+ infinity');
INSERT INTO num_input_test(n1) VALUES ('_123');
INSERT INTO num_input_test(n1) VALUES ('123_');
INSERT INTO num_input_test(n1) VALUES ('12__34');
INSERT INTO num_input_test(n1) VALUES ('123_.456');
INSERT INTO num_input_test(n1) VALUES ('123._456');
INSERT INTO num_input_test(n1) VALUES ('1.2e_34');
INSERT INTO num_input_test(n1) VALUES ('1.2e34_');
INSERT INTO num_input_test(n1) VALUES ('1.2e3__4');
INSERT INTO num_input_test(n1) VALUES ('0b1112');
INSERT INTO num_input_test(n1) VALUES ('0c1112');
INSERT INTO num_input_test(n1) VALUES ('0o12345678');
INSERT INTO num_input_test(n1) VALUES ('0x1eg');
INSERT INTO num_input_test(n1) VALUES ('0x12.34');
INSERT INTO num_input_test(n1) VALUES ('0x__1234');
INSERT INTO num_input_test(n1) VALUES ('0x1234_');
INSERT INTO num_input_test(n1) VALUES ('0x12__34');
--Testcase 566:
SELECT * FROM num_input_test;
-- Also try it with non-error-throwing API
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_INT4_NUMERIC(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
INSERT INTO NON_ERROR_THROWING_API_INT4_NUMERIC VALUES ('34.5', 1), ('34xyz', 2), ('1e400000', 3);
SELECT pg_input_is_valid(f1, 'numeric') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 1;
SELECT pg_input_is_valid(f1, 'numeric') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 2;
SELECT pg_input_is_valid(f1, 'numeric') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 3;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 3), 'numeric');
INSERT INTO NON_ERROR_THROWING_API_INT4_NUMERIC VALUES ('1234.567', 4), ('0x1234.567', 5);
SELECT pg_input_is_valid(f1, 'numeric(8,4)') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 4;
SELECT pg_input_is_valid(f1, 'numeric(7,4)') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 4;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 4), 'numeric(7,4)');
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 5), 'numeric');
--
-- Test precision and scale typemods
--
--Testcase 1557:
CREATE FOREIGN TABLE num_typemod_test (
millions numeric(3, -6),
thousands numeric(3, -3),
units numeric(3, 0),
thousandths numeric(3, 3),
millionths numeric(3, 6)
) SERVER sqlite_svr;
--Testcase 1558:
\d num_typemod_test
-- rounding of valid inputs
--Testcase 1559:
INSERT INTO num_typemod_test VALUES (123456, 123, 0.123, 0.000123, 0.000000123);
--Testcase 1560:
INSERT INTO num_typemod_test VALUES (654321, 654, 0.654, 0.000654, 0.000000654);
--Testcase 1561:
INSERT INTO num_typemod_test VALUES (2345678, 2345, 2.345, 0.002345, 0.000002345);
--Testcase 1562:
INSERT INTO num_typemod_test VALUES (7654321, 7654, 7.654, 0.007654, 0.000007654);
--Testcase 1563:
INSERT INTO num_typemod_test VALUES (12345678, 12345, 12.345, 0.012345, 0.000012345);
--Testcase 1564:
INSERT INTO num_typemod_test VALUES (87654321, 87654, 87.654, 0.087654, 0.000087654);
--Testcase 1565:
INSERT INTO num_typemod_test VALUES (123456789, 123456, 123.456, 0.123456, 0.000123456);
--Testcase 1566:
INSERT INTO num_typemod_test VALUES (987654321, 987654, 987.654, 0.987654, 0.000987654);
--Testcase 1567:
INSERT INTO num_typemod_test VALUES ('NaN', 'NaN', 'NaN', 'NaN', 'NaN');
--Testcase 1568:
SELECT scale(millions), * FROM num_typemod_test ORDER BY millions;
-- invalid inputs
--Testcase 1569:
INSERT INTO num_typemod_test (millions) VALUES ('inf');
--Testcase 1570:
INSERT INTO num_typemod_test (millions) VALUES (999500000);
--Testcase 1571:
INSERT INTO num_typemod_test (thousands) VALUES (999500);
--Testcase 1572:
INSERT INTO num_typemod_test (units) VALUES (999.5);
--Testcase 1573:
INSERT INTO num_typemod_test (thousandths) VALUES (0.9995);
--Testcase 1574:
INSERT INTO num_typemod_test (millionths) VALUES (0.0009995);
--
-- Test some corner cases for multiplication
--
--Testcase 707:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 708:
INSERT INTO num_tmp VALUES (4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 709:
SELECT n1 * n2 FROM num_tmp;
--Testcase 710:
DELETE FROM num_tmp;
--Testcase 711:
INSERT INTO num_tmp VALUES (4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 712:
SELECT n1 * n2 FROM num_tmp;
--Testcase 713:
DELETE FROM num_tmp;
--Testcase 714:
INSERT INTO num_tmp VALUES (4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 715:
SELECT n1 * n2 FROM num_tmp;
--Testcase 716:
DELETE FROM num_tmp;
--Testcase 717:
INSERT INTO num_tmp VALUES (4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 718:
SELECT n1 * n2 FROM num_tmp;
--Testcase 1525:
DELETE FROM num_tmp;
--Testcase 1526:
INSERT INTO num_tmp VALUES ((0.1 - 2e-16383), (0.1 - 3e-16383));
--Testcase 1527:
SELECT trim_scale(n1 * n2) FROM num_tmp;
--
-- Test some corner cases for division
--
--Testcase 719:
DELETE FROM num_tmp;
--Testcase 720:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 721:
SELECT n1::numeric / n2 FROM num_tmp;
--Testcase 722:
DELETE FROM num_tmp;
--Testcase 723:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 724:
SELECT div(n1::numeric, n2) FROM num_tmp;
--Testcase 725:
SELECT mod(n1::numeric, n2) FROM num_tmp;
--Testcase 726:
SELECT div(-n1::numeric, n2) FROM num_tmp;
--Testcase 727:
SELECT mod(-n1::numeric, n2) FROM num_tmp;
--Testcase 728:
select div(-n1::numeric,n2)*n2 + mod(-n1::numeric,n2) FROM num_tmp;
--Testcase 729:
DELETE FROM num_tmp;
--Testcase 730:
INSERT INTO num_tmp VALUES (70.0,70);
--Testcase 731:
select mod (n1, n2) FROM num_tmp;
--Testcase 732:
select div (n1, n2) FROM num_tmp;
--Testcase 733:
select n1 / n2 FROM num_tmp;
--Testcase 734:
DELETE FROM num_tmp;
--Testcase 735:
INSERT INTO num_tmp VALUES (12345678901234567890, 123);
--Testcase 736:
select n1 % n2 FROM num_tmp;
--Testcase 737:
select n1 / n2 FROM num_tmp;
--Testcase 738:
select div(n1, n2) FROM num_tmp;
--Testcase 739:
select div(n1, n2) * n2 + n1 % n2 FROM num_tmp;
--
-- Test some corner cases for square root
--
--Testcase 740:
DELETE FROM num_tmp;
--Testcase 741:
INSERT INTO num_tmp VALUES (1.000000000000003::numeric);
--Testcase 742:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 743:
DELETE FROM num_tmp;
--Testcase 744:
INSERT INTO num_tmp VALUES (1.000000000000004::numeric);
--Testcase 745:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 746:
DELETE FROM num_tmp;
--Testcase 747:
INSERT INTO num_tmp VALUES (96627521408608.56340355805::numeric);
--Testcase 748:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 749:
DELETE FROM num_tmp;
--Testcase 750:
INSERT INTO num_tmp VALUES (96627521408608.56340355806::numeric);
--Testcase 751:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 752:
DELETE FROM num_tmp;
--Testcase 753:
INSERT INTO num_tmp VALUES (515549506212297735.073688290367::numeric);
--Testcase 754:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 755:
DELETE FROM num_tmp;
--Testcase 756:
INSERT INTO num_tmp VALUES (515549506212297735.073688290368::numeric);
--Testcase 757:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 758:
DELETE FROM num_tmp;
--Testcase 759:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900306::numeric);
--Testcase 760:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 761:
DELETE FROM num_tmp;
--Testcase 762:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900307::numeric);
--Testcase 763:
SELECT sqrt(n1) FROM num_tmp;
--
-- Test code path for raising to integer powers
--
--Testcase 764:
DELETE FROM num_tmp;
--Testcase 765:
INSERT INTO num_tmp VALUES (10.0, -2147483648);
--Testcase 766:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 767:
DELETE FROM num_tmp;
--Testcase 768:
INSERT INTO num_tmp VALUES (10.0, -2147483647);
--Testcase 769:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 770:
DELETE FROM num_tmp;
--Testcase 771:
INSERT INTO num_tmp VALUES (10.0, 2147483647);
--Testcase 772:
SELECT n1 ^ n2 as overflows FROM num_tmp;
--Testcase 773:
DELETE FROM num_tmp;
--Testcase 774:
INSERT INTO num_tmp VALUES (117743296169.0, -1000000000);
--Testcase 775:
SELECT n1 ^ n2 as overflows FROM num_tmp;
-- cases that used to return inaccurate results
--Testcase 776:
DELETE FROM num_tmp;
--Testcase 777:
INSERT INTO num_tmp VALUES (3.789, 21.0000000000000000);
--Testcase 778:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 779:
DELETE FROM num_tmp;
--Testcase 780:
INSERT INTO num_tmp VALUES (3.789, 35.0000000000000000);
--Testcase 781:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 782:
DELETE FROM num_tmp;
--Testcase 783:
INSERT INTO num_tmp VALUES (1.2, 345);
--Testcase 784:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 785:
DELETE FROM num_tmp;
--Testcase 786:
INSERT INTO num_tmp VALUES (0.12, (-20));
--Testcase 787:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1220:
DELETE FROM num_tmp;
--Testcase 1221:
INSERT INTO num_tmp VALUES (1.000000000123, (-2147483648));
--Testcase 1222:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1528:
DELETE FROM num_tmp;
--Testcase 1529:
INSERT INTO num_tmp VALUES (0.9999999999, 23300000000000);
--Testcase 1530:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
--Testcase 1575:
DELETE FROM num_tmp;
--Testcase 1576:
INSERT INTO num_tmp VALUES ((1 - 1.500012345678e-1000), 1.45e1003);
--Testcase 1577:
SELECT round(((1 - 1.500012345678e-1000) ^ 1.45e1003) * 1e1000) FROM num_tmp;
-- cases that used to error out
--Testcase 788:
DELETE FROM num_tmp;
--Testcase 789:
INSERT INTO num_tmp VALUES (0.12, (-25));
--Testcase 790:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 791:
DELETE FROM num_tmp;
--Testcase 792:
INSERT INTO num_tmp VALUES (0.5678, (-85));
--Testcase 793:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1531:
DELETE FROM num_tmp;
--Testcase 1532:
INSERT INTO num_tmp VALUES (0.9999999999, 70000000000000);
--Testcase 1533:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
-- negative base to integer powers
--Testcase 1534:
DELETE FROM num_tmp;
--Testcase 1535:
INSERT INTO num_tmp VALUES ((-1.0), 2147483646);
--Testcase 1536:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1537:
DELETE FROM num_tmp;
--Testcase 1538:
INSERT INTO num_tmp VALUES ((-1.0), 2147483647);
--Testcase 1539:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1540:
DELETE FROM num_tmp;
--Testcase 1541:
INSERT INTO num_tmp VALUES ((-1.0), 2147483648);
--Testcase 1542:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1543:
DELETE FROM num_tmp;
--Testcase 1544:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000000);
--Testcase 1545:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1546:
DELETE FROM num_tmp;
--Testcase 1547:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000001);
--Testcase 1548:
SELECT n1 ^ n2 FROM num_tmp;
-- integer powers of 10
DELETE FROM num_tmp;
INSERT INTO num_tmp(n1) SELECT n FROM generate_series(-20,20) n;
SELECT n1, 10.0 ^ n1 as "10^n", (10.0 ^ n1) * (10.0 ^ (-n1)) = 1 as ok FROM num_tmp;
--
-- Tests for raising to non-integer powers
--
-- special cases
--Testcase 794:
DELETE FROM num_tmp;
--Testcase 795:
INSERT INTO num_tmp VALUES (0.0, 0.0);
--Testcase 796:
select n1 ^ n2 FROM num_tmp;
--Testcase 797:
DELETE FROM num_tmp;
--Testcase 798:
INSERT INTO num_tmp VALUES ((-12.34), 0.0);
--Testcase 799:
select n1 ^ n2 FROM num_tmp;
--Testcase 800:
DELETE FROM num_tmp;
--Testcase 801:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 802:
select n1 ^ n2 FROM num_tmp;
--Testcase 803:
DELETE FROM num_tmp;
--Testcase 804:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 805:
select n1 ^ n2 FROM num_tmp;
-- NaNs
--Testcase 806:
DELETE FROM num_tmp;
--Testcase 807:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 'NaN'::numeric);
--Testcase 808:
select n1 ^ n2 FROM num_tmp;
--Testcase 809:
DELETE FROM num_tmp;
--Testcase 810:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 0);
--Testcase 811:
select n1 ^ n2 FROM num_tmp;
--Testcase 812:
DELETE FROM num_tmp;
--Testcase 813:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 1);
--Testcase 814:
select n1 ^ n2 FROM num_tmp;
--Testcase 815:
DELETE FROM num_tmp;
--Testcase 816:
INSERT INTO num_tmp VALUES (0, 'NaN'::numeric);
--Testcase 817:
select n1 ^ n2 FROM num_tmp;
--Testcase 818:
DELETE FROM num_tmp;
--Testcase 819:
INSERT INTO num_tmp VALUES (1, 'NaN'::numeric);
--Testcase 820:
select n1 ^ n2 FROM num_tmp;
-- invalid inputs
--Testcase 821:
DELETE FROM num_tmp;
--Testcase 822:
INSERT INTO num_tmp VALUES (0.0, (-12.34));
--Testcase 823:
select n1 ^ n2 FROM num_tmp;
--Testcase 824:
DELETE FROM num_tmp;
--Testcase 825:
INSERT INTO num_tmp VALUES ((-12.34), 1.2);
--Testcase 826:
select n1 ^ n2 FROM num_tmp;
-- cases that used to generate inaccurate results
--Testcase 827:
DELETE FROM num_tmp;
--Testcase 828:
INSERT INTO num_tmp VALUES (32.1, 9.8);
--Testcase 829:
select n1 ^ n2 FROM num_tmp;
--Testcase 830:
DELETE FROM num_tmp;
--Testcase 831:
INSERT INTO num_tmp VALUES (32.1, (-9.8));
--Testcase 832:
select n1 ^ n2 FROM num_tmp;
--Testcase 833:
DELETE FROM num_tmp;
--Testcase 834:
INSERT INTO num_tmp VALUES (12.3, 45.6);
--Testcase 835:
select n1 ^ n2 FROM num_tmp;
--Testcase 836:
DELETE FROM num_tmp;
--Testcase 837:
INSERT INTO num_tmp VALUES (12.3, (-45.6));
--Testcase 838:
select n1 ^ n2 FROM num_tmp;
-- big test
--Testcase 839:
DELETE FROM num_tmp;
--Testcase 840:
INSERT INTO num_tmp VALUES (1.234, 5678);
--Testcase 841:
select n1 ^ n2 FROM num_tmp;
--
-- Tests for EXP()
--
-- special cases
--Testcase 842:
DELETE FROM num_tmp;
--Testcase 843:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 844:
select exp(n1) from num_tmp;
--Testcase 845:
DELETE FROM num_tmp;
--Testcase 846:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 847:
select exp(n1) from num_tmp;
--Testcase 848:
DELETE FROM num_tmp;
--Testcase 849:
INSERT INTO num_tmp VALUES (1.0::numeric(71,70));
--Testcase 850:
select exp(n1) from num_tmp;
--Testcase 1223:
DELETE FROM num_tmp;
--Testcase 1224:
INSERT INTO num_tmp VALUES ('nan'::numeric);
--Testcase 1225:
select exp(n1) from num_tmp;
--Testcase 1226:
DELETE FROM num_tmp;
--Testcase 1227:
INSERT INTO num_tmp VALUES ('inf'::numeric);
--Testcase 1228:
select exp(n1) from num_tmp;
--Testcase 1229:
DELETE FROM num_tmp;
--Testcase 1230:
INSERT INTO num_tmp VALUES ('-inf'::numeric);
--Testcase 1231:
select exp(n1) from num_tmp;
--Testcase 1549:
DELETE FROM num_tmp;
--Testcase 1550:
INSERT INTO num_tmp VALUES ('-5000'::numeric);
--Testcase 1551:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
--Testcase 1552:
DELETE FROM num_tmp;
--Testcase 1553:
INSERT INTO num_tmp VALUES ('-10000'::numeric);
--Testcase 1554:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
-- cases that used to generate inaccurate results
--Testcase 851:
DELETE FROM num_tmp;
--Testcase 852:
INSERT INTO num_tmp VALUES (32.999);
--Testcase 853:
select exp(n1) from num_tmp;
--Testcase 854:
DELETE FROM num_tmp;
--Testcase 855:
INSERT INTO num_tmp VALUES (-32.999);
--Testcase 856:
select exp(n1) from num_tmp;
--Testcase 857:
DELETE FROM num_tmp;
--Testcase 858:
INSERT INTO num_tmp VALUES (123.456);
--Testcase 859:
select exp(n1) from num_tmp;
--Testcase 860:
DELETE FROM num_tmp;
--Testcase 861:
INSERT INTO num_tmp VALUES (-123.456);
--Testcase 862:
select exp(n1) from num_tmp;
-- big test
--Testcase 863:
DELETE FROM num_tmp;
--Testcase 864:
INSERT INTO num_tmp VALUES (1234.5678);
--Testcase 865:
select exp(n1) from num_tmp;
--
-- Tests for generate_series
--
--Testcase 866:
DELETE FROM num_tmp;
--Testcase 867:
INSERT INTO num_tmp select * from generate_series(0.0::numeric, 4.0::numeric);
--Testcase 868:
SELECT n1 FROM num_tmp;
--Testcase 869:
DELETE FROM num_tmp;
--Testcase 870:
INSERT INTO num_tmp select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric);
--Testcase 871:
SELECT n1 FROM num_tmp;
--Testcase 872:
DELETE FROM num_tmp;
--Testcase 873:
INSERT INTO num_tmp select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric);
--Testcase 874:
SELECT n1 FROM num_tmp;
-- Trigger errors
--Testcase 875:
DELETE FROM num_tmp;
--Testcase 876:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 0::numeric);
--Testcase 877:
SELECT n1 FROM num_tmp;
--Testcase 878:
DELETE FROM num_tmp;
--Testcase 879:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric);
--Testcase 880:
SELECT n1 FROM num_tmp;
--Testcase 881:
DELETE FROM num_tmp;
--Testcase 882:
INSERT INTO num_tmp select * from generate_series('nan'::numeric, 100::numeric, 10::numeric);
--Testcase 883:
SELECT n1 FROM num_tmp;
--Testcase 884:
DELETE FROM num_tmp;
--Testcase 885:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric);
--Testcase 886:
SELECT n2 FROM num_tmp;
--Testcase 1232:
DELETE FROM num_tmp;
--Testcase 1233:
INSERT INTO num_tmp select * from generate_series('inf'::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1234:
SELECT n2 FROM num_tmp;
--Testcase 1235:
DELETE FROM num_tmp;
--Testcase 1236:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1237:
SELECT n2 FROM num_tmp;
--Testcase 1238:
DELETE FROM num_tmp;
--Testcase 1239:
INSERT INTO num_tmp select * from generate_series(0::numeric, '42'::numeric, '-inf'::numeric);
--Testcase 1240:
SELECT n2 FROM num_tmp;
-- Checks maximum, output is truncated
--Testcase 887:
DELETE FROM num_tmp;
--Testcase 888:
INSERT INTO num_tmp select (i / (10::numeric ^ 131071))::numeric(1,0)
from generate_series(6 * (10::numeric ^ 131071),
9 * (10::numeric ^ 131071),
10::numeric ^ 131071) i;
--Testcase 889:
SELECT n1 FROM num_tmp;
-- Check usage with variables
--Testcase 890:
DELETE FROM num_tmp;
--Testcase 891:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
--Testcase 892:
SELECT n1, n2 FROM num_tmp;
--Testcase 893:
DELETE FROM num_tmp;
--Testcase 894:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
--Testcase 895:
SELECT n1, n2 FROM num_tmp;
--Testcase 896:
DELETE FROM num_tmp;
--Testcase 897:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
--Testcase 898:
SELECT n1, n2 FROM num_tmp;
--
-- Tests for LN()
--
-- Invalid inputs
--Testcase 899:
DELETE FROM num_tmp;
--Testcase 900:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 901:
select ln(n1) from num_tmp;
--Testcase 902:
DELETE FROM num_tmp;
--Testcase 903:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 904:
select ln(n1) from num_tmp;
-- Some random tests
--Testcase 905:
DELETE FROM num_tmp;
--Testcase 906:
INSERT INTO num_tmp VALUES (1.2345678e-28);
--Testcase 907:
select ln(n1) from num_tmp;
--Testcase 908:
DELETE FROM num_tmp;
--Testcase 909:
INSERT INTO num_tmp VALUES (0.0456789);
--Testcase 910:
select ln(n1) from num_tmp;
--Testcase 911:
DELETE FROM num_tmp;
--Testcase 912:
INSERT INTO num_tmp VALUES (0.349873948359354029493948309745709580730482050975);
--Testcase 913:
select ln(n1) from num_tmp;
--Testcase 914:
DELETE FROM num_tmp;
--Testcase 915:
INSERT INTO num_tmp VALUES (0.99949452);
--Testcase 916:
select ln(n1) from num_tmp;
--Testcase 917:
DELETE FROM num_tmp;
--Testcase 918:
INSERT INTO num_tmp VALUES (1.00049687395);
--Testcase 919:
select ln(n1) from num_tmp;
--Testcase 920:
DELETE FROM num_tmp;
--Testcase 921:
INSERT INTO num_tmp VALUES (1234.567890123456789);
--Testcase 922:
select ln(n1) from num_tmp;
--Testcase 923:
DELETE FROM num_tmp;
--Testcase 924:
INSERT INTO num_tmp VALUES (5.80397490724e5);
--Testcase 925:
select ln(n1) from num_tmp;
--Testcase 926:
DELETE FROM num_tmp;
--Testcase 927:
INSERT INTO num_tmp VALUES (9.342536355e34);
--Testcase 928:
select ln(n1) from num_tmp;
--
-- Tests for LOG() (base 10)
--
-- invalid inputs
--Testcase 929:
DELETE FROM num_tmp;
--Testcase 930:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 931:
select log(n1) from num_tmp;
--Testcase 932:
DELETE FROM num_tmp;
--Testcase 933:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 934:
select log(n1) from num_tmp;
-- some random tests
--Testcase 935:
DELETE FROM num_tmp;
--Testcase 936:
INSERT INTO num_tmp VALUES (1.234567e-89);
--Testcase 937:
select log(n1) from num_tmp;
--Testcase 938:
DELETE FROM num_tmp;
--Testcase 939:
INSERT INTO num_tmp VALUES (3.4634998359873254962349856073435545);
--Testcase 940:
select log(n1) from num_tmp;
--Testcase 941:
DELETE FROM num_tmp;
--Testcase 942:
INSERT INTO num_tmp VALUES (9.999999999999999999);
--Testcase 943:
select log(n1) from num_tmp;
--Testcase 944:
DELETE FROM num_tmp;
--Testcase 945:
INSERT INTO num_tmp VALUES (10.00000000000000000);
--Testcase 946:
select log(n1) from num_tmp;
--Testcase 947:
DELETE FROM num_tmp;
--Testcase 948:
INSERT INTO num_tmp VALUES (10.00000000000000001);
--Testcase 949:
select log(n1) from num_tmp;
--Testcase 950:
DELETE FROM num_tmp;
--Testcase 951:
INSERT INTO num_tmp VALUES (590489.45235237);
--Testcase 952:
select log(n1) from num_tmp;
--
-- Tests for LOG() (arbitrary base)
--
-- invalid inputs
--Testcase 953:
DELETE FROM num_tmp;
--Testcase 954:
INSERT INTO num_tmp VALUES (-12.34, 56.78);
--Testcase 955:
select log(n1, n2) from num_tmp;
--Testcase 956:
DELETE FROM num_tmp;
--Testcase 957:
INSERT INTO num_tmp VALUES (-12.34, -56.78);
--Testcase 958:
select log(n1, n2) from num_tmp;
--Testcase 959:
DELETE FROM num_tmp;
--Testcase 960:
INSERT INTO num_tmp VALUES (12.34, -56.78);
--Testcase 961:
select log(n1, n2) from num_tmp;
--Testcase 962:
DELETE FROM num_tmp;
--Testcase 963:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 964:
select log(n1, n2) from num_tmp;
--Testcase 965:
DELETE FROM num_tmp;
--Testcase 966:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 967:
select log(n1, n2) from num_tmp;
--Testcase 968:
DELETE FROM num_tmp;
--Testcase 969:
INSERT INTO num_tmp VALUES (.0, 12.34);
--Testcase 970:
select log(n1, n2) from num_tmp;
-- some random tests
--Testcase 971:
DELETE FROM num_tmp;
--Testcase 972:
INSERT INTO num_tmp VALUES (1.23e-89, 6.4689e45);
--Testcase 973:
select log(n1, n2) from num_tmp;
--Testcase 974:
DELETE FROM num_tmp;
--Testcase 975:
INSERT INTO num_tmp VALUES (0.99923, 4.58934e34);
--Testcase 976:
select log(n1, n2) from num_tmp;
--Testcase 977:
DELETE FROM num_tmp;
--Testcase 978:
INSERT INTO num_tmp VALUES (1.000016, 8.452010e18);
--Testcase 979:
select log(n1, n2) from num_tmp;
--Testcase 980:
DELETE FROM num_tmp;
--Testcase 981:
INSERT INTO num_tmp VALUES (3.1954752e47, 9.4792021e-73);
--Testcase 982:
select log(n1, n2) from num_tmp;
--
-- Tests for scale()
--
--Testcase 983:
DELETE FROM num_tmp;
--Testcase 984:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 985:
select scale(n1) from num_tmp;
--Testcase 1241:
DELETE FROM num_tmp;
--Testcase 1242:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1243:
select scale(n1) from num_tmp;
--Testcase 986:
DELETE FROM num_tmp;
--Testcase 987:
INSERT INTO num_tmp VALUES (NULL::numeric);
--Testcase 988:
select scale(n1) from num_tmp;
--Testcase 989:
DELETE FROM num_tmp;
--Testcase 990:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 991:
select scale(n1) from num_tmp;
--Testcase 992:
DELETE FROM num_tmp;
--Testcase 993:
INSERT INTO num_tmp VALUES (0);
--Testcase 994:
select scale(n1) from num_tmp;
--Testcase 995:
DELETE FROM num_tmp;
--Testcase 996:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 997:
select scale(n1) from num_tmp;
--Testcase 998:
DELETE FROM num_tmp;
--Testcase 999:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1000:
select scale(n1) from num_tmp;
--Testcase 1001:
DELETE FROM num_tmp;
--Testcase 1002:
INSERT INTO num_tmp VALUES (110123.12475871856128);
--Testcase 1003:
select scale(n1) from num_tmp;
--Testcase 1004:
DELETE FROM num_tmp;
--Testcase 1005:
INSERT INTO num_tmp VALUES (-1123.12471856128);
--Testcase 1006:
select scale(n1) from num_tmp;
--Testcase 1007:
DELETE FROM num_tmp;
--Testcase 1008:
INSERT INTO num_tmp VALUES (-13.000000000000000);
--Testcase 1009:
select scale(n1) from num_tmp;
--
-- Tests for min_scale()
--
--Testcase 1010:
DELETE FROM num_tmp;
--Testcase 1011:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1012:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1244:
DELETE FROM num_tmp;
--Testcase 1245:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1246:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1013:
DELETE FROM num_tmp;
--Testcase 1014:
INSERT INTO num_tmp VALUES (0);
--Testcase 1015:
select min_scale(n1) from num_tmp; -- no digits
--Testcase 1016:
DELETE FROM num_tmp;
--Testcase 1017:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1018:
select min_scale(n1) from num_tmp; -- no digits again
--Testcase 1019:
DELETE FROM num_tmp;
--Testcase 1020:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 1021:
select min_scale(n1) from num_tmp; -- no scale
--Testcase 1022:
DELETE FROM num_tmp;
--Testcase 1023:
INSERT INTO num_tmp VALUES (1.1);
--Testcase 1024:
select min_scale(n1) from num_tmp; -- scale 1
--Testcase 1025:
DELETE FROM num_tmp;
--Testcase 1026:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 1027:
select min_scale(n1) from num_tmp; -- scale 2
--Testcase 1028:
DELETE FROM num_tmp;
--Testcase 1029:
INSERT INTO num_tmp VALUES (1.123);
--Testcase 1030:
select min_scale(n1) from num_tmp; -- scale 3
--Testcase 1031:
DELETE FROM num_tmp;
--Testcase 1032:
INSERT INTO num_tmp VALUES (1.1234);
--Testcase 1033:
select min_scale(n1) from num_tmp; -- scale 4, filled digit
--Testcase 1034:
DELETE FROM num_tmp;
--Testcase 1035:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1036:
select min_scale(n1) from num_tmp; -- scale 5, 2 NDIGITS
--Testcase 1037:
DELETE FROM num_tmp;
--Testcase 1038:
INSERT INTO num_tmp VALUES (1.1000);
--Testcase 1039:
select min_scale(n1) from num_tmp; -- 1 pos in NDIGITS
--Testcase 1040:
DELETE FROM num_tmp;
--Testcase 1041:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1042:
select min_scale(n1) from num_tmp; -- very big number
--
-- Tests for trim_scale()
--
--Testcase 1043:
DELETE FROM num_tmp;
--Testcase 1044:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1045:
select trim_scale(n1) from num_tmp;
--Testcase 1247:
DELETE FROM num_tmp;
--Testcase 1248:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1249:
select trim_scale(n1) from num_tmp;
--Testcase 1046:
DELETE FROM num_tmp;
--Testcase 1047:
INSERT INTO num_tmp VALUES (1.120);
--Testcase 1048:
select trim_scale(n1) from num_tmp;
--Testcase 1049:
DELETE FROM num_tmp;
--Testcase 1050:
INSERT INTO num_tmp VALUES (0);
--Testcase 1051:
select trim_scale(n1) from num_tmp;
--Testcase 1052:
DELETE FROM num_tmp;
--Testcase 1053:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1054:
select trim_scale(n1) from num_tmp;
--Testcase 1055:
DELETE FROM num_tmp;
--Testcase 1056:
INSERT INTO num_tmp VALUES (1.1234500);
--Testcase 1057:
select trim_scale(n1) from num_tmp;
--Testcase 1058:
DELETE FROM num_tmp;
--Testcase 1059:
INSERT INTO num_tmp VALUES (110123.12475871856128000);
--Testcase 1060:
select trim_scale(n1) from num_tmp;
--Testcase 1061:
DELETE FROM num_tmp;
--Testcase 1062:
INSERT INTO num_tmp VALUES (-123.124718561280000000);
--Testcase 1063:
select trim_scale(n1) from num_tmp;
--Testcase 1064:
DELETE FROM num_tmp;
--Testcase 1065:
INSERT INTO num_tmp VALUES (-13.00000000000000000000);
--Testcase 1066:
select trim_scale(n1) from num_tmp;
--Testcase 1067:
DELETE FROM num_tmp;
--Testcase 1068:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1069:
select trim_scale(n1) from num_tmp;
--
-- Tests for SUM()
--
-- cases that need carry propagation
--Testcase 1070:
DELETE FROM num_tmp;
--Testcase 1071:
INSERT INTO num_tmp SELECT * FROM generate_series(1, 100000);
--Testcase 1072:
SELECT SUM(9999::numeric) FROM num_tmp;
--Testcase 1073:
SELECT SUM((-9999)::numeric) FROM num_tmp;
--
-- Tests for VARIANCE()
--
--Testcase 1578:
INSERT INTO num_variance VALUES (0);
--Testcase 1579:
INSERT INTO num_variance VALUES (3e-500);
--Testcase 1580:
INSERT INTO num_variance VALUES (-3e-500);
--Testcase 1581:
INSERT INTO num_variance VALUES (4e-500 - 1e-16383);
--Testcase 1582:
INSERT INTO num_variance VALUES (-4e-500 + 1e-16383);
-- variance is just under 12.5e-1000 and so should round down to 12e-1000
--Testcase 1583:
SELECT trim_scale(variance(a) * 1e1000) FROM num_variance;
-- check that parallel execution produces the same result
BEGIN;
-- ALTER TABLE num_variance SET (parallel_workers = 4);
SET LOCAL parallel_setup_cost = 0;
SET LOCAL max_parallel_workers_per_gather = 4;
--Testcase 1584:
SELECT trim_scale(variance(a) * 1e1000) FROM num_variance;
ROLLBACK;
-- case where sum of squares would overflow but variance does not
--Testcase 1585:
DELETE FROM num_variance;
--Testcase 1586:
INSERT INTO num_variance SELECT 9e131071 + x FROM generate_series(1, 5) x;
--Testcase 1587:
SELECT variance(a) FROM num_variance;
-- check that parallel execution produces the same result
BEGIN;
-- ALTER TABLE num_variance SET (parallel_workers = 4);
SET LOCAL parallel_setup_cost = 0;
SET LOCAL max_parallel_workers_per_gather = 4;
--Testcase 1588:
SELECT variance(a) FROM num_variance;
ROLLBACK;
--
-- Tests for GCD()
--
--Testcase 1074:
DELETE FROM num_tmp;
--Testcase 1075:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1076:
SELECT n1 as a, n2 as b, gcd(n1, n2), gcd(n1, -n2), gcd(-n2, n1), gcd(-n2, -n1) FROM num_tmp;
--
-- Tests for LCM()
--
--Testcase 1077:
DELETE FROM num_tmp;
--Testcase 1078:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1079:
SELECT n1 as a, n2 as b, lcm(n1, n2), lcm(n1, -n2), lcm(-n2, n1), lcm(-n2, -n1) FROM num_tmp;
--Testcase 1080:
DELETE FROM num_tmp;
--Testcase 1081:
INSERT INTO num_tmp VALUES (10::numeric, 131068);
--Testcase 1082:
SELECT lcm(9999 * (n1)^n2 + (n1^n2 - 1), 2) FROM num_tmp; -- overflow
--
-- Tests for factorial
--
--Testcase 1250:
DELETE FROM num_tmp;
--Testcase 1251:
INSERT INTO num_tmp VALUES (4);
--Testcase 1252:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1253:
DELETE FROM num_tmp;
--Testcase 1254:
INSERT INTO num_tmp VALUES (15);
--Testcase 1255:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1256:
DELETE FROM num_tmp;
--Testcase 1257:
INSERT INTO num_tmp VALUES (100000);
--Testcase 1258:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1259:
DELETE FROM num_tmp;
--Testcase 1260:
INSERT INTO num_tmp VALUES (0);
--Testcase 1261:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1262:
DELETE FROM num_tmp;
--Testcase 1263:
INSERT INTO num_tmp VALUES (-4);
--Testcase 1264:
SELECT factorial(n1::int4) FROM num_tmp;
--
-- Tests for pg_lsn()
--
--Testcase 1265:
DELETE FROM num_tmp;
--Testcase 1266:
INSERT INTO num_tmp VALUES (23783416::numeric);
--Testcase 1267:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1268:
DELETE FROM num_tmp;
--Testcase 1269:
INSERT INTO num_tmp VALUES (0::numeric);
--Testcase 1270:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1271:
DELETE FROM num_tmp;
--Testcase 1272:
INSERT INTO num_tmp VALUES (18446744073709551615::numeric);
--Testcase 1273:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1274:
DELETE FROM num_tmp;
--Testcase 1275:
INSERT INTO num_tmp VALUES (-1::numeric);
--Testcase 1276:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1277:
DELETE FROM num_tmp;
--Testcase 1278:
INSERT INTO num_tmp VALUES (18446744073709551616::numeric);
--Testcase 1279:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1280:
DELETE FROM num_tmp;
--Testcase 1281:
INSERT INTO num_tmp VALUES ('NaN'::numeric);
--Testcase 1282:
SELECT pg_lsn(n1) FROM num_tmp;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 1083:
DROP SERVER sqlite_svr;
--Testcase 1084:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/out_of_range.sql
================================================
--
-- INT4 + INT2
--
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 01:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 02:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 03:
DELETE FROM INT4_TMP;
--Testcase 04:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 05:
INSERT INTO INT4_TMP VALUES (x'7FFFFFFF'::int8 + 1, 0);
--Testcase 06:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 07:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 08:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 09:
DELETE FROM INT4_TMP;
--Testcase 10:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 11:
INSERT INTO INT4_TMP VALUES (-(x'7FFFFFFF'::int8) - 2, 0);
--Testcase 12:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 13:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 14:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 15:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 16:
CREATE FOREIGN TABLE INT2_TMP(f1 int2, f2 int2, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 17:
DELETE FROM INT2_TMP;
--Testcase 18:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 19:
INSERT INTO INT2_TMP VALUES (x'7FFF'::int8 + 1, 0);
--Testcase 20:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 21:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 22:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 23:
DELETE FROM INT2_TMP;
--Testcase 24:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 25:
INSERT INTO INT2_TMP VALUES (-(x'7FFF'::int8) - 2, 0);
--Testcase 26:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 27:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 28:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 29:
CREATE FOREIGN TABLE INT8_TBL(q1 int8 OPTIONS (key 'true'), q2 int8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 31:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 32:
INSERT INTO INT8_TBL VALUES (-9223372036854775810, 0);
--Testcase 33:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 34:
SELECT * FROM INT8_TBL; -- NO overflow
--Testcase 35:
SELECT q1 FROM INT8_TBL; -- NO overflow
--Testcase 36:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 37:
DELETE FROM INT8_TBL WHERE q1 = -9223372036854775810;
--Testcase 38:
INSERT INTO INT8_TBL VALUES (9223372036854775809, 0);
--Testcase 39:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 40:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 41:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 42:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 43:
DELETE FROM INT8_TBL WHERE q1 = 9223372036854775809;
--Testcase 44:
INSERT INTO INT8_TBL VALUES (10 * -9223372036854775810, 0);
--Testcase 45:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 46:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 47:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 48:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 49:
DELETE FROM INT8_TBL WHERE q1 = 10 * -9223372036854775810;
--Testcase 50:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 003:
DROP SERVER sqlite_svr CASCADE;
--Testcase 004:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/timestamp.sql
================================================
--
-- TIMESTAMP
--
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 3:
CREATE FOREIGN TABLE dates1 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number timestamp without time zone OPTIONS (column_type 'INT'))
SERVER sqlite_svr
OPTIONS (table 'dates');
--Testcase 4:
CREATE FOREIGN TABLE dates2 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number double precision)
SERVER sqlite_svr
OPTIONS (table 'dates');
-- Showing timestamp column from SQLite value as TEXT and as INTEGER/FLOAT has same value
--Testcase 5:
SELECT name,
to_char(date_as_text, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_text,
to_char(date_as_number, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_number
FROM dates1;
--Testcase 6:
SELECT * FROM dates2;
-- Comparing exact values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 7:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 8:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 9:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 10:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
-- Comparing greater values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 11:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 12:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 13:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 14:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 15:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 16:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 17:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 18:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--- Comparing without using to_timestamp
--Testcase 19:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 20:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 21:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 22:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 23:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 24:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 25:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
--Testcase 26:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
-- Comparing greater values without using to_timestamp
--Testcase 27:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 28:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 29:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 30:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 31:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 32:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 33:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 34:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 35:
DROP FOREIGN TABLE dates1;
--Testcase 36:
DROP FOREIGN TABLE dates2;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/types/uuid.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_UUID"( "i" int OPTIONS (key 'true'), "u" uuid) SERVER sqlite_svr OPTIONS (table 'type_UUID');
--Testcase 010:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE text;
--Testcase 011:
INSERT INTO "type_UUID" ("i", "u") VALUES (1, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 012:
INSERT INTO "type_UUID" ("i", "u") VALUES (2, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 013:
INSERT INTO "type_UUID" ("i", "u") VALUES (3, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 014:
INSERT INTO "type_UUID" ("i", "u") VALUES (4, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 015:
INSERT INTO "type_UUID" ("i", "u") VALUES (5, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 016:
INSERT INTO "type_UUID" ("i", "u") VALUES (6, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 017:
INSERT INTO "type_UUID" ("i", "u") VALUES (7, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 018:
INSERT INTO "type_UUID" ("i", "u") VALUES (8, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 019:
INSERT INTO "type_UUID" ("i", "u") VALUES (9, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 020:
INSERT INTO "type_UUID" ("i", "u") VALUES (10, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 021:
INSERT INTO "type_UUID" ("i", "u") VALUES (11, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 022:
INSERT INTO "type_UUID" ("i", "u") VALUES (12, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 023:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 024:
INSERT INTO "type_UUID" ("i", "u") VALUES (13, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 025:
INSERT INTO "type_UUID" ("i", "u") VALUES (14, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 026:
INSERT INTO "type_UUID" ("i", "u") VALUES (15, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 027:
INSERT INTO "type_UUID" ("i", "u") VALUES (16, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 029:
INSERT INTO "type_UUID" ("i", "u") VALUES (17, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 030:
INSERT INTO "type_UUID" ("i", "u") VALUES (18, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 031:
INSERT INTO "type_UUID" ("i", "u") VALUES (19, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 032:
INSERT INTO "type_UUID" ("i", "u") VALUES (20, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 033:
INSERT INTO "type_UUID" ("i", "u") VALUES (21, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 034:
INSERT INTO "type_UUID" ("i", "u") VALUES (22, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 035:
INSERT INTO "type_UUID" ("i", "u") VALUES (23, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 036:
INSERT INTO "type_UUID" ("i", "u") VALUES (24, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 037:
INSERT INTO "type_UUID" ("i", "u") VALUES (25, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 038:
INSERT INTO "type_UUID" ("i", "u") VALUES (26, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 039:
INSERT INTO "type_UUID" ("i", "u") VALUES (27, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 040:
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 041:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 042:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (ADD column_type 'BLOB');
--Testcase 043:
INSERT INTO "type_UUID" ("i", "u") VALUES (29, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 044:
INSERT INTO "type_UUID" ("i", "u") VALUES (30, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 045:
INSERT INTO "type_UUID" ("i", "u") VALUES (31, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 046:
INSERT INTO "type_UUID" ("i", "u") VALUES (32, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 047:
INSERT INTO "type_UUID" ("i", "u") VALUES (33, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 048:
INSERT INTO "type_UUID" ("i", "u") VALUES (34, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 049:
INSERT INTO "type_UUID" ("i", "u") VALUES (35, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 050:
INSERT INTO "type_UUID" ("i", "u") VALUES (36, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 051:
INSERT INTO "type_UUID" ("i", "u") VALUES (37, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 052:
INSERT INTO "type_UUID" ("i", "u") VALUES (38, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 053:
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 054:
INSERT INTO "type_UUID" ("i", "u") VALUES (40, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 056:
CREATE FOREIGN TABLE "type_UUID+"( "i" int OPTIONS (key 'true'), "u" uuid, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_UUID+');
--Testcase 057:
SELECT * FROM "type_UUID+";
--Testcase 058:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 059:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 060:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 061:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 062:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 063:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 064:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 065:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 066:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 067:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 068:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 069:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 071:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 072:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 073:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 074:
SELECT * FROM "type_UUID+";
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11';
--Testcase 076:
SELECT * FROM "type_UUID+";
--Testcase 077:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 077:
SELECT * FROM "type_UUID+";
--Testcase 078:
INSERT INTO "type_UUID" ("i", "u") VALUES (41, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}');
--Testcase 079:
SELECT * FROM "type_UUID+" WHERE "i" = 41;
--Testcase 080:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 081:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 082:
SELECT * FROM "type_UUID+";
--Testcase 083:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}';
--Testcase 085:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 086:
INSERT INTO "type_UUID" ("i", "u") VALUES (42, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11f1', 'hex'));
--Testcase 087:
INSERT INTO "type_UUID" ("i", "u") VALUES (43, decode('b0eebc999c0b4ef8bb6d6bb9bd380a', 'hex'));
--Testcase 088:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 089:
SELECT * FROM "type_UUID+" WHERE "i" = 42;
--Testcase 090:
SELECT * FROM "type_UUID+" WHERE "i" = 43;
--Testcase 091:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 092:
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 093:
INSERT INTO "type_UUID" ("i", "u") VALUES (44, NULL);
--Testcase 094:
SELECT * FROM "type_UUID+";
--Testcase 095:
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 096:
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 100:
CREATE FOREIGN TABLE "type_UUIDpk" (col uuid OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 101:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (ADD column_type 'TEXT');
--Testcase 102:
INSERT INTO "type_UUIDpk" VALUES ('{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 103:
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 104:
SELECT * FROM "type_UUIDpk";
--Testcase 105: ERR - primary key
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 106:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 107: NO ERR, but the same semantics!
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 108:
SELECT * FROM "type_UUIDpk";
--Testcase 109:
DELETE FROM "type_UUIDpk";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/with_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/with_gis_support/postgis.sql
================================================
--Testcase 2:
CREATE EXTENSION sqlite_fdw;
--Testcase 3:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 4:
CREATE EXTENSION IF NOT EXISTS postgis;
--Testcase 5:
CREATE EXTENSION postgis_raster;
--Testcase 6:
CREATE EXTENSION postgis_topology;
-- TEST GIS DATA FROM UNION ASTRONOMIQUE INTERNATIONAL (国際天文学連合): MARS, Olympus mons
--Testcase 11:
CREATE SCHEMA "♂";
--Testcase 12:
CREATE TABLE "♂"."テスト" (
id int4 NULL,
"UAI" varchar(254) NULL,
"⌖" public.geometry(point, 104904) NULL,
geom public.geometry(geometry, 104904) NULL,
"t₀" date NULL,
"class" text NULL,
"URL" varchar(80) NULL
);
--Testcase 13: ETC...
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(991, 'Olympus Mons', 'SRID=104904;POINT (226.19749330952843 18.652758890345698)'::geometry, 'SRID=104904;MULTIPOLYGON (((223.78717231750488 23.3314151763916, 224.22803688049316 23.324007034301758, 224.32436180114746 23.5648136138916, 224.7186985015869 23.593564987182617, 224.79486274719238 23.45737648010254, 225.06530570983887 23.238798141479492, 225.67255210876465 23.437196731567383, 226.2211856842041 23.6611385345459, 226.5472011566162 23.65372657775879, 227.6215763092041 23.435148239135742, 228.19009590148926 23.390283584594727, 228.753023147583 23.24955177307129, 228.90711784362793 23.1943416595459, 229.23219108581543 23.004926681518555, 229.5288143157959 22.75514030456543, 229.87227058410645 22.442903518676758, 230.2469539642334 22.14628028869629, 230.7309169769287 21.927717208862305, 231.30854988098145 21.64670753479004, 231.85495948791504 21.084684371948242, 232.19841957092285 19.88258171081543, 231.88618278503418 18.47752571105957, 231.30854988098145 17.743772506713867, 231.21887397766113 17.218599319458008, 231.17812156677246 16.751802444458008, 230.97346687316895 16.353670120239258, 230.8327350616455 15.947111129760742, 230.62945365905762 15.478002548217773, 230.4574489593506 15.352907180786133, 230.20748329162598 15.29954719543457, 229.99631309509277 15.036508560180664, 229.72586631774902 14.640104293823242, 229.41096305847168 14.377065658569336, 228.98862266540527 14.10291862487793, 228.74040412902832 13.854700088500977, 228.5107135772705 13.83247184753418, 228.31806755065918 13.962137222290039, 227.93990516662598 13.929948806762695, 227.36133766174316 13.883039474487305, 227.04734230041504 13.813947677612305, 226.68895149230957 13.851762771606445, 226.4101276397705 13.839879989624023, 226.06347465515137 13.632848739624023, 225.7766170501709 13.617597579956055, 225.32925987243652 13.481771469116211, 224.76723670959473 13.591054916381836, 224.15838050842285 13.731557846069336, 223.12800407409668 14.106241226196289, 222.39425468444824 14.402864456176758, 221.67611503601074 14.918050765991211, 221.434663772583 15.403280258178711, 221.30129432678223 16.051607131958008, 221.0864200592041 16.410966873168945, 221.09012413024902 16.6591854095459, 221.1975612640381 17.09263801574707, 220.9971103668213 17.32316017150879, 220.75670051574707 17.422361373901367, 220.82338523864746 17.844701766967773, 221.18475532531738 18.073732376098633, 221.3567600250244 18.5584774017334, 221.40367317199707 19.10576820373535, 221.3567600250244 19.90325355529785, 221.42725563049316 20.59361457824707, 221.778959274292 21.40439796447754, 222.34188652038574 22.201879501342773, 223.01658821105957 23.272138595581055, 223.3759479522705 23.668546676635742, 223.3722438812256 23.675954818725586, 223.57600212097168 23.675954818725586, 223.70566749572754 23.542585372924805, 223.78717231750488 23.3314151763916)))'::geometry, '1973-01-01', 'mo', 'http://planetarynames.wr.usgs.gov/Feature/4453');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(248, 'Karzok', 'SRID=104904;POINT (228.262902951161 18.4035270924109)'::geometry, 'SRID=104904;MULTIPOLYGON (((228.269330978394 18.2748584747314, 228.266962051392 18.2748394012451, 228.264589309692 18.2748584747314, 228.26222038269 18.2749156951904, 228.259851455688 18.2750148773193, 228.257482528687 18.2751522064209, 228.255121231079 18.2753276824951, 228.252759933472 18.2755451202393, 228.250402450562 18.2757968902588, 228.248052597046 18.2760906219482, 228.245706558228 18.2764263153076, 228.243368148804 18.2767963409424, 228.241037368774 18.2772083282471, 228.23871421814 18.2776546478271, 228.236398696899 18.2781429290771, 228.234094619751 18.2786655426025, 228.231798171997 18.2792301177979, 228.229513168335 18.2798328399658, 228.227239608765 18.2804698944092, 228.224977493286 18.2811489105225, 228.222726821899 18.2818622589111, 228.220491409302 18.2826137542725, 228.218271255493 18.2833995819092, 228.216066360474 18.2842235565186, 228.213872909546 18.2850856781006, 228.211698532104 18.285982131958, 228.209539413452 18.2869167327881, 228.207399368286 18.2878856658936, 228.205278396606 18.2888889312744, 228.203172683716 18.2899265289307, 228.201089859009 18.2910022735596, 228.199026107788 18.2921085357666, 228.196981430054 18.2932529449463, 228.194959640503 18.2944278717041, 228.192956924438 18.2956371307373, 228.190980911255 18.2968769073486, 228.189023971558 18.2981548309326, 228.187093734741 18.2994594573975, 228.185186386108 18.3007984161377, 228.183305740356 18.3021678924561, 228.181447982788 18.3035678863525, 228.179616928101 18.3050022125244, 228.177812576294 18.3064632415771, 228.176038742065 18.307954788208, 228.174287796021 18.3094730377197, 228.172567367554 18.3110218048096, 228.170873641968 18.3126010894775, 228.16921043396 18.3142032623291, 228.16757774353 18.3158359527588, 228.165975570679 18.3174953460693, 228.164403915405 18.3191814422607, 228.162858963013 18.320894241333, 228.161352157593 18.3226299285889, 228.159872055054 18.3243923187256, 228.158430099487 18.3261775970459, 228.157014846802 18.3279857635498, 228.155637741089 18.3298168182373, 228.154294967651 18.3316707611084, 228.152982711792 18.3335475921631, 228.151708602905 18.3354473114014, 228.150468826294 18.337366104126, 228.149263381958 18.3393039703369, 228.148092269897 18.3412647247314, 228.14695930481 18.343240737915, 228.145864486694 18.3452396392822, 228.144804000854 18.3472537994385, 228.143781661987 18.3492832183838, 228.142793655396 18.3513317108154, 228.141847610474 18.3533954620361, 228.140939712524 18.3554744720459, 228.140066146851 18.3575687408447, 228.139234542847 18.3596782684326, 228.138441085815 18.3617992401123, 228.137685775757 18.3639354705811, 228.136972427368 18.3660831451416, 228.136297225952 18.3682422637939, 228.135660171509 18.3704090118408, 228.135065078735 18.3725872039795, 228.134511947632 18.37477684021, 228.133996963501 18.376974105835, 228.133520126343 18.3791828155518, 228.133085250854 18.3813953399658, 228.132692337036 18.3836154937744, 228.132341384888 18.3858432769775, 228.132028579712 18.3880748748779, 228.131757736206 18.3903102874756, 228.13152885437 18.3925533294678, 228.131341934204 18.39479637146, 228.131196975708 18.3970432281494, 228.131090164185 18.3992938995361, 228.131025314331 18.4015445709229, 228.131002426147 18.4037952423096, 228.131021499634 18.4060459136963, 228.13108253479 18.408296585083, 228.131185531616 18.4105472564697, 228.131326675415 18.4127941131592, 228.131513595581 18.4150371551514, 228.13173866272 18.4172801971436, 228.132005691528 18.4195156097412, 228.132314682007 18.4217510223389, 228.132661819458 18.4239749908447, 228.133054733276 18.4261989593506, 228.13348197937 18.4284114837646, 228.133955001831 18.4306163787842, 228.134466171265 18.4328174591064, 228.135019302368 18.4350070953369, 228.135610580444 18.4371852874756, 228.13624382019 18.4393558502197, 228.136919021606 18.4415149688721, 228.137628555298 18.4436626434326, 228.138380050659 18.4457988739014, 228.13917350769 18.4479236602783, 228.140001296997 18.4500331878662, 228.140871047974 18.452127456665, 228.141775131226 18.4542064666748, 228.142721176147 18.4562740325928, 228.143705368042 18.4583225250244, 228.144723892212 18.460355758667, 228.145784378052 18.4623699188232, 228.146879196167 18.4643688201904, 228.148008346558 18.4663486480713, 228.149175643921 18.4683094024658, 228.150381088257 18.4702472686768, 228.151620864868 18.4721698760986, 228.152894973755 18.4740695953369, 228.154203414917 18.4759464263916, 228.155546188354 18.47780418396, 228.156923294067 18.4796352386475, 228.158334732056 18.4814472198486, 228.159776687622 18.4832363128662, 228.161256790161 18.4849987030029, 228.162763595581 18.4867343902588, 228.164304733276 18.4884471893311, 228.16587638855 18.4901371002197, 228.167478561401 18.4917964935303, 228.169115066528 18.49342918396, 228.170778274536 18.4950351715088, 228.172468185425 18.4966144561768, 228.174192428589 18.4981670379639, 228.175939559937 18.4996891021729, 228.177717208862 18.5011806488037, 228.179521560669 18.5026454925537, 228.181352615356 18.5040760040283, 228.183210372925 18.5054798126221, 228.185094833374 18.5068492889404, 228.187002182007 18.5081920623779, 228.188936233521 18.50950050354, 228.190893173218 18.5107746124268, 228.192869186401 18.5120182037354, 228.194871902466 18.5132274627686, 228.196897506714 18.5144062042236, 228.198942184448 18.5155506134033, 228.201009750366 18.5166568756104, 228.203096389771 18.5177326202393, 228.205202102661 18.5187740325928, 228.207326889038 18.5197811126709, 228.209466934204 18.5207500457764, 228.211629867554 18.5216846466064, 228.213804244995 18.5225811004639, 228.21600151062 18.5234432220459, 228.218210220337 18.5242710113525, 228.220434188843 18.5250568389893, 228.22266960144 18.5258121490479, 228.224924087524 18.5265254974365, 228.227186203003 18.5272045135498, 228.229463577271 18.5278415679932, 228.23175239563 18.5284442901611, 228.234052658081 18.5290088653564, 228.236360549927 18.5295352935791, 228.238679885864 18.5300235748291, 228.241006851196 18.5304698944092, 228.243341445923 18.5308818817139, 228.245683670044 18.5312557220459, 228.248029708862 18.531587600708, 228.250383377075 18.5318813323975, 228.252744674683 18.5321369171143, 228.255109786987 18.5323505401611, 228.257474899292 18.5325298309326, 228.259847640991 18.5326671600342, 228.262216567993 18.5327663421631, 228.26459312439 18.5328235626221, 228.266965866089 18.5328426361084, 228.269342422485 18.5328235626221, 228.271715164185 18.5327625274658, 228.274087905884 18.5326671600342, 228.276456832886 18.5325298309326, 228.278825759888 18.5323505401611, 228.281187057495 18.5321369171143, 228.283548355103 18.5318813323975, 228.285902023315 18.531587600708, 228.288251876831 18.5312519073486, 228.290594100952 18.5308818817139, 228.292928695679 18.5304698944092, 228.295255661011 18.5300197601318, 228.297574996948 18.5295352935791, 228.299882888794 18.5290088653564, 228.302179336548 18.5284442901611, 228.304468154907 18.5278415679932, 228.306745529175 18.5272006988525, 228.309011459351 18.5265254974365, 228.311262130737 18.5258083343506, 228.313501358032 18.5250568389893, 228.315725326538 18.5242671966553, 228.317934036255 18.5234432220459, 228.320127487183 18.5225811004639, 228.322305679321 18.5216808319092, 228.324464797974 18.5207462310791, 228.326608657837 18.5197772979736, 228.328733444214 18.5187702178955, 228.330839157104 18.5177326202393, 228.332925796509 18.5166568756104, 228.334989547729 18.5155467987061, 228.337034225464 18.5144023895264, 228.339059829712 18.5132274627686, 228.341062545776 18.5120143890381, 228.343042373657 18.5107707977295, 228.344995498657 18.5094966888428, 228.346929550171 18.5081882476807, 228.348836898804 18.5068454742432, 228.350721359253 18.5054759979248, 228.352579116821 18.5040721893311, 228.354410171509 18.5026416778564, 228.356214523315 18.5011768341064, 228.357992172241 18.4996852874756, 228.359739303589 18.4981632232666, 228.361463546753 18.4966106414795, 228.363153457642 18.4950313568115, 228.364816665649 18.4934253692627, 228.366449356079 18.491792678833, 228.368055343628 18.4901294708252, 228.369626998901 18.4884433746338, 228.371168136597 18.4867305755615, 228.372674942017 18.4849910736084, 228.374151229858 18.4832286834717, 228.375597000122 18.4814434051514, 228.37700843811 18.4796314239502, 228.378385543823 18.4778003692627, 228.379728317261 18.4759426116943, 228.381036758423 18.4740619659424, 228.38231086731 18.4721660614014, 228.383550643921 18.4702434539795, 228.38475227356 18.4683017730713, 228.385919570923 18.4663410186768, 228.387052536011 18.4643650054932, 228.388147354126 18.462366104126, 228.389204025269 18.4603481292725, 228.390226364136 18.4583187103271, 228.391206741333 18.4562664031982, 228.392152786255 18.4542026519775, 228.393060684204 18.4521198272705, 228.393926620483 18.4500255584717, 228.394758224487 18.4479160308838, 228.395547866821 18.4457950592041, 228.396299362183 18.4436588287354, 228.397012710571 18.4415111541748, 228.39768409729 18.4393520355225, 228.398317337036 18.4371814727783, 228.398908615112 18.4349994659424, 228.399461746216 18.4328098297119, 228.399972915649 18.4306125640869, 228.40044593811 18.4284076690674, 228.400876998901 18.4261913299561, 228.401266098022 18.4239711761475, 228.401613235474 18.4217433929443, 228.401922225952 18.4195117950439, 228.402189254761 18.417272567749, 228.402414321899 18.4150333404541, 228.402597427368 18.4127864837646, 228.402742385864 18.4105396270752, 228.40284538269 18.4082927703857, 228.402902603149 18.406042098999, 228.402921676636 18.403787612915, 228.402898788452 18.4015369415283, 228.402837753296 18.3992862701416, 228.402730941772 18.3970394134521, 228.402585983276 18.3947887420654, 228.402395248413 18.3925457000732, 228.402166366577 18.3903064727783, 228.401895523071 18.3880672454834, 228.401586532593 18.385835647583, 228.401231765747 18.3836116790771, 228.400838851929 18.3813877105713, 228.40040397644 18.3791751861572, 228.399930953979 18.3769702911377, 228.399415969849 18.3747730255127, 228.398859024048 18.3725833892822, 228.398263931274 18.3704051971436, 228.397626876831 18.3682346343994, 228.396951675415 18.3660755157471, 228.396238327026 18.3639316558838, 228.395483016968 18.361795425415, 228.394689559937 18.3596744537354, 228.393857955933 18.3575649261475, 228.392988204956 18.3554706573486, 228.39207649231 18.3533916473389, 228.391130447388 18.3513278961182, 228.390146255493 18.3492794036865, 228.389120101929 18.3472461700439, 228.388063430786 18.3452320098877, 228.386964797974 18.3432369232178, 228.385831832886 18.3412609100342, 228.384660720825 18.3393001556396, 228.383455276489 18.3373622894287, 228.382215499878 18.3354434967041, 228.380941390991 18.3335437774658, 228.379629135132 18.3316669464111, 228.378286361694 18.32981300354, 228.376905441284 18.3279819488525, 228.375494003296 18.3261699676514, 228.374048233032 18.3243846893311, 228.37257194519 18.3226261138916, 228.371061325073 18.3208866119385, 228.369520187378 18.3191776275635, 228.367948532104 18.3174915313721, 228.366346359253 18.3158321380615, 228.364709854126 18.3141994476318, 228.363046646118 18.3125972747803, 228.361356735229 18.3110179901123, 228.359636306763 18.3094692230225, 228.357885360718 18.3079509735107, 228.356107711792 18.3064594268799, 228.354303359985 18.3049983978271, 228.352472305298 18.3035640716553, 228.350618362427 18.3021640777588, 228.348733901978 18.3007946014404, 228.346826553345 18.2994556427002, 228.344896316528 18.2981510162354, 228.342943191528 18.2968769073486, 228.340963363647 18.29563331604, 228.33896446228 18.2944240570068, 228.336938858032 18.293249130249, 228.334897994995 18.2921085357666, 228.332830429077 18.2909984588623, 228.33074760437 18.2899265289307, 228.328645706177 18.2888851165771, 228.3265209198 18.2878818511963, 228.324380874634 18.2869129180908, 228.322221755981 18.285982131958, 228.32004737854 18.2850856781006, 228.31785774231 18.2842235565186, 228.315649032593 18.2833995819092, 228.313428878784 18.2826099395752, 228.311193466187 18.2818584442139, 228.3089427948 18.2811450958252, 228.306684494019 18.2804698944092, 228.304410934448 18.2798290252686, 228.302125930786 18.2792301177979, 228.299829483032 18.2786655426025, 228.297521591187 18.2781391143799, 228.295206069946 18.2776546478271, 228.292882919312 18.2772045135498, 228.290552139282 18.2767963409424, 228.288213729858 18.2764225006104, 228.28586769104 18.2760906219482, 228.283517837524 18.2757968902588, 228.281160354614 18.2755451202393, 228.278802871704 18.2753276824951, 228.276437759399 18.2751522064209, 228.274072647095 18.2750148773193, 228.271703720093 18.2749156951904, 228.269330978394 18.2748584747314)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14144');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(249, 'Pangboche', 'SRID=104904;POINT (226.595873773026 17.2783598670807)'::geometry, 'SRID=104904;MULTIPOLYGON (((226.601442337036 17.1929302215576, 226.599878311157 17.1929187774658, 226.598310470581 17.1929302215576, 226.596746444702 17.1929721832275, 226.595178604126 17.1930370330811, 226.593618392944 17.1931285858154, 226.592054367065 17.1932430267334, 226.590497970581 17.1933879852295, 226.588941574097 17.1935558319092, 226.587385177612 17.193754196167, 226.585836410522 17.1939754486084, 226.58429145813 17.1942195892334, 226.582754135132 17.1944942474365, 226.581216812134 17.1947917938232, 226.57968711853 17.1951160430908, 226.578165054321 17.195463180542, 226.576650619507 17.195837020874, 226.57513999939 17.1962375640869, 226.573637008667 17.1966648101807, 226.572145462036 17.197114944458, 226.570657730103 17.1975879669189, 226.569181442261 17.1980876922607, 226.567712783813 17.1986103057861, 226.566255569458 17.1991596221924, 226.564809799194 17.1997318267822, 226.563371658325 17.2003269195557, 226.561948776245 17.20094871521, 226.56053352356 17.2015933990479, 226.559129714966 17.2022609710693, 226.557741165161 17.2029514312744, 226.556364059448 17.2036647796631, 226.555002212524 17.2044010162354, 226.553651809692 17.2051601409912, 226.552316665649 17.2059421539307, 226.550992965698 17.2067432403564, 226.549688339233 17.2075710296631, 226.54839515686 17.2084178924561, 226.547121047974 17.2092876434326, 226.545862197876 17.2101764678955, 226.544618606567 17.211088180542, 226.543394088745 17.2120189666748, 226.542184829712 17.2129688262939, 226.540990829468 17.2139415740967, 226.539819717407 17.2149333953857, 226.538663864136 17.2159404754639, 226.537527084351 17.2169704437256, 226.536409378052 17.2180194854736, 226.535310745239 17.219087600708, 226.534231185913 17.2201709747314, 226.533174514771 17.2212734222412, 226.532133102417 17.2223949432373, 226.531118392944 17.2235317230225, 226.530118942261 17.2246875762939, 226.529146194458 17.2258586883545, 226.528188705444 17.2270450592041, 226.527257919312 17.2282466888428, 226.526346206665 17.2294635772705, 226.525461196899 17.2306995391846, 226.52459526062 17.2319469451904, 226.523752212524 17.2332057952881, 226.522932052612 17.2344837188721, 226.522138595581 17.2357730865479, 226.521364212036 17.2370738983154, 226.520616531372 17.2383899688721, 226.519891738892 17.2397136688232, 226.519193649292 17.2410526275635, 226.518518447876 17.2424030303955, 226.517869949341 17.2437648773193, 226.517244338989 17.245138168335, 226.516641616821 17.2465190887451, 226.516069412231 17.2479114532471, 226.515520095825 17.2493152618408, 226.514993667603 17.2507228851318, 226.514497756958 17.2521419525146, 226.514024734497 17.253568649292, 226.513578414917 17.2550029754639, 226.513158798218 17.2564449310303, 226.512765884399 17.2578945159912, 226.512399673462 17.2593479156494, 226.512060165405 17.2608089447021, 226.511747360229 17.2622776031494, 226.511461257935 17.2637462615967, 226.511201858521 17.2652225494385, 226.510969161987 17.2667026519775, 226.510766983032 17.2681865692139, 226.510587692261 17.2696743011475, 226.51043510437 17.2711620330811, 226.510313034058 17.2726535797119, 226.510217666626 17.27414894104, 226.510149002075 17.2756404876709, 226.510107040405 17.277135848999, 226.510091781616 17.2786350250244, 226.510103225708 17.2801303863525, 226.510145187378 17.2816257476807, 226.510213851929 17.2831211090088, 226.510305404663 17.2846164703369, 226.510431289673 17.2861080169678, 226.510580062866 17.2875957489014, 226.51075553894 17.289083480835, 226.510957717896 17.2905673980713, 226.511190414429 17.2920475006104, 226.511449813843 17.2935237884521, 226.51173210144 17.2949924468994, 226.512044906616 17.2964611053467, 226.512384414673 17.2979221343994, 226.51275062561 17.2993755340576, 226.513139724731 17.3008251190186, 226.513559341431 17.302267074585, 226.514001846313 17.3037014007568, 226.514474868774 17.3051280975342, 226.514970779419 17.306547164917, 226.515493392944 17.3079586029053, 226.516042709351 17.309362411499, 226.51661491394 17.310754776001, 226.517213821411 17.3121356964111, 226.517839431763 17.3135089874268, 226.518487930298 17.3148708343506, 226.519163131714 17.3162212371826, 226.519861221313 17.3175601959229, 226.520586013794 17.3188877105713, 226.521333694458 17.3202037811279, 226.522104263306 17.3215045928955, 226.522897720337 17.3227939605713, 226.523717880249 17.3240718841553, 226.524557113647 17.3253345489502, 226.525423049927 17.3265819549561, 226.52631187439 17.3278141021729, 226.527219772339 17.3290348052979, 226.528150558472 17.3302364349365, 226.529108047485 17.3314228057861, 226.530080795288 17.3325939178467, 226.531076431274 17.3337497711182, 226.532094955444 17.3348903656006, 226.533132553101 17.3360080718994, 226.53419303894 17.3371143341064, 226.535272598267 17.3381977081299, 226.536371231079 17.3392658233643, 226.537488937378 17.3403148651123, 226.538625717163 17.341344833374, 226.539781570435 17.3423557281494, 226.540952682495 17.3433475494385, 226.542146682739 17.3443202972412, 226.543355941772 17.3452739715576, 226.544580459595 17.3462047576904, 226.545824050903 17.3471164703369, 226.547082901001 17.3480052947998, 226.548360824585 17.3488750457764, 226.549654006958 17.3497219085693, 226.550958633423 17.350549697876, 226.552282333374 17.351354598999, 226.553617477417 17.3521366119385, 226.554967880249 17.3528957366943, 226.55633354187 17.3536319732666, 226.557710647583 17.3543453216553, 226.559099197388 17.3550395965576, 226.560503005981 17.3557071685791, 226.561918258667 17.356351852417, 226.563344955444 17.356969833374, 226.564783096313 17.3575687408447, 226.566232681274 17.3581409454346, 226.56768989563 17.3586902618408, 226.569158554077 17.3592128753662, 226.570634841919 17.359712600708, 226.572122573853 17.3601894378662, 226.573617935181 17.3606395721436, 226.575120925903 17.36106300354, 226.576631546021 17.3614635467529, 226.578149795532 17.361837387085, 226.579675674438 17.3621883392334, 226.581205368042 17.362512588501, 226.58274269104 17.3628101348877, 226.584283828735 17.3630847930908, 226.585828781128 17.3633289337158, 226.587377548218 17.3635501861572, 226.588933944702 17.363748550415, 226.590490341187 17.3639163970947, 226.592050552368 17.3640613555908, 226.593614578247 17.3641757965088, 226.595178604126 17.3642673492432, 226.596746444702 17.3643321990967, 226.598314285278 17.3643741607666, 226.599882125854 17.3643856048584, 226.601449966431 17.3643741607666, 226.603017807007 17.3643321990967, 226.604581832886 17.3642673492432, 226.606145858765 17.3641757965088, 226.607709884644 17.3640613555908, 226.609270095825 17.3639163970947, 226.610830307007 17.3637447357178, 226.612382888794 17.3635501861572, 226.613931655884 17.3633289337158, 226.615480422974 17.3630809783936, 226.617021560669 17.3628101348877, 226.618558883667 17.362512588501, 226.620088577271 17.3621883392334, 226.621610641479 17.361837387085, 226.623128890991 17.3614635467529, 226.624639511108 17.36106300354, 226.626142501831 17.3606395721436, 226.627637863159 17.3601856231689, 226.629125595093 17.359712600708, 226.630601882935 17.3592128753662, 226.632070541382 17.3586902618408, 226.633531570435 17.3581409454346, 226.634977340698 17.3575687408447, 226.636415481567 17.356969833374, 226.637842178345 17.3563480377197, 226.63925743103 17.3557033538818, 226.640661239624 17.3550357818604, 226.642049789429 17.3543453216553, 226.643426895142 17.3536319732666, 226.644792556763 17.3528957366943, 226.646142959595 17.3521327972412, 226.647478103638 17.3513507843018, 226.648801803589 17.3505458831787, 226.650110244751 17.3497219085693, 226.651399612427 17.3488750457764, 226.652677536011 17.3480052947998, 226.653936386108 17.3471126556396, 226.655179977417 17.3462009429932, 226.656408309937 17.3452701568604, 226.65761756897 17.3443202972412, 226.658807754517 17.3433475494385, 226.659982681274 17.3423557281494, 226.661138534546 17.341344833374, 226.662275314331 17.3403148651123, 226.66339302063 17.3392658233643, 226.664487838745 17.3381977081299, 226.665567398071 17.3371105194092, 226.666627883911 17.3360080718994, 226.667665481567 17.3348865509033, 226.668684005737 17.3337459564209, 226.669679641724 17.3325939178467, 226.670656204224 17.3314228057861, 226.67160987854 17.3302326202393, 226.672540664673 17.3290309906006, 226.673448562622 17.3278141021729, 226.674337387085 17.3265781402588, 226.675203323364 17.3253307342529, 226.676042556763 17.324068069458, 226.676862716675 17.3227939605713, 226.677656173706 17.3215007781982, 226.678426742554 17.3201999664307, 226.679174423218 17.318883895874, 226.679899215698 17.3175563812256, 226.680597305298 17.3162174224854, 226.681272506714 17.3148670196533, 226.681921005249 17.3135051727295, 226.682546615601 17.3121318817139, 226.683145523071 17.3107509613037, 226.683717727661 17.3093585968018, 226.684267044067 17.307954788208, 226.684789657593 17.3065433502197, 226.685285568237 17.3051242828369, 226.685754776001 17.3036975860596, 226.686201095581 17.3022632598877, 226.686616897583 17.3008213043213, 226.687009811401 17.2993717193604, 226.687376022339 17.2979183197021, 226.687715530396 17.2964572906494, 226.688024520874 17.2949886322021, 226.688310623169 17.2935199737549, 226.688570022583 17.2920436859131, 226.688798904419 17.290563583374, 226.689004898071 17.2890796661377, 226.689180374146 17.2875919342041, 226.689329147339 17.2861042022705, 226.689451217651 17.2846126556396, 226.689546585083 17.2831172943115, 226.689615249634 17.2816219329834, 226.689653396606 17.2801265716553, 226.689668655396 17.2786312103271, 226.689653396606 17.277135848999, 226.689611434937 17.2756366729736, 226.689542770386 17.2741451263428, 226.689443588257 17.2726497650146, 226.689321517944 17.2711582183838, 226.689168930054 17.2696704864502, 226.688993453979 17.2681827545166, 226.688787460327 17.2666988372803, 226.688554763794 17.2652187347412, 226.68829536438 17.2637424468994, 226.688009262085 17.2622737884521, 226.687696456909 17.2608051300049, 226.687356948853 17.2593441009521, 226.686990737915 17.2578907012939, 226.686597824097 17.256441116333, 226.686178207397 17.2549991607666, 226.685731887817 17.2535648345947, 226.685258865356 17.2521381378174, 226.684762954712 17.2507190704346, 226.684236526489 17.2493114471436, 226.683687210083 17.2479076385498, 226.683115005493 17.2465152740479, 226.682512283325 17.2451343536377, 226.681886672974 17.2437610626221, 226.681238174438 17.2424030303955, 226.680562973022 17.2410526275635, 226.679864883423 17.2397136688232, 226.679140090942 17.2383861541748, 226.678392410278 17.2370700836182, 226.677618026733 17.2357692718506, 226.676824569702 17.2344799041748, 226.67600440979 17.2332057952881, 226.675161361694 17.2319431304932, 226.674295425415 17.2306957244873, 226.673410415649 17.2294635772705, 226.672498703003 17.2282428741455, 226.671564102173 17.2270412445068, 226.670610427856 17.2258548736572, 226.669637680054 17.2246837615967, 226.66863822937 17.2235317230225, 226.6676197052 17.22239112854, 226.666582107544 17.2212734222412, 226.665525436401 17.2201709747314, 226.664445877075 17.2190837860107, 226.663347244263 17.2180194854736, 226.662229537964 17.2169704437256, 226.661092758179 17.2159404754639, 226.659936904907 17.2149295806885, 226.658761978149 17.2139377593994, 226.657571792603 17.2129650115967, 226.656362533569 17.2120151519775, 226.655138015747 17.2110843658447, 226.653894424438 17.2101726531982, 226.652635574341 17.2092838287354, 226.651357650757 17.2084140777588, 226.650068283081 17.2075672149658, 226.648759841919 17.2067432403564, 226.647439956665 17.2059383392334, 226.646104812622 17.2051563262939, 226.64475440979 17.2043972015381, 226.643388748169 17.2036609649658, 226.642011642456 17.2029476165771, 226.640623092651 17.2022571563721, 226.639223098755 17.2015895843506, 226.637807846069 17.2009449005127, 226.636381149292 17.2003269195557, 226.63494682312 17.1997318267822, 226.633497238159 17.1991558074951, 226.632040023804 17.1986103057861, 226.630575180054 17.1980838775635, 226.629095077515 17.1975879669189, 226.627611160278 17.1971111297607, 226.62611579895 17.1966609954834, 226.624616622925 17.1962375640869, 226.623106002808 17.195837020874, 226.621587753296 17.195463180542, 226.620065689087 17.1951160430908, 226.618535995483 17.1947917938232, 226.617002487183 17.1944942474365, 226.615461349487 17.1942195892334, 226.613916397095 17.1939716339111, 226.612367630005 17.1937503814697, 226.610815048218 17.1935558319092, 226.609258651733 17.1933879852295, 226.607698440552 17.1932430267334, 226.60613822937 17.1931285858154, 226.604574203491 17.1930370330811, 226.603010177612 17.1929721832275, 226.601442337036 17.1929302215576)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14145');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1849, 'Hermes Patera', 'SRID=104904;POINT (226.57 18.33)'::geometry, 'SRID=104904;POLYGON ((226.27743530274 18.067016601562, 226.25820922852 18.135681152343, 226.255462646485 18.216705322265124, 226.26507568359813 18.293609619139627, 226.25614929199594 18.331375122069314, 226.26095581055 18.369140624999, 226.28842163086 18.465270996093, 226.35159301758 18.528442382812, 226.44772338867 18.577880859374, 226.48480224609438 18.594360351561626, 226.52462768555 18.6026000976555, 226.57955932617 18.608093261718, 226.68118286133 18.586120605468, 226.70590209961 18.569641113281, 226.74435424805 18.539428710937, 226.78555297852 18.514709472656, 226.83224487305 18.498229980468, 226.86932373046687 18.488616943359126, 226.89404296875 18.4721374511715, 226.90090942383 18.451538085937, 226.90640258789 18.410339355468, 226.91189575195 18.380126953124, 226.92013549805 18.322448730468, 226.90640258789 18.251037597656, 226.87344360352 18.187866210937, 226.82949829102 18.146667480468, 226.79379272461 18.113708496093, 226.77456665039 18.102722167968, 226.72787475586 18.119201660156, 226.68392944336 18.141174316406, 226.63723754883125 18.15490722656175, 226.58779907226562 18.14254760742125, 226.56033325195 18.121948242187, 226.52188110352 18.088989257812, 226.48617553711 18.067016601562, 226.45321655274 18.083496093749, 226.38729858399 18.086242675781, 226.32412719727 18.078002929687, 226.27743530274 18.067016601562))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15690');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1688, 'Olympus Rupes', 'SRID=104904;POINT (226.43548539543502 18.401964175317982)'::geometry, 'SRID=104904;MULTILINESTRING ((227.42951774597168 22.934080123901367, 227.93671226501465 22.65593910217285, 228.34573936462402 22.4268856048584, 228.52571296691895 22.295995712280273, 228.67296028137207 22.099660873413086, 228.96746253967285 22.099660873413086, 229.62190437316895 21.739717483520508, 230.1290988922119 21.477941513061523, 230.35815620422363 21.26524543762207, 230.38258171081543 21.086992263793945, 230.2117748260498 20.55558967590332, 230.71787071228027 19.182798385620117, 230.8653507232666 18.500219345092773, 230.8653507232666 18.058469772338867, 230.8653507232666 17.96030616760254, 230.88171195983887 16.978639602661133, 230.9144344329834 16.635053634643555, 230.73446083068848 16.389638900756836, 230.6690158843994 16.242387771606445, 230.55448722839355 15.980611801147461, 230.45632362365723 15.816999435424805, 230.35815620422363 15.506139755249023, 230.0472927093506 15.457056045532227, 229.83220100402832 15.140348434448242, 229.54010200500488 14.73716926574707, 229.22923851013184 14.442667007446289, 228.86929512023926 14.213613510131836, 228.5420742034912 14.05000114440918, 228.2148494720459 14.148168563842773, 227.8221836090088 14.148168563842773, 227.2168254852295 13.984556198120117, 226.85687828063965 13.968194961547852, 226.49693489074707 14.05000114440918, 226.0879077911377 13.77186393737793, 225.80977058410645 13.755502700805664, 225.55567741394043 13.881429672241211, 225.3911952972412 14.058565139770508, 224.9426326751709 14.73716926574707, 224.76265907287598 14.73716926574707, 224.36999320983887 14.573556900024414, 223.97732734680176 14.802610397338867, 223.29015922546387 15.12983512878418, 222.70116233825684 15.391611099243164, 222.4393825531006 15.40797233581543, 221.93218803405762 15.40797233581543, 221.57224464416504 15.66975212097168, 221.4413547515869 16.09514045715332, 221.3431911468506 16.700498580932617, 221.39227104187012 17.07680320739746, 221.16321754455566 17.404027938842773, 220.89009284973145 17.53165626525879, 220.90144157409668 17.84577751159668, 221.14274787902832 17.76296043395996, 221.52316093444824 17.61672019958496, 221.86674308776855 18.074831008911133, 222.06307792663574 18.614748001098633, 221.8994655609131 18.860166549682617, 221.6376895904541 19.252832412719727, 221.62132835388184 19.59641456604004, 221.7358570098877 20.185415267944336, 221.94854927062988 20.774412155151367, 222.079439163208 21.26524543762207, 222.48846626281738 21.854246139526367, 222.99566078186035 22.508691787719727, 223.43741035461426 22.934080123901367, 223.78099250793457 23.13041114807129, 224.04277229309082 23.064966201782227, 224.3045482635498 22.999521255493164, 224.72993659973145 22.934080123901367, 224.9917163848877 22.88499641418457, 225.2862148284912 22.934080123901367, 225.72796440124512 23.01588249206543, 226.2351589202881 23.146772384643555, 226.61146354675293 23.27766227722168, 227.05321311950684 23.097688674926758, 227.42951774597168 22.934080123901367))'::geometry, '1976-01-01', 'ru', 'http://planetarynames.wr.usgs.gov/Feature/4454');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1847, 'Zeus Patera', 'SRID=104904;POINT (227.07 18.39)'::geometry, 'SRID=104904;POLYGON ((226.50457763673 18.675384521485, 226.51556396485 18.70834350586, 226.55401611329 18.766021728516, 226.6254272461 18.820953369141, 226.71881103516 18.853912353516, 226.82043457032 18.886871337891, 226.91107177735 18.886871337891, 226.99621582032 18.875885009766, 227.03741455079 18.873138427735, 226.99346923829 18.831939697266, 226.97973632813 18.77426147461, 226.99896240235 18.702850341797, 227.06213378907 18.631439208985, 227.15002441407 18.584747314454, 227.23516845704 18.568267822266, 227.30383300781875 18.59024047851625, 227.33404541016 18.628692626954, 227.34503173829 18.658905029297, 227.39721679688 18.587493896485, 227.42742919923 18.494110107422, 227.42193603516 18.408966064454, 227.39996337891 18.315582275391, 227.39172363282 18.227691650391, 227.34228515626 18.123321533204, 227.29559326173 18.018951416016, 227.21319580079 17.942047119141, 227.15551757813 17.903594970704, 227.09783935548 17.876129150391, 227.00170898438 17.845916748047, 226.9330444336 17.840423583985, 226.88635253907 17.840423583985, 226.90832519532 17.876129150391, 226.91381835938 17.925567626954, 226.90283203126 17.972259521485, 226.87536621094 18.021697998047, 226.82318115235 18.062896728516, 226.77923583985 18.098602294922, 226.83691406251 18.156280517579, 226.88360595704 18.233184814454, 226.91107177735 18.315582275391, 226.8890991211 18.40072631836, 226.88085937501 18.474884033204, 226.83142089844 18.507843017579, 226.72430419923 18.546295166016, 226.67761230469 18.584747314454, 226.6254272461 18.614959716797, 226.58972167969 18.617706298829, 226.62817382813 18.645172119141, 226.67761230469 18.650665283204, 226.61993408204 18.661651611329, 226.56500244141 18.64242553711, 226.4935913086 18.653411865235, 226.50457763673 18.675384521485))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15689');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1848, 'Athena Patera', 'SRID=104904;POINT (227.18 18.74)'::geometry, 'SRID=104904;POLYGON ((227.0290374756 18.766021728515, 227.04002380372 18.807220458984, 227.06062316896 18.840179443359, 227.08259582521 18.867645263671, 227.12928771974 18.880004882812, 227.17597961427 18.877258300781, 227.22541809083 18.866271972656, 227.28172302247 18.825073242187, 227.31605529786 18.775634765624, 227.328414917 18.731689453124, 227.33116149903 18.691864013671, 227.30369567872 18.656158447265, 227.2844696045 18.619079589843, 227.23915100099 18.599853515624, 227.18147277833 18.599853515624, 227.10594177247 18.624572753906, 227.05513000489 18.665771484374, 227.02491760255 18.705596923828, 227.0207977295 18.744049072265, 227.0290374756 18.766021728515))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15693');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1850, 'Apollo Patera', 'SRID=104904;POINT (226.45 17.94)'::geometry, 'SRID=104904;POLYGON ((226.28540039064 17.909774780272, 226.27441406252 17.938613891601, 226.26754760744 17.981185913085, 226.27716064455 18.027877807616, 226.30325317385 18.074569702147, 226.35818481447 18.091049194335, 226.40075683596 18.091049194335, 226.46804809572 18.073196411132, 226.52572631838 18.045730590819, 226.56967163088 18.023757934569, 226.63146972658 17.946853637694, 226.63558959963 17.878189086913, 226.62185668947 17.83836364746, 226.61911010744 17.806777954101, 226.59439086916 17.788925170897, 226.52847290041 17.780685424804, 226.45980834963 17.808151245116, 226.40899658205 17.832870483397, 226.37878417971 17.841110229491, 226.33758544924 17.864456176757, 226.30462646486 17.887802124022, 226.28540039064 17.909774780272))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15694');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1851, 'Olympus Paterae', 'SRID=104904;POINT (226.81 18.32)'::geometry, 'SRID=104904;POLYGON ((226.14367675781 18.452911376953, 226.16564941406 18.513336181641, 226.2041015625 18.554534912109, 226.23431396484 18.592987060547, 226.30572509766 18.625946044922, 226.36889648438 18.650665283203, 226.42108154297 18.653411865234, 226.45678710938 18.642425537109, 226.49249267578 18.700103759766, 226.54193115234 18.755035400391, 226.58312988281 18.809967041016, 226.65454101563 18.845672607422, 226.72320556641 18.870391845703, 226.82757568359 18.895111083984, 226.88525390625 18.911590576172, 226.96545410157 18.900604248046, 227.0121459961 18.900604248046, 227.04785156251 18.889617919921, 227.08355712891 18.906097412109, 227.13299560548 18.917083740234, 227.21813964844 18.911590576171, 227.28405761719 18.875885009765, 227.33349609376 18.829193115234, 227.37194824219 18.771514892578, 227.37744140626 18.735809326171, 227.38156127930375 18.711776733397812, 227.3808746337928 18.69255065917931, 227.37469482423 18.675384521484, 227.40216064454 18.620452880859, 227.43237304688 18.571014404296, 227.4515991211 18.496856689453, 227.45709228516 18.441925048828, 227.44885253907 18.38150024414, 227.44061279298 18.323822021484, 227.43237304688 18.277130126953, 227.41589355469 18.202972412109, 227.38018798829 18.120574951171, 227.34448242188 18.05191040039, 227.31701660157 17.999725341796, 227.26757812501 17.950286865234, 227.22088623048 17.911834716796, 227.17419433594 17.870635986328, 227.12475585938 17.848663330078, 227.03686523438 17.821197509765, 226.97918701173 17.801971435546, 226.88580322266 17.815704345703, 226.85009765626 17.790985107421, 226.81439208985 17.769012451171, 226.7484741211 17.741546630859, 226.68530273438 17.733306884765, 226.62762451173 17.738800048828, 226.57543945313 17.736053466796, 226.50128173829 17.72232055664, 226.39416503907 17.758026123046, 226.32550048829 17.78823852539, 226.29803466798 17.823944091796, 226.27056884766 17.843170166015, 226.21289062501 17.89810180664, 226.20465087891 17.966766357421, 226.22937011719 18.035430908203, 226.20465087891 18.084869384765, 226.18267822266 18.13980102539, 226.17169189454 18.18374633789, 226.17993164063 18.20571899414, 226.15795898438 18.252410888671, 226.13873291016 18.318328857421, 226.13049316407 18.389739990234, 226.14367675781 18.452911376953))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15695');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1870, 'Dionysus Patera', 'SRID=104904;POINT (226.77 17.96)'::geometry, 'SRID=104904;POLYGON ((226.53973388672 18.046417236328, 226.564453125 18.082122802735, 226.60015869141 18.11508178711, 226.64410400391 18.134307861328, 226.71826171875 18.117828369141, 226.77868652344 18.09310913086, 226.83361816406 18.043670654297, 226.87756347656 17.988739013672, 226.89129638672 17.936553955078, 226.8720703125 17.870635986328, 226.828125 17.82943725586, 226.7484741211 17.799224853516, 226.68530273438 17.793731689453, 226.64959716797 17.78549194336, 226.61389160156 17.782745361328, 226.63037109375 17.848663330078, 226.63037109375 17.914581298828, 226.62213134766 17.972259521485, 226.58093261719 18.021697998047, 226.53973388672 18.046417236328))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15692');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1871, 'Hera Patera', 'SRID=104904;POINT (226.23 18.45)'::geometry, 'SRID=104904;POLYGON ((226.21000671387 18.244171142578, 226.18116760254063 18.30047607421875, 226.17567443848188 18.347167968749623, 226.17155456543125 18.41445922851525, 226.19902038575 18.489990234375377, 226.24021911621563 18.549041748046875, 226.32124328613438 18.602600097655873, 226.37892150879125 18.616333007812376, 226.44209289551 18.61083984375, 226.396774292 18.582000732422, 226.3610687255875 18.55316162109375, 226.31986999512 18.511962890625, 226.2827911377 18.474884033203, 226.27043151856 18.428192138672, 226.24845886231 18.367767333984, 226.24021911621 18.21533203125, 226.21000671387 18.244171142578))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15691');
-- TEST GIS DATA FROM OPENSTREETMAP: EARTH, Ancienne Sylvie
--Testcase 14:
CREATE TABLE "♁" (
geom public.geometry NOT NULL,
osm_type varchar(16) NOT NULL,
osm_id int8 NOT NULL,
ver int2 NOT NULL,
arr _int8 NULL,
t json NULL
);
--Testcase 15: ETC...
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4596087 59.6907755)'::geometry, 'node', 1621246531, 4, NULL, '{"drain":"disperse"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601391 59.6904673)'::geometry, 'node', 1621246620, 24, NULL, '{"access":"yes","addr:housenumber":"20 литВЕ","addr:street":"Садовая улица","architect":"Ж.-Ф. Тома де Томон","barrier":"gate","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6458/","historic":"yes","locked":"no","name":"Ворота памятника Любезным родителям","ref:okn":"781610399040286","start_date":"1807","tourism":"attraction","wikidata":"Q118122048"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617098 59.6910199)'::geometry, 'node', 1632220259, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617672 59.6909141)'::geometry, 'node', 1632220283, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461757 59.6909696)'::geometry, 'node', 1632220292, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614802 59.6907676)'::geometry, 'node', 1632220315, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615866 59.6907823)'::geometry, 'node', 1632220319, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611444 59.6908848)'::geometry, 'node', 1632220350, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611916 59.6908345)'::geometry, 'node', 1632220355, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.46127 59.6907954)'::geometry, 'node', 1632220358, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611342 59.6909402)'::geometry, 'node', 1632220359, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614212 59.6910868)'::geometry, 'node', 1632220364, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611621 59.6909941)'::geometry, 'node', 1632220366, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616766 59.6908145)'::geometry, 'node', 1632220378, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616314 59.691059)'::geometry, 'node', 1632220590, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613148 59.6910721)'::geometry, 'node', 1632220686, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613385 59.6907988)'::geometry, 'node', 1632497609, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6476/","historic":"yes","historic:start_date":"1794","int_name":"Euterpe","material":"metal","name":"Эвтерпа","name:el":"Εὐτέρπη","name:la":"Euterpē","name:uk":"Евтерпа","name:zh":"欧忒耳佩","note":"Ошибочно подписано «Clio»","ref":"П-61/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614438 59.6907856)'::geometry, 'node', 1632497610, 30, NULL, '{"alt_name:el":"Χλωρίς","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1796","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6475/","historic":"yes","historic:start_date":"1796","int_name":"Flore","material":"metal","name":"Флора","name:el":"Φλόρα","name:en":"Flora","ref":"П-62/1","ref:okn":"781610399040456","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461244 59.690833)'::geometry, 'node', 1632497611, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6470/","historic":"yes","historic:start_date":"1795","int_name":"Melpomene","material":"metal","name":"Мельпомена","name:el":"Μελπομένη","name:en":"Melpomene","name:la":"Melpomenē","name:uk":"Мельпомена","name:zh":"墨爾波墨涅","ref":"П-60/1","ref:okn":"781610399040376","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617227 59.6909514)'::geometry, 'node', 1632497612, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6468/","historic":"yes","historic:start_date":"1793","int_name":"Caliope","material":"metal","name":"Калиопа","name:el":"Καλλιόπη","name:la":"Calliopē","name:uk":"Калліопа","name:zh":"卡利俄佩","ref":"П-65/1","start_date":"1798","tourism":"artwork","wikidata":"Q120979306"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615805 59.6907985)'::geometry, 'node', 1632497613, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6474/","historic":"yes","historic:start_date":"1795","int_name":"Uranie","material":"metal","name":"Урания","name:el":"Οὐρανία","name:la":"Ūrania","ref":"П-63/1","ref:okn":"78161039904044","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616825 59.6908428)'::geometry, 'node', 1632497614, 29, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6469/","historic":"yes","historic:start_date":"1794","material":"metal","name":"Клио","name:el":"Κλειώ","name:la":"Clīō","note":"Подписано «Euterpe»","ref":"П-64/1","ref:okn":"781610399040466","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614541 59.6909278)'::geometry, 'node', 1632497615, 34, NULL, '{"alt_name":"Аполлон Бельведерский","artist_name":"Леохар;модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1782","artwork_type":"statue","description":"Иконография Бельведерского типа. В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6466/","historic":"yes","historic:start_date":"1782","material":"metal","name":"Аполлон","name:en":"Apollo","name:zh":"阿波罗神像","ref":"П-71/1","ref:okn":"781610399040386","start_date":"1817","tourism":"artwork","wikidata":"Q118122062"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616021 59.6910564)'::geometry, 'node', 1632497616, 26, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1780","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","historic":"yes","historic:start_date":"1780","material":"metal","name":"Венера Каллипиги","ref":"П-67/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616651 59.6910293)'::geometry, 'node', 1632497617, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6471/","historic":"yes","historic:start_date":"1793","int_name":"Polymnia","material":"metal","name":"Полигимния","name:el":"Πολύμνια","name:la":"Polyhymnia","name:uk":"Полігімнія","name:zh":"波吕许谟尼亚","ref":"П-66/1","ref:okn":"781610399040726","start_date":"1798","tourism":"artwork","wikidata":"Q121395079"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614666 59.6910732)'::geometry, 'node', 1632497618, 30, NULL, '{"alt_name":"Гермес Флорентийский","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6467/","historic":"yes","historic:start_date":"1794","int_name":"Hermes","material":"metal","name":"Меркурий","name:en":"Mercury","ref":"П-68/1","ref:okn":"781610399040396","start_date":"1810","tourism":"artwork","wikidata":"Q121395060"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613231 59.6910597)'::geometry, 'node', 1632497619, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_subject:wikidata":"Q104413","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6477/","historic":"yes","historic:start_date":"1793","int_name":"Erato","material":"metal","name":"Эрато","name:el":"Ἐρατώ","name:ka":"ერატო","name:ko":"에라토","name:la":"Eratō","name:uk":"Ерато","name:zh":"厄剌托","ref":"П-69/1","ref:okn":"781610399040476","start_date":"1798","tourism":"artwork","wikidata":"Q121395110"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612077 59.691005)'::geometry, 'node', 1632497620, 31, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6473/","historic":"yes","historic:start_date":"1794","int_name":"Terpsichore","material":"metal","name":"Терпсихора","name:el":"Τερψιχόρη","name:en":"Terpsichore","name:la":"Terpsichore","ref":"П-70/1","ref:okn":"781610399040436","start_date":"1798","tourism":"artwork","wikidata":"Q121395096"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611782 59.690902)'::geometry, 'node', 1632497621, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1792","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6472/","historic":"yes","historic:start_date":"1792","int_name":"Thalie","material":"metal","name":"Талия","name:el":"Θαλία","name:la":"Thalīa","name:uk":"Талія","name:zh":"塔利亚","ref":"П-59/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612041 59.6907321)'::geometry, 'node', 1632503254, 6, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.462536 59.6908707)'::geometry, 'node', 1652587953, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4619277 59.6908578)'::geometry, 'node', 1652587958, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617256 59.6909215)'::geometry, 'node', 3177639362, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612018 59.6909805)'::geometry, 'node', 3188928044, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613001 59.6906759)'::geometry, 'node', 3218618266, 4, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614144 59.6907882)'::geometry, 'node', 4912277772, 4, NULL, '{"board_type":"history","information":"board","name":"Флора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615482 59.6907937)'::geometry, 'node', 4912277773, 4, NULL, '{"board_type":"history","information":"board","name":"Урания","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613145 59.6908057)'::geometry, 'node', 4912277774, 4, NULL, '{"board_type":"history","information":"board","name":"Эвтерпа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616653 59.6908341)'::geometry, 'node', 4912277775, 4, NULL, '{"board_type":"history","information":"board","name":"Клио","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612216 59.6908451)'::geometry, 'node', 4912277776, 4, NULL, '{"board_type":"history","information":"board","name":"Мельпомена","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611751 59.690919)'::geometry, 'node', 4912277777, 4, NULL, '{"board_type":"history","information":"board","name":"Талия","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617272 59.6909351)'::geometry, 'node', 4912277778, 4, NULL, '{"board_type":"history","information":"board","name":"Калиопа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612298 59.691015)'::geometry, 'node', 4912277779, 4, NULL, '{"board_type":"history","information":"board","name":"Терпсихора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616819 59.6910157)'::geometry, 'node', 4912277780, 4, NULL, '{"board_type":"history","information":"board","name":"Полигимния","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461621 59.6910498)'::geometry, 'node', 4912277781, 4, NULL, '{"board_type":"history","information":"board","name":"Венера Каллипиги","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613548 59.6910624)'::geometry, 'node', 4912277782, 4, NULL, '{"board_type":"history","information":"board","name":"Эрато","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615016 59.6910712)'::geometry, 'node', 4912277783, 4, NULL, '{"board_type":"history","information":"board","name":"Меркурий","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608954 59.6897746)'::geometry, 'node', 5251698420, 25, NULL, '{"access":"permissive","addr:housenumber":"20 литББ","addr:street":"Садовая улица","architect":"Винченцо Бренна","barrier":"gate","description:access":"Ворота можно закрывать и открывать руками","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6459/","historic":"yes","locked":"no","name":"Большие Старосильвийские ворота","ref":"1","ref:okn":"781620399040626","start_date":"1786..1793","tourism":"attraction","website":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","wheelchair":"yes","wikidata":"Q118122050"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460198 59.6905729)'::geometry, 'node', 6758903438, 6, NULL, '{"artist_name":"И.П. Мартос","artwork_type":"sculpture","height":"4","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4625734 59.6908311)'::geometry, 'node', 8331430683, 3, NULL, '{"inlet":"grate","manhole":"drain","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614743 59.690923)'::geometry, 'node', 8530936200, 1, NULL, '{"board_type":"history","information":"board","name":"Аполлон","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4597619 59.6907527)'::geometry, 'node', 9140565043, 1, NULL, '{"ford":"yes"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4606891 59.6906687)'::geometry, 'node', 9140576937, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608515 59.6907117)'::geometry, 'node', 9140576938, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613945 59.6911519)'::geometry, 'node', 9143069530, 5, NULL, '{"drain":"no","source:direction":"survey"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('POINT (30.4615903 59.6911716)'::geometry, 'node', 9143069534, 1, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460339 59.6906064)'::geometry, 'node', 9143093777, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601191 59.6906349)'::geometry, 'node', 9143093778, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610445 59.6908345)'::geometry, 'node', 9143093802, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610243 59.6909861)'::geometry, 'node', 9143093804, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612126 59.691117)'::geometry, 'node', 9143093806, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460445 59.6910504)'::geometry, 'node', 9656736571, 2, NULL, '{"colour":"#4e3a39","description":"Веломаршрут №4","height":"4","information":"guidepost","material":"metal","start_date":"2021-03..2021-10","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4608056 59.6895935, 30.4608954 59.6897746, 30.4609447 59.6898691, 30.4614541 59.6909278)'::geometry, 'way', 30995960, 42, '{9140727117,5251698420,1518870630,1632497615}', '{"highway":"footway","historic":"yes","name":"Центральная аллея","ref":"VII","source:name":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605616 59.6906319, 30.4597619 59.6907527, 30.4596087 59.6907755)'::geometry, 'way', 149099000, 6, '{1621246509,9140565043,1621246531}', '{"intermittent":"yes","source:direction":"isoline","start_date":"1786","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604741 59.6903357, 30.4604598 59.6904575, 30.4604646 59.6905099, 30.4604784 59.6905443, 30.4604933 59.6905665, 30.4605321 59.6905996, 30.4605616 59.6906319)'::geometry, 'way', 149099004, 8, '{1621246503,9140576877,1621246482,1621246465,1621246454,9140576939,1621246509}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601177 59.6905796, 30.4600903 59.6905709, 30.4600721 59.6905605, 30.4600579 59.6905458, 30.4600519 59.6905296, 30.4600545 59.6905133, 30.4600656 59.6904979, 30.4600844 59.6904845, 30.4601095 59.690474, 30.4601391 59.6904673, 30.460169 59.6904648, 30.4601991 59.6904661, 30.4602277 59.6904711, 30.4602498 59.6904787, 30.4602686 59.6904892, 30.4602829 59.6905018, 30.4602918 59.6905174, 30.4602917 59.6905327, 30.4602881 59.6905462, 30.4602793 59.6905579)'::geometry, 'way', 149099028, 5, '{9140576951,9140576902,9140576952,1621246602,1621246607,1621246668,1621246614,1621246615,1621246618,1621246620,1621246630,1621246244,1621246631,1621246224,1621246250,1621246635,1621246647,9140576950,9140576903,9140576949}', '{"barrier":"fence","colour":"green","fence_type":"wood","height":"2"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4603352 59.6911039, 30.460353 59.6910638, 30.4603719 59.6910414, 30.4603979 59.691021, 30.4604807 59.6909761, 30.460577 59.6909284, 30.4606406 59.6908886, 30.460669 59.6908562, 30.460673 59.6908234, 30.4606633 59.6907504, 30.4606582 59.6907286, 30.4606491 59.6907025, 30.4606314 59.690668, 30.460609 59.690636, 30.4605858 59.6906064, 30.4605578 59.6905735, 30.4605362 59.6905385, 30.4605214 59.6905022, 30.4605119 59.6904644, 30.4605095 59.6904098, 30.460512 59.6903499, 30.4605096 59.6903011)'::geometry, 'way', 149099029, 36, '{9140727237,4260007753,9140727241,8650331583,1621246592,1621246588,1621246578,1652603857,9140727240,8650331584,1621246577,9143093738,1621246419,9140576875,1652603906,9140576876,1621246542,8650331586,9140576874,8650331585,1621246403,9140576873,1239612684}', '{"alt_name":"Окружная дорожка","highway":"footway","historic":"yes","name":"Круговая дорожка","start_date":"1789.1793","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610979 59.6907799, 30.4608515 59.6907117)'::geometry, 'way', 149099034, 9, '{1632503255,9140576938}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4629005 59.6913411, 30.4614541 59.6909278)'::geometry, 'way', 150294524, 8, '{1239612692,1632497615}', '{"highway":"footway","historic":"yes","ref":"III","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613148 59.6910721, 30.4613667 59.6910818, 30.4614212 59.6910868, 30.4614766 59.6910869, 30.4615311 59.6910822, 30.4615833 59.6910728, 30.4616314 59.691059, 30.461674 59.6910412, 30.4617098 59.6910199, 30.4617378 59.6909958, 30.461757 59.6909696, 30.4617669 59.6909421, 30.4617672 59.6909141, 30.4617579 59.6908866, 30.4617393 59.6908603, 30.4617119 59.690836, 30.4616766 59.6908145, 30.4616343 59.6907964, 30.4615866 59.6907823, 30.4615347 59.6907726, 30.4614802 59.6907676, 30.4614248 59.6907674, 30.4613703 59.6907721, 30.4613181 59.6907815, 30.46127 59.6907954, 30.4612274 59.6908132, 30.4611916 59.6908345, 30.4611636 59.6908586, 30.4611444 59.6908848, 30.4611345 59.6909123, 30.4611342 59.6909402, 30.4611435 59.6909678, 30.4611621 59.6909941, 30.4611895 59.6910184, 30.4612248 59.6910399, 30.461267 59.6910579, 30.4613148 59.6910721)'::geometry, 'way', 150294525, 6, '{1632220686,9143093824,1632220364,9143093807,1632220588,9143093808,1632220590,9143093809,1632220259,9143093810,1632220292,9143093811,1632220283,9143093812,1632220296,9143093813,1632220378,9143093814,1632220319,9143093815,1632220315,9143093816,1632220323,9143093817,1632220358,9143093818,1632220355,9143093819,1632220350,9143093820,1632220359,9143093821,1632220366,9143093822,1632220374,9143093823,1632220686}', '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.460726 59.6910052, 30.460614 59.6910145, 30.4605241 59.69102, 30.4604597 59.691022, 30.4603979 59.691021)'::geometry, 'way', 150294532, 30, '{1632497615,1632220252,9140727238,9140727242,9140727239,1621246592}', '{"highway":"footway","historic":"yes","name":"луч домика Крик","ref":"X","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605096 59.6903011, 30.4614541 59.6909278)'::geometry, 'way', 150294541, 8, '{1239612684,1632497615}', '{"highway":"footway","historic":"yes","ref":"VIII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4617339 59.6901702)'::geometry, 'way', 150294547, 9, '{1632497615,1518870645}', '{"highway":"footway","historic":"yes","ref":"VI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461819 59.6910085, 30.4618473 59.6909863, 30.4618928 59.6909647, 30.461951 59.6909401, 30.4620356 59.6909251, 30.462536 59.6908707)'::geometry, 'way', 152440395, 6, '{1652587944,1652587948,1652587950,9143093800,1652587952,1652587953}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613063 59.6907075, 30.4612631 59.6907161, 30.4612041 59.6907321)'::geometry, 'way', 152442436, 10, '{1652605207,9143204222,1632503254}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4617627 59.6907689, 30.4618218 59.6907946, 30.4618794 59.6908253, 30.4619277 59.6908578)'::geometry, 'way', 152442438, 8, '{1652605205,1652605201,1652605200,1652587958}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4612018 59.6909805, 30.4617256 59.6909215, 30.4625734 59.6908311, 30.4628306 59.6908088)'::geometry, 'way', 311975108, 20, '{3188928044,3177639362,8331430683,7911801321}', '{"layer":"-1","name":"Старосильвийская дождевая канализация","source:direction":"survey","tunnel":"yes","waterway":"drain"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611708 59.6911018, 30.4611289 59.6910829, 30.4610793 59.6910531, 30.4610552 59.6910294, 30.4610432 59.6910153, 30.4610243 59.6909861)'::geometry, 'way', 313051687, 8, '{1632503180,9143069533,9143093805,9143069532,1632503185,9143093804}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061)'::geometry, 'way', 426269715, 5, '{4255746051,4255746033,9140576943,9140576942,9140576941,9140576940,4255746057,4255746007,9140576945,9140576946,9140576944,4255746054,4255745992,4255746051}', '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603979 59.691021, 30.4603224 59.6910067, 30.4602382 59.6909843, 30.4601137 59.6909482, 30.4600256 59.6909178, 30.4599203 59.6908773, 30.4597958 59.6908259, 30.4597422 59.6908088, 30.4596966 59.6907997, 30.4596501 59.6907961, 30.4596189 59.6907966, 30.4595885 59.6908005, 30.4595518 59.6908091, 30.4595101 59.6908241)'::geometry, 'way', 438780267, 20, '{1621246592,1621246561,1622496989,8850590008,1621246248,1621246252,8650331580,8849369897,9140576840,8650331579,9140576841,8650331578,9140576842,1622496957}', '{"highway":"footway","historic":"yes","loc_name":"Спуск у места домика Крик","name":"Криковская дорога","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4625498 59.6908065, 30.4614541 59.6909278)'::geometry, 'way', 750779153, 4, '{1632220250,1632497615}', '{"highway":"footway","historic":"yes","ref":"IV","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4631938 59.6918756)'::geometry, 'way', 750779155, 5, '{1632497615,1195120146}', '{"highway":"footway","historic":"yes","ref":"II","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4606491 59.6907025)'::geometry, 'way', 750779156, 5, '{1632497615,1621246419}', '{"highway":"footway","historic":"yes","ref":"IX","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4625914 59.6924527)'::geometry, 'way', 750779157, 4, '{1632497615,1652587960}', '{"highway":"footway","historic":"yes","ref":"I","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611165 59.6918779, 30.46118 59.6916919, 30.4614541 59.6909278)'::geometry, 'way', 750779158, 4, '{9159459639,1239612686,1632497615}', '{"highway":"footway","historic":"yes","ref":"XII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4596189 59.6907966, 30.4596712 59.6907865, 30.4597275 59.6907729, 30.459757 59.6907607, 30.4597619 59.6907527, 30.4597677 59.6907431, 30.4597919 59.6907269, 30.4598455 59.6907093, 30.459934 59.6906931, 30.4600118 59.6906782, 30.4600467 59.690666, 30.4600681 59.6906484, 30.4600725 59.6906275, 30.4600655 59.6906044, 30.4600295 59.6905552, 30.4600066 59.6905268, 30.4600031 59.690512, 30.4600111 59.6904995, 30.460044 59.6904799, 30.4600789 59.6904629, 30.4601241 59.6904473)'::geometry, 'way', 988944864, 2, '{9140576841,9140565053,9140565052,9140565051,9140565043,9140565050,9140565049,9140565048,9140565047,9140565046,9140565045,9140565044,1621246253,9140565042,1621246302,1621246323,9140576899,9140576892,9143093786,9143093785,1621246340}', '{"highway":"path","surface":"ground"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4607784 59.690696, 30.4606891 59.6906687)'::geometry, 'way', 988944880, 3, '{9140576936,9140576937}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601316 59.6905738, 30.4601383 59.6905745, 30.460144 59.6905725, 30.4601453 59.6905691, 30.4601415 59.6905663, 30.4601348 59.6905656, 30.4601291 59.6905676, 30.4601278 59.6905709, 30.4601316 59.6905738)'::geometry, 'way', 989184163, 1, '{9142788307,9142788306,9142788305,9142788304,9142788303,9142788302,9142788301,9142788300,9142788307}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601637 59.6905695, 30.4601704 59.6905701, 30.4601761 59.6905682, 30.4601774 59.6905648, 30.4601736 59.6905619, 30.4601668 59.6905613, 30.4601612 59.6905632, 30.4601599 59.6905666, 30.4601637 59.6905695)'::geometry, 'way', 989184166, 1, '{9142819031,9142819030,9142819029,9142819028,9142819027,9142819026,9142819025,9142819024,9142819031}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4615026 59.6911479, 30.4614481 59.6911519, 30.4613945 59.6911519)'::geometry, 'way', 989211851, 4, '{1652605211,9143069529,9143069530}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603719 59.6910414, 30.4597387 59.6911122)'::geometry, 'way', 989211857, 12, '{8650331583,4260007752}', '{"highway":"path","historic":"yes","name":"луч домика Крик","start_date":"1780.1785"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603446 59.6911727, 30.4603806 59.6910714, 30.4603967 59.691047, 30.4604235 59.6910376, 30.4604664 59.6910348, 30.4605415 59.6910308)'::geometry, 'way', 989211858, 1, '{9143069609,9143069608,9143069607,9143069606,9143069605,9143069604}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613583 59.6906799, 30.4614025 59.6907746, 30.461428 59.6907726, 30.4614548 59.6907726, 30.4614763 59.6907739)'::geometry, 'way', 989211859, 1, '{9143093728,9143093727,9143093726,9143093725,9143093724}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461314 59.6906832, 30.461361 59.6907794, 30.4613301 59.6907854, 30.4613033 59.6907929, 30.4612845 59.690799, 30.4609841 59.6905973)'::geometry, 'way', 989211860, 1, '{9143093729,9143093730,9143093731,9143093732,9143093734,9143093733}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611484 59.6909364, 30.4611471 59.6909174, 30.4611497 59.6909005, 30.4611578 59.6908836, 30.4611645 59.6908714, 30.4611739 59.6908606, 30.4606917 59.6907283, 30.460681 59.6907283, 30.460677 59.6907337, 30.460685 59.6907601, 30.4606891 59.6907817, 30.4606917 59.6908129, 30.4606944 59.6908426, 30.4606837 59.6908656, 30.4606596 59.6908927, 30.4606247 59.6909184, 30.460563 59.6909523, 30.460453 59.6910064)'::geometry, 'way', 989211861, 1, '{9143093739,9143093740,9143093741,9143093742,9143093743,9143093744,9143093755,9143093737,9143093736,9143093754,9143093753,9143093722,9143093721,9143093720,9143093719,9143093718,9143093717,9143069616}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605335 59.6903364, 30.4605335 59.6903946, 30.4605308 59.6904501, 30.4605348 59.6904813, 30.4605442 59.6905137, 30.4605576 59.6905394, 30.4605818 59.6905773, 30.4606193 59.6906247, 30.4606408 59.6906545, 30.4606596 59.6906856, 30.4606716 59.6906958, 30.4606958 59.6907039, 30.4611947 59.6908433, 30.4612155 59.6908301, 30.4612369 59.6908166, 30.461253 59.6908098, 30.4609492 59.6906112)'::geometry, 'way', 989211862, 1, '{9143093764,9143093763,9143093762,9143093748,9143093761,9143093760,9143093759,9143093758,9143093757,9143093756,9143093752,9143093751,9143093750,9143093747,9143093746,9143093745,9143093735}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604919 59.6903357, 30.4604919 59.690398, 30.4604892 59.6904494, 30.4604946 59.690486, 30.4605053 59.6905157, 30.4605161 59.6905387, 30.4605402 59.6905766, 30.4605778 59.690624, 30.4605992 59.6906538, 30.460626 59.6906931, 30.4606368 59.6907255, 30.4606448 59.6907574, 30.4606502 59.6907871, 30.4606542 59.6908196, 30.4606502 59.6908494, 30.4606327 59.6908751, 30.4606059 59.6908927, 30.4605496 59.6909266, 30.4604128 59.6909942)'::geometry, 'way', 989211863, 1, '{9143093776,9143093775,9143093774,9143093773,9143093749,9143093772,9143093771,9143093770,9143093769,9143093768,9143093767,9143093765,9143093766,9143069615,9143069610,9143069614,9143069613,9143069612,9143069611}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619893 59.6908956, 30.4620356 59.6909251)'::geometry, 'way', 989211867, 2, '{1652587955,1652587952}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610753 59.6908007, 30.4610979 59.6907799)'::geometry, 'way', 989211868, 4, '{9143093801,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611491 59.6907553, 30.4610979 59.6907799)'::geometry, 'way', 989211869, 4, '{1632503177,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461012 59.6909572, 30.4610056 59.6909157, 30.4610163 59.6908698, 30.4610445 59.6908345)'::geometry, 'way', 989211870, 4, '{1632503179,9143093803,1632503181,9143093802}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613456 59.6911475, 30.46131 59.6911438, 30.4612696 59.6911343, 30.4612126 59.691117)'::geometry, 'way', 989211871, 4, '{1652605209,9143069531,1632503237,9143093806}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4622826 59.6903796)'::geometry, 'way', 991343632, 2, '{1632497615,1518870652}', '{"highway":"footway","historic":"yes","ref":"V","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4620021 59.690877, 30.4617551 59.6909043, 30.4617579 59.690914, 30.4617593 59.6909255, 30.4617606 59.6909377)'::geometry, 'way', 991343633, 1, '{9159456550,9159456549,9159456545,9159456544,9159456543}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619941 59.6908547, 30.4617471 59.690882, 30.4617392 59.6908714, 30.4617298 59.6908606, 30.4617164 59.6908491)'::geometry, 'way', 991343634, 1, '{9159456552,9159456551,9159456548,9159456547,9159456546}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4602794 59.6911745, 30.4603083 59.6910871)'::geometry, 'way', 991343661, 1, '{9159459675,9159459674}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4614541 59.6909278)'::geometry, 'way', 1042527594, 11, '{9140727237,1632497615}', '{"highway":"footway","historic":"yes","name":"луч Амфитеатра","ref":"XI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4611342 59.6909402, 30.4611345 59.6909123, 30.4611444 59.6908848, 30.4611636 59.6908586, 30.4611916 59.6908345, 30.4612274 59.6908132, 30.46127 59.6907954, 30.4613181 59.6907815, 30.4613703 59.6907721, 30.4614248 59.6907674, 30.4614802 59.6907676, 30.4615347 59.6907726, 30.4615866 59.6907823, 30.4616343 59.6907964, 30.4616766 59.6908145, 30.4617119 59.690836, 30.4617393 59.6908603, 30.4617579 59.6908866, 30.4617672 59.6909141, 30.4617669 59.6909421, 30.461757 59.6909696, 30.4617378 59.6909958, 30.4617098 59.6910199, 30.461674 59.6910412, 30.4616314 59.691059, 30.4615833 59.6910728, 30.4615311 59.6910822, 30.4614766 59.6910869, 30.4614212 59.6910868, 30.4613667 59.6910818, 30.4613148 59.6910721, 30.461267 59.6910579, 30.4612248 59.6910399, 30.4611895 59.6910184, 30.4611621 59.6909941, 30.4611435 59.6909678, 30.4611342 59.6909402)))'::geometry, 'way', 150294525, 6, NULL, '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034)))'::geometry, 'way', 426269715, 5, NULL, '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601599 59.6905666, 30.4601612 59.6905632, 30.4601668 59.6905613, 30.4601736 59.6905619, 30.4601774 59.6905648, 30.4601761 59.6905682, 30.4601704 59.6905701, 30.4601637 59.6905695, 30.4601599 59.6905666)))'::geometry, 'way', 989184166, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text, gm1 geometry, gg1 geography) SERVER sqlite_svr;
--Testcase 41: ERR - raster
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, read PostGOS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49: ERR, no SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 50: ERR, no SRID
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 52:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 53: ERR damaged, but there is SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = (decode('0101000020e6100000bf72ce99fe76', 'hex')::geometry);
-- Insert PostGIS/GEOS BLOB, read SpatiaLite BLOB
--Testcase 54: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 55:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 56:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 57: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 58:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 59:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 60: ERR damaged geometry, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (3, decode('0101000020e6100000bf72ce99fe76', 'hex'), NULL, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 61: ERR damaged geography, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (4, NULL, decode('0101000020e6100000bf72ce99fe76', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 62:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 63:
INSERT INTO "♂" SELECT * FROM "♂"."テスト";
--Testcase 64:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 65:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 66:
SELECT * FROM "♂";
--Testcase 67:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 69:
SELECT * FROM "♂";
--Testcase 70:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL ,
osm_id bigint OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t text
) SERVER sqlite_svr OPTIONS (table '♁');
--Testcase 71: ERR - No SRID
INSERT INTO "♁ FDW" SELECT * FROM "♁";
--Testcase 72: OK
SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 73:
UPDATE "♁" SET geom = ST_SetSRID(geom, 4326);
--Testcase 74:
INSERT INTO "♁ FDW" SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 75:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE bytea;
--Testcase 76:
SELECT * FROM "♁ FDW";
--Testcase 77:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE geometry;
--Testcase 78:
SELECT * FROM "♁ FDW";
--Testcase 79:
DROP FOREIGN TABLE "♂";
--Testcase 80:
DROP FOREIGN TABLE "♁ FDW";
--Testcase 81:
DROP TABLE "♁";
--Testcase 82:
DROP TABLE "♂"."テスト";
--Testcase 83:
DROP SCHEMA "♂";
-- Test operators implemented in PostGIS 3.4.2, other are not tested
-- SELECT testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 100 -> TC 150 -> TC200 -> TC250
-- WHERE testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 300 -> TC 350 -> TC400 -> TC450
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ gm1 g FROM "types_PostGIS";
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && gm1 g FROM "types_PostGIS";
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << gm1 g FROM "types_PostGIS";
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> gm1 g FROM "types_PostGIS";
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< gm1 g FROM "types_PostGIS";
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> gm1 g FROM "types_PostGIS";
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| gm1 g FROM "types_PostGIS";
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> gm1 g FROM "types_PostGIS";
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| gm1 g FROM "types_PostGIS";
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> gm1 g FROM "types_PostGIS";
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= gm1 g FROM "types_PostGIS";
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm = gm1 g FROM "types_PostGIS";
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| gm1 g FROM "types_PostGIS";
--Testcase 115
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> gm1 g FROM "types_PostGIS";
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> gm1 g FROM "types_PostGIS";
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ gm1 g FROM "types_PostGIS";
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ gm1 g FROM "types_PostGIS";
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 157:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 159:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> gg1 g FROM "types_PostGIS";
--Testcase 201:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && gg1 g FROM "types_PostGIS";
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> gg1 g FROM "types_PostGIS";
--Testcase 203:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg = gg1 g FROM "types_PostGIS";
--Testcase 204
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != gg1 g FROM "types_PostGIS";
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 300:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ gm1 IS NOT NULL;
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && gm1 IS NOT NULL;
--Testcase 302:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << gm1 IS NOT NULL;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> gm1 IS NOT NULL;
--Testcase 304:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< gm1 IS NOT NULL;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> gm1 IS NOT NULL;
--Testcase 306:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| gm1 IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> gm1 IS NOT NULL;
--Testcase 308:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| gm1 IS NOT NULL;
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> gm1 IS NOT NULL;
--Testcase 310:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= gm1 IS NOT NULL;
--Testcase 311:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm = gm1 IS NOT NULL;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& gm1 IS NOT NULL;
--Testcase 313:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| gm1 IS NOT NULL;
--Testcase 314:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> gm1 IS NOT NULL;
--Testcase 315:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> gm1 IS NOT NULL;
--Testcase 316:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ gm1 IS NOT NULL;
--Testcase 317:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ gm1 IS NOT NULL;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 351:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 352:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 353:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 354:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 355:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 356:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 357:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 358:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 359:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 360:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 361:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 362:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 363:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 364:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 365:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 366:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 367:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 368:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 369:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 370:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 400:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> gg1 IS NOT NULL;
--Testcase 401:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && gg1 IS NOT NULL;
--Testcase 402:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 404:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg = gg1 IS NOT NULL;
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != gg1 IS NOT NULL;
--Testcase 450:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 451:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 452:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 453:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 454:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 500:
DROP FOREIGN TABLE "types_PostGIS";
--Testcase 501:
DROP EXTENSION sqlite_fdw CASCADE;
--Testcase 502:
DROP EXTENSION postgis CASCADE;
================================================
FILE: sql/16.3/with_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 47:
CREATE EXTENSION postgis;
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/without_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/without_gis_support/nogis.sql
================================================
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 10:
CREATE DOMAIN geometry AS bytea;
--Testcase 11:
CREATE DOMAIN geography AS bytea;
--Testcase 12:
CREATE DOMAIN addbandarg AS bytea;
--Testcase 13:
CREATE DOMAIN box2d AS bytea;
--Testcase 14:
CREATE DOMAIN box3d AS bytea;
--Testcase 15:
CREATE DOMAIN geometry_dump AS bytea;
--Testcase 16:
CREATE DOMAIN geomval AS bytea;
--Testcase 17:
CREATE DOMAIN getfaceedges_returntype AS bytea;
--Testcase 18:
CREATE DOMAIN rastbandarg AS bytea;
--Testcase 19:
CREATE DOMAIN raster AS bytea;
--Testcase 20:
CREATE DOMAIN reclassarg AS bytea;
--Testcase 21:
CREATE DOMAIN summarystats AS bytea;
--Testcase 22:
CREATE DOMAIN topoelement AS bytea;
--Testcase 23:
CREATE DOMAIN topoelementarray AS bytea;
--Testcase 24:
CREATE DOMAIN topogeometry AS bytea;
--Testcase 25:
CREATE DOMAIN unionarg AS bytea;
--Testcase 26:
CREATE DOMAIN validatetopology_returntype AS bytea;
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text) SERVER sqlite_svr;
--Testcase 41: ERR unable to convert to unsupported PostGIS specific data type
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, but CANNOT read PostGIS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: read the same BLOBs
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
--Testcase 50:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
-- Insert a BLOB, read SpatiaLite BLOB without any transformations
--Testcase 51: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 52:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 53:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 54: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 55:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 56:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 57:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 58:
SELECT * FROM "♂";
--Testcase 59:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 60:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 61:
INSERT INTO "♂" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
--Testcase 62:
SELECT * FROM "♂";
--Testcase 63:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL,
osm_id int OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t json
) SERVER sqlite_svr
OPTIONS (table '♁');
--Testcase 55:
INSERT INTO "♁ FDW" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 67:
SELECT * FROM "♁ FDW";
-- PostGIS specific data types, but SpatiaLite or sqlite_fdw unsupported
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box2d;
--Testcase 69: -- ERR
SELECT * FROM "♂";
--Testcase 70:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box3d;
--Testcase 71: -- ERR
SELECT * FROM "♂";
--Testcase 72:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry_dump;
--Testcase 73: -- ERR
SELECT * FROM "♂";
--Testcase 74:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geomval;
--Testcase 75: -- ERR
SELECT * FROM "♂";
--Testcase 76:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE getfaceedges_returntype;
--Testcase 77: -- ERR
SELECT * FROM "♂";
--Testcase 78:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE rastbandarg;
--Testcase 79: -- ERR
SELECT * FROM "♂";
--Testcase 80:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE raster;
--Testcase 81: -- ERR
SELECT * FROM "♂";
--Testcase 82:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE reclassarg;
--Testcase 83: -- ERR
SELECT * FROM "♂";
--Testcase 84:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE summarystats;
--Testcase 85: -- ERR
SELECT * FROM "♂";
--Testcase 86:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelement;
--Testcase 87: -- ERR
SELECT * FROM "♂";
--Testcase 88:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelementarray;
--Testcase 89: -- ERR
SELECT * FROM "♂";
--Testcase 90:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topogeometry;
--Testcase 91: -- ERR
SELECT * FROM "♂";
--Testcase 92:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE unionarg;
--Testcase 93: -- ERR
SELECT * FROM "♂";
--Testcase 94:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE validatetopology_returntype;
--Testcase 95: -- ERR
SELECT * FROM "♂";
-- PostGIS specific data types, not bytea mode, hence error
--Testcase 96:
ALTER DOMAIN geometry RENAME TO geom0;
--Testcase 97:
ALTER DOMAIN geography RENAME TO geog0;
--Testcase 98:
CREATE DOMAIN geometry AS text;
--Testcase 99:
CREATE DOMAIN geography AS text;
--Testcase 100:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 101: -- ERR
SELECT * FROM "♂";
--Testcase 102:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geography;
--Testcase 102: -- ERR
SELECT * FROM "♂";
--Testcase 103:
DROP DOMAIN geometry CASCADE;
--Testcase 104:
DROP DOMAIN geography CASCADE;
--Testcase 105:
DROP DOMAIN addbandarg;
--Testcase 106:
DROP DOMAIN box2d;
--Testcase 107:
DROP DOMAIN box3d;
--Testcase 108:
DROP DOMAIN geometry_dump;
--Testcase 109:
DROP DOMAIN geomval;
--Testcase 110:
DROP DOMAIN getfaceedges_returntype;
--Testcase 111:
DROP DOMAIN rastbandarg;
--Testcase 112:
DROP DOMAIN raster CASCADE;
--Testcase 113:
DROP DOMAIN reclassarg;
--Testcase 114:
DROP DOMAIN summarystats;
--Testcase 115:
DROP DOMAIN topoelement;
--Testcase 116:
DROP DOMAIN topoelementarray;
--Testcase 117:
DROP DOMAIN topogeometry;
--Testcase 118:
DROP DOMAIN unionarg;
--Testcase 119:
DROP DOMAIN validatetopology_returntype;
--Testcase 120:
DROP DOMAIN geom0 CASCADE;
--Testcase 121:
DROP DOMAIN geog0 CASCADE;
--Testcase 122:
DROP SERVER sqlite_svr CASCADE;
--Testcase 123:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/16.3/without_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/aggregate.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 18:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
-- test for aggregate pushdown
--Testcase 8:
DROP SERVER IF EXISTS sqlite_svr CASCADE;
--Testcase 9:
DROP EXTENSION IF EXISTS sqlite_fdw CASCADE;
--Testcase 10:
CREATE EXTENSION sqlite_fdw;
--Testcase 11:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 12:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 1:
explain (costs off, verbose) select count(distinct a) from multiprimary;
--Testcase 2:
explain (costs off, verbose) select sum(b),max(b), min(b), avg(b) from multiprimary;
--Testcase 3:
explain (costs off, verbose) select sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 4:
explain (costs off, verbose) select sum(a) from multiprimary group by b having sum(a) > 0;
--Testcase 5:
explain (costs off, verbose) select sum(a) from multiprimary group by b having avg(a^2) > 0 and sum(a) > 0;
-- stddev and variance are not pushed down
--Testcase 6:
explain (costs off, verbose) select stddev(a) from multiprimary;
--Testcase 7:
explain (costs off, verbose) select sum(a) from multiprimary group by b having variance(a) > 0;
--Testcase 13:
DROP FOREIGN TABLE multiprimary;
--Testcase 16:
CREATE FOREIGN TABLE limittest(id serial OPTIONS (key 'true'), x int, y text) SERVER sqlite_svr;
--Testcase 17:
INSERT INTO limittest(x, y) VALUES (1, 'x'), (2, 'x'), (3, 'x'), (4, 'x');
--Testcase 18:
INSERT INTO limittest(x, y) VALUES (1, 'y'), (2, 'y'), (3, 'y'), (4, 'y');
--Testcase 19:
INSERT INTO limittest(x, y) VALUES (1, 'z'), (2, 'z'), (3, 'z'), (4, 'z');
--Testcase 20:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 21:
SELECT avg(x) FROM limittest GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 22:
EXPLAIN VERBOSE
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 23:
SELECT avg(x) FROM limittest WHERE x >= 0 GROUP BY y ORDER BY 1 DESC FETCH FIRST 2 ROWS WITH TIES;
--Testcase 24:
EXPLAIN VERBOSE
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 25:
SELECT x FROM limittest WHERE x > 0 ORDER BY 1 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 26:
EXPLAIN VERBOSE
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 27:
SELECT x FROM limittest ORDER BY 1 FETCH FIRST 2 ROWS ONLY;
--Testcase 28:
DROP FOREIGN TABLE limittest;
--Testcase 14:
DROP SERVER sqlite_svr;
--Testcase 15:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/aggregates.sql
================================================
--
-- AGGREGATES
--
--Testcase 266:
CREATE EXTENSION sqlite_fdw;
--Testcase 267:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 268:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 269:
CREATE FOREIGN TABLE aggtest (
a int2,
b float4
) SERVER sqlite_svr;
--Testcase 270:
CREATE FOREIGN TABLE student (
name text,
age int4,
location point,
gpa float8
) SERVER sqlite_svr;
--Testcase 271:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 272:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 782:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 783:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 784:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 785:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 786:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 273:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 787:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 788:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 789:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 790:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 791:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 274:
CREATE FOREIGN TABLE multi_arg_agg (a int OPTIONS (key 'true'), b int, c text) SERVER sqlite_svr;
--Testcase 275:
CREATE FOREIGN TABLE VARCHAR_TBL(f1 varchar(4) OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 276:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 588:
SET extra_float_digits = 0;
--Testcase 1:
SELECT avg(four) AS avg_1 FROM onek;
--Testcase 2:
SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
--Testcase 697:
CREATE FOREIGN TABLE agg_tb(v int, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 698:
INSERT INTO agg_tb(v) VALUES(1), (2), (3);
--Testcase 699: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 700:
DELETE FROM agg_tb;
--Testcase 701:
INSERT INTO agg_tb(v) VALUES (NULL);
--Testcase 702: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 703:
DELETE FROM agg_tb;
--Testcase 704:
INSERT INTO agg_tb(v) VALUES (NULL), (1), (2);
--Testcase 705: -- Pg 16+
SELECT any_value(v) FROM agg_tb;
--Testcase 706:
CREATE FOREIGN TABLE agg_tb2(v text) SERVER sqlite_svr;
--Testcase 707:
INSERT INTO agg_tb2(v) VALUES (array['hello', 'world']);
--Testcase 708: -- Pg 16+
SELECT any_value(v) FROM agg_tb2;
-- In 7.1, avg(float4) is computed using float8 arithmetic.
--Testcase 3:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 678:
SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest;
--Testcase 4:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 679:
SELECT avg(gpa)::numeric(10,3) AS avg_3_4 FROM ONLY student;
--Testcase 5:
SELECT sum(four) AS sum_1500 FROM onek;
--Testcase 6:
SELECT sum(a) AS sum_198 FROM aggtest;
--Testcase 7:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 680:
SELECT sum(b)::numeric(10,3) AS avg_431_773 FROM aggtest;
--Testcase 8:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 681:
SELECT sum(gpa)::numeric(10,3) AS avg_6_8 FROM ONLY student;
--Testcase 9:
SELECT max(four) AS max_3 FROM onek;
--Testcase 10:
SELECT max(a) AS max_100 FROM aggtest;
--Testcase 11:
SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
--Testcase 12:
SELECT max(student.gpa) AS max_3_7 FROM student;
--Testcase 13:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 682:
SELECT stddev_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 14:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 683:
SELECT stddev_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 15:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 684:
SELECT var_pop(b)::numeric(20,10) FROM aggtest;
--Testcase 16:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 685:
SELECT var_samp(b)::numeric(20,10) FROM aggtest;
--Testcase 17:
SELECT stddev_pop(b::numeric) FROM aggtest;
--Testcase 18:
SELECT stddev_samp(b::numeric) FROM aggtest;
--Testcase 19:
SELECT var_pop(b::numeric) FROM aggtest;
--Testcase 20:
SELECT var_samp(b::numeric) FROM aggtest;
-- population variance is defined for a single tuple, sample variance
-- is not
--Testcase 277:
CREATE FOREIGN TABLE agg_t3(a float8, b float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 278:
DELETE FROM agg_t3;
--Testcase 279:
INSERT INTO agg_t3 values (1.0::float8, 2.0::float8);
--Testcase 280:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 281:
DELETE FROM agg_t3;
--Testcase 282:
INSERT INTO agg_t3 values (3.0::float8, 4.0::float8);
--Testcase 283:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 284:
DELETE FROM agg_t3;
--Testcase 285:
INSERT INTO agg_t3 values ('inf'::float8, 'inf'::float8);
--Testcase 286:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 287:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 288:
DELETE FROM agg_t3;
--Testcase 289:
INSERT INTO agg_t3 values ('nan'::float8, 'nan'::float8);
--Testcase 290:
SELECT var_pop(a), var_samp(b) FROM agg_t3;
--Testcase 291:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t3;
--Testcase 292:
CREATE FOREIGN TABLE agg_t4(a float4, b float4, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 293:
DELETE FROM agg_t4;
--Testcase 294:
INSERT INTO agg_t4 values (1.0::float4, 2.0::float4);
--Testcase 295:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 296:
DELETE FROM agg_t4;
--Testcase 297:
INSERT INTO agg_t4 values (3.0::float4, 4.0::float4);
--Testcase 298:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 299:
DELETE FROM agg_t4;
--Testcase 300:
INSERT INTO agg_t4 values ('inf'::float4, 'inf'::float4);
--Testcase 301:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 302:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 303:
DELETE FROM agg_t4;
--Testcase 304:
INSERT INTO agg_t4 values ('nan'::float4, 'nan'::float4);
--Testcase 305:
SELECT var_pop(a), var_samp(b) FROM agg_t4;
--Testcase 306:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t4;
--Testcase 307:
CREATE FOREIGN TABLE agg_t5(a numeric, b numeric, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 308:
DELETE FROM agg_t5;
--Testcase 309:
INSERT INTO agg_t5 values (1.0::numeric, 2.0::numeric);
--Testcase 310:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 311:
DELETE FROM agg_t5;
--Testcase 312:
INSERT INTO agg_t5 values (3.0::numeric, 4.0::numeric);
--Testcase 313:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 597:
DELETE FROM agg_t5;
--Testcase 598:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 599:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 600:
DELETE FROM agg_t5;
--Testcase 601:
INSERT INTO agg_t5 values ('inf'::numeric, 'inf'::numeric);
--Testcase 602:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
--Testcase 314:
DELETE FROM agg_t5;
--Testcase 315:
INSERT INTO agg_t5 values ('nan'::numeric, 'nan'::numeric);
--Testcase 316:
SELECT var_pop(a), var_samp(b) FROM agg_t5;
--Testcase 317:
SELECT stddev_pop(a), stddev_samp(b) FROM agg_t5;
-- verify correct results for null and NaN inputs
--Testcase 318:
CREATE FOREIGN TABLE agg_t8(a text OPTIONS (key 'true'), b text) SERVER sqlite_svr;
--Testcase 319:
DELETE FROM agg_t8;
--Testcase 320:
INSERT INTO agg_t8 select * from generate_series(1,3);
--Testcase 321:
select sum(null::int4) from agg_t8;
--Testcase 322:
select sum(null::int8) from agg_t8;
--Testcase 323:
select sum(null::numeric) from agg_t8;
--Testcase 324:
select sum(null::float8) from agg_t8;
--Testcase 325:
select avg(null::int4) from agg_t8;
--Testcase 326:
select avg(null::int8) from agg_t8;
--Testcase 327:
select avg(null::numeric) from agg_t8;
--Testcase 328:
select avg(null::float8) from agg_t8;
--Testcase 329:
select sum('NaN'::numeric) from agg_t8;
--Testcase 330:
select avg('NaN'::numeric) from agg_t8;
-- verify correct results for infinite inputs
--Testcase 331:
DELETE FROM agg_t3;
--Testcase 332:
INSERT INTO agg_t3 VALUES ('1'::float8), ('infinity'::float8);
--Testcase 333:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 334:
DELETE FROM agg_t3;
--Testcase 335:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('1'::float8);
--Testcase 336:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 337:
DELETE FROM agg_t3;
--Testcase 338:
INSERT INTO agg_t3 VALUES ('infinity'::float8), ('infinity'::float8);
--Testcase 339:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 340:
DELETE FROM agg_t3;
--Testcase 341:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('infinity'::float8);
--Testcase 342:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 603:
DELETE FROM agg_t3;
--Testcase 604:
INSERT INTO agg_t3 VALUES ('-infinity'::float8), ('-infinity'::float8);
--Testcase 605:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 606:
DELETE FROM agg_t3;
--Testcase 607:
INSERT INTO agg_t3 VALUES ('1'::numeric), ('infinity'::numeric);
--Testcase 608:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 609:
DELETE FROM agg_t3;
--Testcase 610:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('1'::numeric);
--Testcase 611:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 612:
DELETE FROM agg_t3;
--Testcase 613:
INSERT INTO agg_t3 VALUES ('infinity'::numeric), ('infinity'::numeric);
--Testcase 614:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 615:
DELETE FROM agg_t3;
--Testcase 616:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('infinity'::numeric);
--Testcase 617:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
--Testcase 618:
DELETE FROM agg_t3;
--Testcase 619:
INSERT INTO agg_t3 VALUES ('-infinity'::numeric), ('-infinity'::numeric);
--Testcase 620:
SELECT sum(a), avg(a), var_pop(a) FROM agg_t3;
-- test accuracy with a large input offset
--Testcase 343:
CREATE FOREIGN TABLE agg_t6(a float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 344:
DELETE FROM agg_t6;
--Testcase 345:
INSERT INTO agg_t6 VALUES (100000003), (100000004), (100000006), (100000007);
--Testcase 346:
SELECT avg(a), var_pop(a) FROM agg_t6;
--Testcase 347:
DELETE FROM agg_t6;
--Testcase 348:
INSERT INTO agg_t6 VALUES (7000000000005), (7000000000007);
--Testcase 349:
SELECT avg(a), var_pop(a) FROM agg_t6;
-- SQL2003 binary aggregates
--Testcase 21:
SELECT regr_count(b, a) FROM aggtest;
--Testcase 22:
SELECT regr_sxx(b, a) FROM aggtest;
--Testcase 23:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 686:
SELECT regr_syy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 24:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 687:
SELECT regr_sxy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 25:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 688:
SELECT regr_avgx(b, a), regr_avgy(b, a)::numeric(20,10) FROM aggtest;
--Testcase 26:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 689:
SELECT regr_r2(b, a)::numeric(20,10) FROM aggtest;
--Testcase 27:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 690:
SELECT regr_slope(b, a)::numeric(20,10), regr_intercept(b, a)::numeric(20,10) FROM aggtest;
--Testcase 28:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 691:
SELECT covar_pop(b, a)::numeric(20,10), covar_samp(b, a)::numeric(20,10) FROM aggtest;
--Testcase 29:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 692:
SELECT corr(b, a)::numeric(20,10) FROM aggtest;
-- check single-tuple behavior
--Testcase 350:
CREATE FOREIGN TABLE agg_t7(a float8, b float8, c float8, d float8, id integer OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 351:
DELETE FROM agg_t7;
--Testcase 352:
INSERT INTO agg_t7 VALUES (1, 2, 3, 4);
--Testcase 353:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 354:
DELETE FROM agg_t7;
--Testcase 355:
INSERT INTO agg_t7 VALUES (1, 'inf', 3, 'inf');
--Testcase 356:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
--Testcase 357:
DELETE FROM agg_t7;
--Testcase 358:
INSERT INTO agg_t7 VALUES (1, 'nan', 3, 'nan');
--Testcase 359:
SELECT covar_pop(a,b), covar_samp(c,d) FROM agg_t7;
-- test accum and combine functions directly
--Testcase 360:
CREATE FOREIGN TABLE regr_test (x float8, y float8, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 361:
DELETE FROM regr_test;
--Testcase 362:
INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
--Testcase 363:
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);
--Testcase 364:
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 590:
EXPLAIN (VERBOSE, COSTS OFF)
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);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(*), sum(x), regr_sxx(y,x), sum(y),regr_syy(y,x), regr_sxy(y,x)
FROM regr_test;
--Testcase 365:
CREATE FOREIGN TABLE agg_t15 (a text, b int, c int, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 366:
delete from agg_t15;
--Testcase 367:
insert into agg_t15 values ('{4,140,2900}', 100);
--Testcase 368:
SELECT float8_accum(a::float8[], b) from agg_t15;
--Testcase 369:
delete from agg_t15;
--Testcase 370:
insert into agg_t15 values ('{4,140,2900,1290,83075,15050}', 200, 100);
--Testcase 371:
SELECT float8_regr_accum(a::float8[], b, c) from agg_t15;
--Testcase 372:
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);
--Testcase 373:
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);
--Testcase 374:
CREATE FOREIGN TABLE agg_t16 (a text, b text, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 375:
delete from agg_t16;
--Testcase 376:
insert into agg_t16 values ('{3,60,200}', '{0,0,0}');
--Testcase 377:
insert into agg_t16 values ('{0,0,0}', '{2,180,200}');
--Testcase 378:
insert into agg_t16 values ('{3,60,200}', '{2,180,200}');
--Testcase 379:
SELECT float8_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 380:
delete from agg_t16;
--Testcase 381:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{0,0,0,0,0,0}');
--Testcase 382:
insert into agg_t16 values ('{0,0,0,0,0,0}', '{2,180,200,740,57800,-3400}');
--Testcase 383:
insert into agg_t16 values ('{3,60,200,750,20000,2000}', '{2,180,200,740,57800,-3400}');
--Testcase 384:
SELECT float8_regr_combine(a::float8[], b::float8[]) FROM agg_t16;
--Testcase 385:
DROP FOREIGN TABLE regr_test;
-- test count, distinct
--Testcase 30:
SELECT count(four) AS cnt_1000 FROM onek;
--Testcase 31:
SELECT count(DISTINCT four) AS cnt_4 FROM onek;
--Testcase 32:
select ten, count(*), sum(four) from onek
group by ten order by ten;
--Testcase 33:
select ten, count(four), sum(DISTINCT four) from onek
group by ten order by ten;
-- user-defined aggregates
--Testcase 386:
CREATE AGGREGATE newavg (
sfunc = int4_avg_accum, basetype = int4, stype = _int8,
finalfunc = int8_avg,
initcond1 = '{0,0}'
);
--Testcase 387:
CREATE AGGREGATE newsum (
sfunc1 = int4pl, basetype = int4, stype1 = int4,
initcond1 = '0'
);
--Testcase 388:
CREATE AGGREGATE newcnt (*) (
sfunc = int8inc, stype = int8,
initcond = '0', parallel = safe
);
--Testcase 389:
CREATE AGGREGATE newcnt ("any") (
sfunc = int8inc_any, stype = int8,
initcond = '0'
);
--Testcase 390:
CREATE AGGREGATE oldcnt (
sfunc = int8inc, basetype = 'ANY', stype = int8,
initcond = '0'
);
--Testcase 391:
create function sum3(int8,int8,int8) returns int8 as
'select $1 + $2 + $3' language sql strict immutable;
--Testcase 392:
create aggregate sum2(int8,int8) (
sfunc = sum3, stype = int8,
initcond = '0'
);
--Testcase 34:
SELECT newavg(four) AS avg_1 FROM onek;
--Testcase 35:
SELECT newsum(four) AS sum_1500 FROM onek;
--Testcase 36:
SELECT newcnt(four) AS cnt_1000 FROM onek;
--Testcase 37:
SELECT newcnt(*) AS cnt_1000 FROM onek;
--Testcase 38:
SELECT oldcnt(*) AS cnt_1000 FROM onek;
--Testcase 39:
SELECT sum2(q1,q2) FROM int8_tbl;
-- test for outer-level aggregates
-- this should work
--Testcase 40:
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
--Testcase 41:
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.
--Testcase 42:
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.
--Testcase 393:
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;
--Testcase 394:
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;
--Testcase 395:
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;
--Testcase 396:
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
--
--Testcase 397:
CREATE FOREIGN TABLE bitwise_test(
i2 INT2,
i4 INT4,
i8 INT8,
i INTEGER,
x INT2
) SERVER sqlite_svr;
-- empty case
--Testcase 43:
SELECT
BIT_AND(i2) AS "?",
BIT_OR(i4) AS "?",
BIT_XOR(i8) AS "?"
FROM bitwise_test;
--Testcase 44:
INSERT INTO bitwise_test VALUES
(1, 1, 1, 1, 1),
(3, 3, 3, null, 2),
(7, 7, 7, 3, 4);
--Testcase 45:
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_OR(i2) AS "7",
BIT_OR(i4) AS "7",
BIT_OR(i8) AS "7",
BIT_OR(i) AS "?",
BIT_OR(x) AS "7",
BIT_XOR(i2) AS "5",
BIT_XOR(i4) AS "5",
BIT_XOR(i8) AS "5",
BIT_XOR(i) AS "?",
BIT_XOR(x) AS "7"
FROM bitwise_test;
--
-- test boolean aggregates
--
-- first test all possible transition and final states
--Testcase 398:
CREATE FOREIGN TABLE bool_test_tmp(
b1 BOOL OPTIONS (key 'true'),
b2 BOOL OPTIONS (key 'true')
) SERVER sqlite_svr;
-- boolean and transitions
-- null because strict
BEGIN;
--Testcase 399:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 400:
SELECT booland_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- and actual computations
BEGIN;
--Testcase 401:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE);
--Testcase 402:
SELECT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 403:
INSERT INTO bool_test_tmp VALUES
(TRUE, FALSE),
(FALSE, TRUE),
(FALSE, FALSE);
--Testcase 404:
SELECT NOT booland_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
-- boolean or transitions
-- null because strict
BEGIN;
--Testcase 405:
INSERT INTO bool_test_tmp VALUES
(NULL, NULL),
(TRUE, NULL),
(FALSE, NULL),
(NULL, TRUE),
(NULL, FALSE);
--Testcase 406:
SELECT boolor_statefunc(b1, b2) IS NULL as "t" FROM bool_test_tmp;
ROLLBACK;
-- actual computations
BEGIN;
--Testcase 407:
INSERT INTO bool_test_tmp VALUES
(TRUE, TRUE),
(TRUE, FALSE),
(FALSE, TRUE);
--Testcase 408:
SELECT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
BEGIN;
--Testcase 409:
INSERT INTO bool_test_tmp VALUES
(FALSE, FALSE);
--Testcase 410:
SELECT NOT boolor_statefunc(b1, b2) as "t" FROM bool_test_tmp;
ROLLBACK;
--Testcase 411:
CREATE FOREIGN TABLE bool_test(
b1 BOOL,
b2 BOOL,
b3 BOOL,
b4 BOOL
) SERVER sqlite_svr;
-- empty case
--Testcase 46:
SELECT
BOOL_AND(b1) AS "n",
BOOL_OR(b3) AS "n"
FROM bool_test;
--Testcase 47:
INSERT INTO bool_test VALUES
(TRUE, null, FALSE, null),
(FALSE, TRUE, null, null),
(null, TRUE, FALSE, null);
--Testcase 48:
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;
--Testcase 49:
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;
--Testcase 50:
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
--Testcase 51:
explain (costs off)
select min(unique1) from tenk1;
--Testcase 52:
select min(unique1) from tenk1;
--Testcase 53:
explain (costs off)
select max(unique1) from tenk1;
--Testcase 54:
select max(unique1) from tenk1;
--Testcase 55:
explain (costs off)
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 56:
select max(unique1) from tenk1 where unique1 < 42;
--Testcase 57:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42;
--Testcase 58:
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;
--Testcase 628:
set local max_parallel_workers_per_gather = 0;
--Testcase 59:
explain (costs off)
select max(unique1) from tenk1 where unique1 > 42000;
--Testcase 60:
select max(unique1) from tenk1 where unique1 > 42000;
rollback;
-- multi-column index (uses tenk1_thous_tenthous)
--Testcase 61:
explain (costs off)
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 62:
select max(tenthous) from tenk1 where thousand = 33;
--Testcase 63:
explain (costs off)
select min(tenthous) from tenk1 where thousand = 33;
--Testcase 64:
select min(tenthous) from tenk1 where thousand = 33;
-- check parameter propagation into an indexscan subquery
--Testcase 65:
explain (costs off)
select f1, (select min(unique1) from tenk1 where unique1 > f1) AS gt
from int4_tbl;
--Testcase 66:
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
--Testcase 67:
explain (costs off)
select distinct max(unique2) from tenk1;
--Testcase 68:
select distinct max(unique2) from tenk1;
--Testcase 69:
explain (costs off)
select max(unique2) from tenk1 order by 1;
--Testcase 70:
select max(unique2) from tenk1 order by 1;
--Testcase 71:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2);
--Testcase 72:
select max(unique2) from tenk1 order by max(unique2);
--Testcase 73:
explain (costs off)
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 74:
select max(unique2) from tenk1 order by max(unique2)+1;
--Testcase 75:
explain (costs off)
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
--Testcase 76:
select max(unique2), generate_series(1,3) as g from tenk1 order by g desc;
-- interesting corner case: constant gets optimized into a seqscan
--Testcase 77:
explain (costs off)
select max(100) from tenk1;
--Testcase 78:
select max(100) from tenk1;
-- try it on an inheritance tree
--Testcase 412:
create foreign table minmaxtest(f1 int) server sqlite_svr;
--Testcase 413:
create table minmaxtest1() inherits (minmaxtest);
--Testcase 414:
create table minmaxtest2() inherits (minmaxtest);
--Testcase 415:
create table minmaxtest3() inherits (minmaxtest);
--Testcase 416:
create index minmaxtest1i on minmaxtest1(f1);
--Testcase 417:
create index minmaxtest2i on minmaxtest2(f1 desc);
--Testcase 418:
create index minmaxtest3i on minmaxtest3(f1) where f1 is not null;
--Testcase 79:
insert into minmaxtest values(11), (12);
--Testcase 80:
insert into minmaxtest1 values(13), (14);
--Testcase 81:
insert into minmaxtest2 values(15), (16);
--Testcase 82:
insert into minmaxtest3 values(17), (18);
--Testcase 83:
explain (costs off)
select min(f1), max(f1) from minmaxtest;
--Testcase 84:
select min(f1), max(f1) from minmaxtest;
-- DISTINCT doesn't do anything useful here, but it shouldn't fail
--Testcase 85:
explain (costs off)
select distinct min(f1), max(f1) from minmaxtest;
--Testcase 86:
select distinct min(f1), max(f1) from minmaxtest;
-- DISTINCT can also trigger wrong answers with hash aggregation (bug #18465)
begin;
set local enable_sort = off;
--Testcase 709:
explain (costs off)
select f1, (select distinct min(t1.f1) from int4_tbl t1 where t1.f1 = t0.f1)
from int4_tbl t0;
--Testcase 710:
select f1, (select distinct min(t1.f1) from int4_tbl t1 where t1.f1 = t0.f1)
from int4_tbl t0;
rollback;
-- check for correct detection of nested-aggregate errors
--Testcase 87:
select max(min(unique1)) from tenk1;
--Testcase 88:
select (select max(min(unique1)) from int8_tbl) from tenk1;
--Testcase 711:
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
--
--Testcase 419:
create foreign table agg_t1 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int, d int) server sqlite_svr;
--Testcase 420:
create foreign table agg_t2 (x int OPTIONS (key 'true'), y int OPTIONS (key 'true'), z int) server sqlite_svr;
--Testcase 421:
create foreign table agg_t9 (a int OPTIONS (key 'true'), b int OPTIONS (key 'true'), c int) server sqlite_svr;
-- Non-primary-key columns can be removed from GROUP BY
--Testcase 89:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- No removal can happen if the complete PK is not present in GROUP BY
--Testcase 90:
explain (costs off) select a,c from agg_t1 group by a,c,d;
-- Test removal across multiple relations
--Testcase 91:
explain (costs off) select *
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.y,agg_t2.z;
-- Test case where agg_t1 can be optimized but not agg_t2
--Testcase 92:
explain (costs off) select agg_t1.*,agg_t2.x,agg_t2.z
from agg_t1 inner join agg_t2 on agg_t1.a = agg_t2.x and agg_t1.b = agg_t2.y
group by agg_t1.a,agg_t1.b,agg_t1.c,agg_t1.d,agg_t2.x,agg_t2.z;
-- Cannot optimize when PK is deferrable
--Testcase 422:
explain (costs off) select * from agg_t9 group by a,b,c;
--Testcase 423:
create temp table t1c () inherits (agg_t1);
-- Ensure we don't remove any columns when t1 has a child table
--Testcase 424:
explain (costs off) select * from agg_t1 group by a,b,c,d;
-- Okay to remove columns if we're only querying the parent.
--Testcase 425:
explain (costs off) select * from only agg_t1 group by a,b,c,d;
-- Skip this test, sqlite_fdw does not support partition table
--create foreign table p_t1 (
-- a int options (key 'true'),
-- b int options (key 'true'),
-- c int,
-- d int,
--) partition by list(a) server sqlite_svr;
--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
--
--Testcase 426:
create foreign table t1(f1 int, f2 int) server sqlite_svr;
--Testcase 427:
create foreign table t2(f1 bigint, f2 oid) server sqlite_svr;
--Testcase 428:
select f1 from t1 left join t2 using (f1) group by f1;
--Testcase 429:
select f1 from t1 left join t2 using (f1) group by t1.f1;
--Testcase 430:
select t1.f1 from t1 left join t2 using (f1) group by t1.f1;
-- only this one should fail:
--Testcase 431:
select t1.f1 from t1 left join t2 using (f1) group by f1;
-- check case where we have to inject nullingrels into coerced join alias
--Testcase 712:
select f1, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f1)) on (x0 = 0)
group by f1;
-- same, for a RelabelType coercion
--Testcase 713:
select f2, count(*) from
t1 x(x0,x1) left join (t1 left join t2 using(f2)) on (x0 = 0)
group by f2;
--Testcase 432:
drop foreign table t1, t2;
--
-- Test planner's selection of pathkeys for ORDER BY aggregates
--
-- Ensure we order by four. This suits the most aggregate functions.
--Testcase 714:
explain (costs off)
select sum(two order by two),max(four order by four), min(four order by four)
from tenk1;
-- Ensure we order by two. It's a tie between ordering by two and four but
-- we tiebreak on the aggregate's position.
--Testcase 715:
explain (costs off)
select
sum(two order by two), max(four order by four),
min(four order by four), max(two order by two)
from tenk1;
-- Similar to above, but tiebreak on ordering by four
--Testcase 716:
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two)
from tenk1;
-- Ensure this one orders by ten since there are 3 aggregates that require ten
-- vs two that suit two and four.
--Testcase 717:
explain (costs off)
select
max(four order by four), sum(two order by two),
min(four order by four), max(two order by two),
sum(ten order by ten), min(ten order by ten), max(ten order by ten)
from tenk1;
-- Try a case involving a GROUP BY clause where the GROUP BY column is also
-- part of an aggregate's ORDER BY clause. We want a sort order that works
-- for the GROUP BY along with the first and the last aggregate.
--Testcase 718:
explain (costs off)
select
sum(unique1 order by ten, two), sum(unique1 order by four),
sum(unique1 order by two, four)
from tenk1
group by ten;
-- Ensure that we never choose to provide presorted input to an Aggref with
-- a volatile function in the ORDER BY / DISTINCT clause. We want to ensure
-- these sorts are performed individually rather than at the query level.
--Testcase 719:
explain (costs off)
select
sum(unique1 order by two), sum(unique1 order by four),
sum(unique1 order by four, two), sum(unique1 order by two, random()),
sum(unique1 order by two, random(), random() + 1)
from tenk1
group by ten;
-- Ensure consecutive NULLs are properly treated as distinct from each other
--Testcase 720:
select array_agg(distinct val)
from (select null as val from generate_series(1, 2));
-- Ensure no ordering is requested when enable_presorted_aggregate is off
set enable_presorted_aggregate to off;
--Testcase 721:
explain (costs off)
select sum(two order by two) from tenk1;
reset enable_presorted_aggregate;
--
-- Test combinations of DISTINCT and/or ORDER BY
--
begin;
--Testcase 93:
delete from INT8_TBL;
--Testcase 94:
insert into INT8_TBL values (1,4),(2,3),(3,1),(4,2);
--Testcase 95:
select array_agg(q1 order by q2)
from INT8_TBL;
--Testcase 96:
select array_agg(q1 order by q1)
from INT8_TBL;
--Testcase 97:
select array_agg(q1 order by q1 desc)
from INT8_TBL;
--Testcase 98:
select array_agg(q2 order by q1 desc)
from INT8_TBL;
--Testcase 99:
delete from INT4_TBL;
--Testcase 100:
insert into INT4_TBL values (1),(2),(1),(3),(null),(2);
--Testcase 101:
select array_agg(distinct f1)
from INT4_TBL;
--Testcase 102:
select array_agg(distinct f1 order by f1)
from INT4_TBL;
--Testcase 103:
select array_agg(distinct f1 order by f1 desc)
from INT4_TBL;
--Testcase 104:
select array_agg(distinct f1 order by f1 desc nulls last)
from INT4_TBL;
rollback;
-- multi-arg aggs, strict/nonstrict, distinct/order by
--Testcase 433:
create type aggtype as (a integer, b integer, c text);
--Testcase 434:
create function aggf_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql strict immutable;
--Testcase 435:
create function aggfns_trans(aggtype[],integer,integer,text) returns aggtype[]
as 'select array_append($1,ROW($2,$3,$4)::aggtype)'
language sql immutable;
--Testcase 436:
create aggregate aggfstr(integer,integer,text) (
sfunc = aggf_trans, stype = aggtype[],
initcond = '{}'
);
--Testcase 437:
create aggregate aggfns(integer,integer,text) (
sfunc = aggfns_trans, stype = aggtype[], sspace = 10000,
initcond = '{}'
);
begin;
--Testcase 105:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 106:
select aggfstr(a,b,c) from multi_arg_agg;
--Testcase 107:
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 108:
select aggfstr(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 109:
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 110:
select aggfstr(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 111:
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
-- test specific code paths
--Testcase 112:
select aggfns(distinct a,a,c order by c using ~<~,a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 113:
select aggfns(distinct a,a,c order by c using ~<~) from multi_arg_agg, generate_series(1,2) i;
--Testcase 114:
select aggfns(distinct a,a,c order by a) from multi_arg_agg, generate_series(1,2) i;
--Testcase 115:
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
-- test a more complex permutation that has previous caused issues
--Testcase 761:
create foreign table agg_t22 (c1 text, id int) server sqlite_svr;
--Testcase 762:
create foreign table agg_t23 (id int) server sqlite_svr;
--Testcase 763:
insert into agg_t22 values ('a', 1);
--Testcase 764:
insert into agg_t23 values (1);
--Testcase 765:
select
string_agg(distinct c1, ','),
sum((
select sum(b.id)
from agg_t23 b
where a.id = b.id
)) from agg_t22 a;
-- check node I/O via view creation and usage, also deparsing logic
--Testcase 438:
create view agg_view1 as
select aggfns(a,b,c) from multi_arg_agg;
--Testcase 116:
select * from agg_view1;
--Testcase 117:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 439:
create or replace view agg_view1 as
select aggfns(distinct a,b,c) from multi_arg_agg, generate_series(1,3) i;
--Testcase 118:
select * from agg_view1;
--Testcase 119:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 440:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by b) from multi_arg_agg, generate_series(1,3) i;
--Testcase 120:
select * from agg_view1;
--Testcase 121:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 441:
create or replace view agg_view1 as
select aggfns(a,b,c order by b+1) from multi_arg_agg;
--Testcase 122:
select * from agg_view1;
--Testcase 123:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 442:
create or replace view agg_view1 as
select aggfns(a,a,c order by b) from multi_arg_agg;
--Testcase 124:
select * from agg_view1;
--Testcase 125:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 443:
create or replace view agg_view1 as
select aggfns(a,b,c order by c using ~<~) from multi_arg_agg;
--Testcase 126:
select * from agg_view1;
--Testcase 127:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 444:
create or replace view agg_view1 as
select aggfns(distinct a,b,c order by a,c using ~<~,b) from multi_arg_agg, generate_series(1,2) i;
--Testcase 128:
select * from agg_view1;
--Testcase 129:
select pg_get_viewdef('agg_view1'::regclass);
--Testcase 445:
drop view agg_view1;
rollback;
-- incorrect DISTINCT usage errors
--Testcase 130:
insert into multi_arg_agg values (1,1,'foo');
--Testcase 131:
select aggfns(distinct a,b,c order by i) from multi_arg_agg, generate_series(1,2) i;
--Testcase 132:
select aggfns(distinct a,b,c order by a,b+1) from multi_arg_agg, generate_series(1,2) i;
--Testcase 133:
select aggfns(distinct a,b,c order by a,b,i,c) from multi_arg_agg, generate_series(1,2) i;
--Testcase 134:
select aggfns(distinct a,a,c order by a,b) from multi_arg_agg, generate_series(1,2) i;
-- string_agg tests
begin;
--Testcase 135:
delete from varchar_tbl;
--Testcase 136:
insert into varchar_tbl values ('aaaa'),('bbbb'),('cccc');
--Testcase 137:
select string_agg(f1,',') from varchar_tbl;
--Testcase 138:
delete from varchar_tbl;
--Testcase 139:
insert into varchar_tbl values ('aaaa'),(null),('bbbb'),('cccc');
--Testcase 140:
select string_agg(f1,',') from varchar_tbl;
--Testcase 141:
delete from varchar_tbl;
--Testcase 142:
insert into varchar_tbl values (null),(null),('bbbb'),('cccc');
--Testcase 143:
select string_agg(f1,'AB') from varchar_tbl;
--Testcase 144:
delete from varchar_tbl;
--Testcase 145:
insert into varchar_tbl values (null),(null);
--Testcase 146:
select string_agg(f1,',') from varchar_tbl;
rollback;
-- check some implicit casting cases, as per bug #5564
--Testcase 147:
select string_agg(distinct f1, ',' order by f1) from varchar_tbl; -- ok
--Testcase 148:
select string_agg(distinct f1::text, ',' order by f1) from varchar_tbl; -- not ok
--Testcase 149:
select string_agg(distinct f1, ',' order by f1::text) from varchar_tbl; -- not ok
--Testcase 150:
select string_agg(distinct f1::text, ',' order by f1::text) from varchar_tbl; -- ok
-- string_agg bytea tests
--Testcase 446:
create foreign table bytea_test_table(v bytea) server sqlite_svr;
--Testcase 151:
select string_agg(v, '') from bytea_test_table;
--Testcase 152:
insert into bytea_test_table values(decode('ff','hex'));
--Testcase 153:
select string_agg(v, '') from bytea_test_table;
--Testcase 154:
insert into bytea_test_table values(decode('aa','hex'));
--Testcase 155:
select string_agg(v, '') from bytea_test_table;
--Testcase 156:
select string_agg(v, NULL) from bytea_test_table;
--Testcase 157:
select string_agg(v, decode('ee', 'hex')) from bytea_test_table;
--Testcase 447:
drop foreign table bytea_test_table;
-- Test parallel string_agg and array_agg
--Testcase 723:
create foreign table pagg_test (x int, y int) server sqlite_svr;
--Testcase 724:
insert into pagg_test
select (case x % 4 when 1 then null else x end), x % 10
from generate_series(1,5000) x;
set parallel_setup_cost TO 0;
set parallel_tuple_cost TO 0;
set parallel_leader_participation TO 0;
set min_parallel_table_scan_size = 0;
set bytea_output = 'escape';
set max_parallel_workers_per_gather = 2;
-- create a view as we otherwise have to repeat this query a few times.
--Testcase 725:
create view v_pagg_test AS
select
y,
min(t) AS tmin,max(t) AS tmax,count(distinct t) AS tndistinct,
min(b) AS bmin,max(b) AS bmax,count(distinct b) AS bndistinct,
min(a) AS amin,max(a) AS amax,count(distinct a) AS andistinct,
min(aa) AS aamin,max(aa) AS aamax,count(distinct aa) AS aandistinct
from (
select
y,
unnest(regexp_split_to_array(a1.t, ','))::int AS t,
unnest(regexp_split_to_array(a1.b::text, ',')) AS b,
unnest(a1.a) AS a,
unnest(a1.aa) AS aa
from (
select
y,
string_agg(x::text, ',') AS t,
string_agg(x::text::bytea, ',') AS b,
array_agg(x) AS a,
array_agg(ARRAY[x]) AS aa
from pagg_test
group by y
) a1
) a2
group by y;
-- Ensure results are correct.
--Testcase 726:
select * from v_pagg_test order by y;
-- Ensure parallel aggregation is actually being used.
--Testcase 727:
explain (costs off) select * from v_pagg_test order by y;
set max_parallel_workers_per_gather = 0;
-- Ensure results are the same without parallel aggregation.
--Testcase 728:
select * from v_pagg_test order by y;
-- Clean up
reset max_parallel_workers_per_gather;
reset bytea_output;
reset min_parallel_table_scan_size;
reset parallel_leader_participation;
reset parallel_tuple_cost;
reset parallel_setup_cost;
--Testcase 729:
drop view v_pagg_test;
--Testcase 730:
drop foreign table pagg_test;
-- FILTER tests
--Testcase 158:
select min(unique1) filter (where unique1 > 100) from tenk1;
--Testcase 159:
select sum(1/ten) filter (where ten > 0) from tenk1;
--Testcase 160:
select ten, sum(distinct four) filter (where four::text ~ '123') from onek a
group by ten;
--Testcase 161:
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);
--Testcase 448:
create foreign table agg_t17(foo text, bar text) server sqlite_svr;
--Testcase 449:
insert into agg_t17 values ('a', 'b');
--Testcase 450:
select max(foo COLLATE "C") filter (where (bar collate "POSIX") > '0')
from agg_t17;
--Testcase 731:
create foreign table agg_t170(v int) server sqlite_svr;
--Testcase 732:
insert into agg_t170(v) values (1), (2), (3);
--Testcase 733:
select any_value(v) filter (where v > 2) from agg_t170;
-- outer reference in FILTER (PostgreSQL extension)
--Testcase 451:
create foreign table agg_t18 (inner_c int) server sqlite_svr;
--Testcase 452:
create foreign table agg_t19 (outer_c int) server sqlite_svr;
--Testcase 453:
insert into agg_t18 values (1);
--Testcase 454:
insert into agg_t19 values (2), (3);
--Testcase 455:
select (select count(*)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 456:
select (select count(*) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- outer query is aggregation query
--Testcase 457:
select (select count(inner_c) filter (where outer_c <> 0)
from agg_t18) from agg_t19; -- inner query is aggregation query
--Testcase 162:
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)
--Testcase 163:
select sum(unique1) FILTER (WHERE
unique1 IN (SELECT unique1 FROM onek where unique1 < 100)) FROM tenk1;
-- exercise lots of aggregate parts with FILTER
begin;
--Testcase 164:
delete from multi_arg_agg;
--Testcase 165:
insert into multi_arg_agg values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz');
--Testcase 166:
select aggfns(distinct a,b,c order by a,c using ~<~,b) filter (where a > 1) from multi_arg_agg, generate_series(1,2) i;
rollback;
-- check handling of bare boolean Var in FILTER
--Testcase 672:
select max(0) filter (where b1) from bool_test;
--Testcase 673:
select (select max(0) filter (where b1)) from bool_test;
-- check for correct detection of nested-aggregate errors in FILTER
--Testcase 674:
select max(unique1) filter (where sum(ten) > 0) from tenk1;
--Testcase 675:
select (select max(unique1) filter (where sum(ten) > 0) from int8_tbl) from tenk1;
--Testcase 676:
select max(unique1) filter (where bool_or(ten > 0)) from tenk1;
--Testcase 677:
select (select max(unique1) filter (where bool_or(ten > 0)) from int8_tbl) from tenk1;
-- ordered-set aggregates
begin;
--Testcase 167:
delete from FLOAT8_TBL;
--Testcase 168:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 169:
select f1, percentile_cont(f1) within group (order by x::float8)
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 170:
delete from FLOAT8_TBL;
--Testcase 171:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 172:
select f1, percentile_cont(f1 order by f1) within group (order by x) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 173:
delete from FLOAT8_TBL;
--Testcase 174:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 175:
select f1, sum() within group (order by x::float8) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
begin;
--Testcase 176:
delete from FLOAT8_TBL;
--Testcase 177:
insert into FLOAT8_TBL values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1);
--Testcase 178:
select f1, percentile_cont(f1,f1) -- error
from generate_series(1,5) x,
FLOAT8_TBL
group by f1 order by f1;
rollback;
--Testcase 179:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 693:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10) from aggtest;
--Testcase 180:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 694:
select (percentile_cont(0.5) within group (order by b))::numeric(20,10), sum(b)::numeric(10,3) from aggtest;
--Testcase 181:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 695:
select percentile_cont(0.5) within group (order by thousand) from tenk1;
--Testcase 182:
select percentile_disc(0.5) within group (order by thousand) from tenk1;
begin;
--Testcase 183:
delete from INT4_TBL;
--Testcase 184:
insert into INT4_TBL values (1),(1),(2),(2),(3),(3),(4);
--Testcase 185:
select rank(3) within group (order by f1) from INT4_TBL;
--Testcase 186:
select cume_dist(3) within group (order by f1) from INT4_TBL;
--Testcase 187:
insert into INT4_TBL values (5);
--Testcase 458:
-- Round the result to limited digits to avoid platform-specific results.
--Testcase 696:
select (percent_rank(3) within group (order by f1))::numeric(20,10) from INT4_TBL;
--Testcase 459:
delete from INT4_TBL where f1 = 5;
--Testcase 188:
select dense_rank(3) within group (order by f1) from INT4_TBL;
rollback;
--Testcase 189:
select percentile_disc(array[0,0.1,0.25,0.5,0.75,0.9,1]) within group (order by thousand)
from tenk1;
--Testcase 190:
select percentile_cont(array[0,0.25,0.5,0.75,1]) within group (order by thousand)
from tenk1;
--Testcase 191:
select percentile_disc(array[[null,1,0.5],[0.75,0.25,null]]) within group (order by thousand)
from tenk1;
--Testcase 460:
create foreign table agg_t21 (x int) server sqlite_svr;
begin;
--Testcase 248:
insert into agg_t21 select * from generate_series(1,6);
--Testcase 249:
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 agg_t21;
rollback;
--Testcase 192:
select ten, mode() within group (order by string4) from tenk1 group by ten;
--Testcase 461:
create foreign table agg_t20 (x text) server sqlite_svr;
begin;
--Testcase 462:
insert into agg_t20 values (unnest('{fred,jim,fred,jack,jill,fred,jill,jim,jim,sheila,jim,sheila}'::text[]));
--Testcase 463:
select percentile_disc(array[0.25,0.5,0.75]) within group (order by x) from agg_t20;
rollback;
-- check collation propagates up in suitable cases:
begin;
--Testcase 464:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 465:
select pg_collation_for(percentile_disc(1) within group (order by x collate "POSIX")) from agg_t20;
rollback;
-- ordered-set aggs created with CREATE AGGREGATE
--Testcase 466:
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
);
--Testcase 467:
create aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any") (
stype = internal,
sfunc = ordered_set_transition_multi,
finalfunc = rank_final,
finalfunc_extra = true,
hypothetical
);
--Testcase 633:
alter aggregate my_percentile_disc(float8 ORDER BY anyelement)
rename to test_percentile_disc;
--Testcase 634:
alter aggregate my_rank(VARIADIC "any" ORDER BY VARIADIC "any")
rename to test_rank;
begin;
--Testcase 468:
insert into agg_t21 values (1),(1),(2),(2),(3),(3),(4);
--Testcase 469:
select test_rank(3) within group (order by x) from agg_t21;
rollback;
--Testcase 193:
select test_percentile_disc(0.5) within group (order by thousand) from tenk1;
-- ordered-set aggs can't use ungrouped vars in direct args:
begin;
--Testcase 470:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 471:
select rank(x) within group (order by x) from agg_t21;
rollback;
-- outer-level agg can't use a grouped arg of a lower level, either:
begin;
--Testcase 472:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 473:
select array(select percentile_disc(a) within group (order by x)
from (values (0.3),(0.7)) v(a) group by a)
from agg_t21;
rollback;
-- agg in the direct args is a grouping violation, too:
begin;
--Testcase 474:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 475:
select rank(sum(x)) within group (order by x) from agg_t21;
rollback;
-- hypothetical-set type unification and argument-count failures:
begin;
--Testcase 264:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 265:
select rank(3) within group (order by x) from agg_t20;
rollback;
--Testcase 194:
select rank(3) within group (order by stringu1,stringu2) from tenk1;
begin;
--Testcase 476:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 477:
select rank('fred') within group (order by x) from agg_t21;
rollback;
begin;
--Testcase 478:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 479:
select rank('adam'::text collate "C") within group (order by x collate "POSIX")
from agg_t20;
rollback;
-- hypothetical-set type unification successes:
begin;
--Testcase 480:
insert into agg_t20 values ('fred'), ('jim');
--Testcase 481:
select rank('adam'::varchar) within group (order by x) from agg_t20;
rollback;
begin;
--Testcase 482:
insert into agg_t21 select * from generate_series(1,5);
--Testcase 483:
select rank('3') within group (order by x) from agg_t21;
rollback;
-- divide by zero check
begin;
--Testcase 484:
insert into agg_t21 select * from generate_series(1,0);
--Testcase 485:
select percent_rank(0) within group (order by x) from agg_t21;
rollback;
-- deparse and multiple features:
--Testcase 486:
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;
--Testcase 196:
select pg_get_viewdef('aggordview1');
--Testcase 197:
select * from aggordview1 order by ten;
--Testcase 487:
drop view aggordview1;
-- variadic aggregates
--Testcase 488:
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)';
--Testcase 489:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
--Testcase 490:
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)';
--Testcase 491:
create aggregate cleast_agg(variadic items anycompatiblearray) (
stype = anycompatible, sfunc = cleast_accum);
--Testcase 198:
select least_agg(q1,q2) from int8_tbl;
--Testcase 199:
select least_agg(variadic array[q1,q2]) from int8_tbl;
--Testcase 492:
select cleast_agg(q1,q2) from int8_tbl;
--Testcase 493:
select cleast_agg(4.5,f1) from int4_tbl;
--Testcase 494:
select cleast_agg(variadic array[4.5,f1]) from int4_tbl;
--Testcase 495:
select pg_typeof(cleast_agg(variadic array[4.5,f1])) from int4_tbl;
-- test aggregates with common transition functions share the same states
--Testcase 496:
create foreign table agg_t10(one int, id int options (key 'true')) server sqlite_svr;
--Testcase 497:
create foreign table agg_t11(one int, two int, id int options (key 'true')) server sqlite_svr;
--Testcase 498:
create foreign table agg_t12(a int, id int options (key 'true')) server sqlite_svr;
begin work;
--Testcase 499:
create type avg_state as (total bigint, count bigint);
--Testcase 500:
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;
--Testcase 501:
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;
--Testcase 502:
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;
--Testcase 503:
create aggregate my_avg(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn
);
--Testcase 504:
create aggregate my_sum(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn
);
-- aggregate state should be shared as aggs are the same.
--Testcase 505:
delete from agg_t10;
--Testcase 506:
insert into agg_t10 values (1), (3);
--Testcase 507:
select my_avg(one),my_avg(one) from agg_t10;
-- aggregate state should be shared as transfn is the same for both aggs.
--Testcase 508:
select my_avg(one),my_sum(one) from agg_t10;
-- same as previous one, but with DISTINCT, which requires sorting the input.
--Testcase 509:
delete from agg_t10;
--Testcase 510:
insert into agg_t10 values (1), (3), (1);
--Testcase 511:
select my_avg(distinct one),my_sum(distinct one) from agg_t10;
-- shouldn't share states due to the distinctness not matching.
--Testcase 512:
delete from agg_t10;
--Testcase 513:
insert into agg_t10 values (1), (3);
--Testcase 514:
select my_avg(distinct one),my_sum(one) from agg_t10;
-- shouldn't share states due to the filter clause not matching.
--Testcase 515:
select my_avg(one) filter (where one > 1),my_sum(one) from agg_t10;
-- this should not share the state due to different input columns.
--Testcase 516:
delete from agg_t11;
--Testcase 517:
insert into agg_t11 values (1,2),(3,4);
--Testcase 518:
select my_avg(one),my_sum(two) from agg_t11;
-- exercise cases where OSAs share state
--Testcase 519:
delete from agg_t12;
--Testcase 520:
insert into agg_t12 values (1), (3), (5), (7);
--Testcase 521:
select
percentile_cont(0.5) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
--Testcase 522:
select
percentile_cont(0.25) within group (order by a),
percentile_disc(0.5) within group (order by a)
from agg_t12;
-- these can't share state currently
--Testcase 523:
select
rank(4) within group (order by a),
dense_rank(4) within group (order by a)
from agg_t12;
-- test that aggs with the same sfunc and initcond share the same agg state
--Testcase 524:
create aggregate my_sum_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = sum_finalfn,
initcond = '(10,0)'
);
--Testcase 525:
create aggregate my_avg_init(int4)
(
stype = avg_state,
sfunc = avg_transfn,
finalfunc = avg_finalfn,
initcond = '(10,0)'
);
--Testcase 526:
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
--Testcase 527:
delete from agg_t10;
--Testcase 528:
insert into agg_t10 values (1), (3);
--Testcase 529:
select my_sum_init(one),my_avg_init(one) from agg_t10;
-- Varying INITCONDs should cause the states not to be shared.
--Testcase 530:
select my_sum_init(one),my_avg_init2(one) from agg_t10;
rollback;
-- test aggregate state sharing to ensure it works if one aggregate has a
-- finalfn and the other one has none.
begin work;
--Testcase 531:
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;
--Testcase 532:
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;
--Testcase 533:
create aggregate my_sum(int4)
(
stype = int4,
sfunc = sum_transfn
);
--Testcase 534:
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
--Testcase 535:
delete from agg_t10;
--Testcase 536:
insert into agg_t10 values (1), (2), (3), (4);
--Testcase 537:
select my_sum(one),my_half_sum(one) from agg_t10;
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;
--Testcase 538:
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$$;
--Testcase 539:
CREATE AGGREGATE balk(int4)
(
SFUNC = balkifnull(int8, int4),
STYPE = int8,
PARALLEL = SAFE,
INITCOND = '0'
);
--Testcase 200:
SELECT balk(hundred) FROM tenk1;
ROLLBACK;
-- GROUP BY optimization by reordering GROUP BY clauses
--Testcase 766:
CREATE FOREIGN TABLE btg_groupby(x int, y int, z text, w int) SERVER sqlite_svr;
--Testcase 767:
INSERT INTO btg_groupby
SELECT
i % 10 AS x,
i % 10 AS y,
'abc' || i % 10 AS z,
i AS w
FROM generate_series(1, 100) AS i;
-- CREATE INDEX is not supported for foreign tables.
-- CREATE INDEX btg_x_y_idx ON btg_groupby(x, y);
-- ANALYZE btg_groupby;
SET enable_hashagg = off;
SET enable_seqscan = off;
-- Because CREATE INDEX is not supported for foreign tables,
-- we cannot utilize the ordering of index scan to avoid a Sort operation
-- Utilize the ordering of index scan to avoid a Sort operation
--Testcase 768:
EXPLAIN (COSTS OFF)
SELECT count(*) FROM btg_groupby GROUP BY y, x;
-- Engage incremental sort
--Testcase 769:
EXPLAIN (COSTS OFF)
SELECT count(*) FROM btg_groupby GROUP BY z, y, w, x;
-- Utilize the ordering of subquery scan to avoid a Sort operation
--Testcase 770:
EXPLAIN (COSTS OFF) SELECT count(*)
FROM (SELECT * FROM btg_groupby ORDER BY x, y, w, z) AS q1
GROUP BY w, x, z, y;
-- Utilize the ordering of merge join to avoid a full Sort operation
SET enable_hashjoin = off;
SET enable_nestloop = off;
--Testcase 771:
EXPLAIN (COSTS OFF)
SELECT count(*)
FROM btg_groupby t1 JOIN btg_groupby t2 ON t1.z = t2.z AND t1.w = t2.w AND t1.x = t2.x
GROUP BY t1.x, t1.y, t1.z, t1.w;
RESET enable_nestloop;
RESET enable_hashjoin;
-- Should work with and without GROUP-BY optimization
--Testcase 772:
EXPLAIN (COSTS OFF)
SELECT count(*) FROM btg_groupby GROUP BY w, x, z, y ORDER BY y, x, z, w;
-- Utilize incremental sort to make the ORDER BY rule a bit cheaper
--Testcase 773:
EXPLAIN (COSTS OFF)
SELECT count(*) FROM btg_groupby GROUP BY w, x, y, z ORDER BY x*x, z;
-- Test the case where the number of incoming subtree path keys is more than
-- the number of grouping keys.
-- CREATE INDEX btg_y_x_w_idx ON btg_groupby(y, x, w);
--Testcase 774:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT y, x, array_agg(distinct w)
FROM btg_groupby WHERE y < 0 GROUP BY x, y;
-- Ensure that we do not select the aggregate pathkeys instead of the grouping
-- pathkeys
--Testcase 775:
CREATE FOREIGN TABLE group_agg_pk(x int, y int, z int, w int, f int) SERVER sqlite_svr;
--Testcase 776:
INSERT INTO group_agg_pk SELECT
i % 10 AS x,
i % 2 AS y,
i % 2 AS z,
2 AS w,
i % 10 AS f
FROM generate_series(1,100) AS i;
-- ANALYZE group_agg_pk;
SET enable_nestloop = off;
SET enable_hashjoin = off;
--Testcase 777:
EXPLAIN (COSTS OFF)
SELECT avg(c1.f ORDER BY c1.x, c1.y)
FROM group_agg_pk c1 JOIN group_agg_pk c2 ON c1.x = c2.x
GROUP BY c1.w, c1.z;
--Testcase 778:
SELECT avg(c1.f ORDER BY c1.x, c1.y)
FROM group_agg_pk c1 JOIN group_agg_pk c2 ON c1.x = c2.x
GROUP BY c1.w, c1.z;
-- Pathkeys, built in a subtree, can be used to optimize GROUP-BY clause
-- ordering. Also, here we check that it doesn't depend on the initial clause
-- order in the GROUP-BY list.
--Testcase 780:
EXPLAIN (COSTS OFF)
SELECT c1.y,c1.x FROM group_agg_pk c1
JOIN group_agg_pk c2
ON c1.x = c2.x
GROUP BY c1.y,c1.x,c2.x;
--Testcase 781:
EXPLAIN (COSTS OFF)
SELECT c1.y,c1.x FROM group_agg_pk c1
JOIN group_agg_pk c2
ON c1.x = c2.x
GROUP BY c1.y,c2.x,c1.x;
RESET enable_nestloop;
RESET enable_hashjoin;
--Testcase 779:
DROP FOREIGN TABLE group_agg_pk;
-- -- CREATE UNIQUE INDEX is not supported for foreign table
-- -- Test the case where the ordering of the scan matches the ordering within the
-- -- aggregate but cannot be found in the group-by list
-- CREATE TABLE agg_sort_order (c1 int PRIMARY KEY, c2 int);
-- CREATE UNIQUE INDEX agg_sort_order_c2_idx ON agg_sort_order(c2);
-- INSERT INTO agg_sort_order SELECT i, i FROM generate_series(1,100)i;
-- ANALYZE agg_sort_order;
-- EXPLAIN (COSTS OFF)
-- SELECT array_agg(c1 ORDER BY c2),c2
-- FROM agg_sort_order WHERE c2 < 100 GROUP BY c1 ORDER BY 2;
-- DROP TABLE agg_sort_order CASCADE;
--Testcase 678:
DROP FOREIGN TABLE btg_groupby;
RESET enable_hashagg;
RESET enable_seqscan;
-- 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;
--Testcase 540:
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$$;
--Testcase 541:
CREATE AGGREGATE balk(int4)
(
SFUNC = int4_sum(int8, int4),
STYPE = int8,
COMBINEFUNC = balkifnull(int8, int8),
PARALLEL = SAFE,
INITCOND = '0'
);
-- force use of parallelism
-- Skip this test, cannot alter foreign table tenk1
-- ALTER FOREIGN 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 multiple usage of an aggregate whose finalfn returns a R/W datum
BEGIN;
--Testcase 754:
CREATE FUNCTION rwagg_sfunc(x anyarray, y anyarray) RETURNS anyarray
LANGUAGE plpgsql IMMUTABLE AS $$
BEGIN
RETURN array_fill(y[1], ARRAY[4]);
END;
$$;
--Testcase 755:
CREATE FUNCTION rwagg_finalfunc(x anyarray) RETURNS anyarray
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
DECLARE
res x%TYPE;
BEGIN
-- assignment is essential for this test, it expands the array to R/W
res := array_fill(x[1], ARRAY[4]);
RETURN res;
END;
$$;
--Testcase 756:
CREATE AGGREGATE rwagg(anyarray) (
STYPE = anyarray,
SFUNC = rwagg_sfunc,
FINALFUNC = rwagg_finalfunc
);
--Testcase 757:
CREATE FUNCTION eatarray(x real[]) RETURNS real[]
LANGUAGE plpgsql STRICT IMMUTABLE AS $$
BEGIN
x[1] := x[1] + 1;
RETURN x;
END;
$$;
--Testcase 758:
CREATE FOREIGN TABLE float_tb(f real) SERVER sqlite_svr;
--Testcase 759:
INSERT INTO float_tb(f) VALUES (1.0);
--Testcase 760:
SELECT eatarray(rwagg(ARRAY[f::real])), eatarray(rwagg(ARRAY[f::real])) FROM float_tb;
ROLLBACK;
-- test coverage for aggregate combine/serial/deserial functions
BEGIN;
--Testcase 635:
SET parallel_setup_cost = 0;
--Testcase 636:
SET parallel_tuple_cost = 0;
--Testcase 637:
SET min_parallel_table_scan_size = 0;
--Testcase 638:
SET max_parallel_workers_per_gather = 4;
--Testcase 639:
SET parallel_leader_participation = off;
--Testcase 640:
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
--Testcase 542:
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;
--Testcase 543:
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
--Testcase 544:
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;
--Testcase 545:
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
--Testcase 546:
create foreign table agg_t13(x int, id int options (key 'true')) server sqlite_svr;
--Testcase 547:
insert into agg_t13 values (1),(1),(2),(2),(3),(3);
--Testcase 548:
SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM agg_t13 GROUP BY (x) ORDER BY 1;
--Testcase 549:
delete from agg_t13;
-- 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
--Testcase 550:
create foreign table agg_t14(x int, y int, id int options (key 'true')) server sqlite_svr;
--Testcase 551:
insert into agg_t14 values (1, NULL), (1, 2);
--Testcase 552:
SELECT min(x ORDER BY y) FROM agg_t14;
--Testcase 553:
SELECT min(x ORDER BY y) FROM agg_t14;
-- check collation-sensitive matching between grouping expressions
begin;
--Testcase 554:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 555:
select x||'a', case x||'a' when 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
begin;
--Testcase 556:
insert into agg_t20 values (unnest(array['a','b']));
--Testcase 557:
select x||'a', case when x||'a' = 'aa' then 1 else 0 end, count(*)
from agg_t20 group by x||'a' order by 1;
rollback;
-- 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
--Testcase 641:
set enable_memoize to off;
--Testcase 558:
explain (costs off)
select 1 from tenk1
where (hundred, thousand) in (select twothousand, twothousand from onek);
--Testcase 642:
reset enable_memoize;
--
-- Hash Aggregation Spill tests
--
--Testcase 643:
set enable_sort=false;
--Testcase 644:
set work_mem='64kB';
--Testcase 559:
select unique1, count(*), sum(twothousand) from tenk1
group by unique1
having sum(fivethous) > 4975
order by sum(twothousand);
--Testcase 645:
set work_mem to default;
--Testcase 646:
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.
--
--Testcase 647:
set work_mem='64kB';
--Testcase 560:
create foreign table agg_data_2k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 561:
create foreign table agg_data_20k(g int, id int options (key 'true')) server sqlite_svr;
--Testcase 562:
create foreign table agg_group_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 563:
create foreign table agg_group_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 564:
create foreign table agg_group_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 565:
create foreign table agg_group_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 566:
create foreign table agg_hash_1(c1 int, c2 numeric, c3 int) server sqlite_svr;
--Testcase 567:
create foreign table agg_hash_2(a int, c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 568:
create foreign table agg_hash_3(c1 numeric, c2 int4, c3 int) server sqlite_svr;
--Testcase 569:
create foreign table agg_hash_4(c1 numeric, c2 text, c3 int) server sqlite_svr;
--Testcase 570:
insert into agg_data_2k select g from generate_series(0, 1999) g;
--analyze agg_data_2k;
--Testcase 571:
insert into agg_data_20k select g from generate_series(0, 19999) g;
--analyze agg_data_20k;
-- Produce results with sorting.
--Testcase 648:
set enable_hashagg = false;
--Testcase 649:
set jit_above_cost = 0;
--Testcase 572:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 573:
insert into agg_group_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 574:
insert into agg_group_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 650:
set jit_above_cost to default;
--Testcase 575:
insert into agg_group_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 576:
insert into agg_group_4
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
--Testcase 651:
set enable_hashagg = true;
--Testcase 652:
set enable_sort = false;
--Testcase 653:
set jit_above_cost = 0;
--Testcase 577:
explain (costs off)
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 578:
insert into agg_hash_1
select g%10000 as c1, sum(g::numeric) as c2, count(*) as c3
from agg_data_20k group by g%10000;
--Testcase 579:
insert into agg_hash_2
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 agg_data_2k
where g < r.a
group by g/2) as s;
--Testcase 654:
set jit_above_cost to default;
--Testcase 580:
insert into agg_hash_3
select (g/2)::numeric as c1, sum(7::int4) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 581:
insert into agg_hash_4
select (g/2)::numeric as c1, array_agg(g::numeric) as c2, count(*) as c3
from agg_data_2k group by g/2;
--Testcase 655:
set enable_sort = true;
--Testcase 656:
set work_mem to default;
-- Compare group aggregation results to hash aggregation results
--Testcase 582:
(select * from agg_hash_1 except select * from agg_group_1)
union all
(select * from agg_group_1 except select * from agg_hash_1);
--Testcase 583:
(select * from agg_hash_2 except select * from agg_group_2)
union all
(select * from agg_group_2 except select * from agg_hash_2);
--Testcase 584:
(select * from agg_hash_3 except select * from agg_group_3)
union all
(select * from agg_group_3 except select * from agg_hash_3);
--Testcase 585:
(select * from agg_hash_4 except select * from agg_group_4)
union all
(select * from agg_group_4 except select * from agg_hash_4);
--Testcase 792:
DELETE FROM INT4_TBL;
--Testcase 793:
DELETE FROM INT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 586:
DROP SERVER sqlite_svr CASCADE;
--Testcase 587:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/encodings.sql
================================================
-- tests for PR #76 github
-- see https://www.postgresql.org/docs/current/multibyte.html
-- EUC_CN, not tested
-- EUC_JP
-- EUC_JIS_2004, not tested
-- EUC_KR
-- EUC_TW, not tested
-- ISO_8859_5
-- ISO_8859_6
-- ISO_8859_7
-- ISO_8859_8
-- KOI8R, not tested
-- KOI8U, not tested
-- LATIN1
-- LATIN2
-- LATIN3
-- LATIN4
-- LATIN5
-- LATIN6
-- LATIN7
-- LATIN8
-- LATIN9
-- LATIN10
-- MULE_INTERNAL, not tested
-- SQL_ASCII
-- WIN866, not tested
-- WIN874, not tested
-- WIN1250
-- WIN1251
-- WIN1252
-- WIN1253
-- WIN1254
-- WIN1255
-- WIN1256
-- WIN1257
-- WIN1258, not tested
-- ================
-- check all data in UTF8
-- ================
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
SELECT * FROM "Unicode data";
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
-- euc_jp
CREATE DATABASE "contrib_regression_EUC_JP" ENCODING EUC_JP LC_CTYPE='ja_JP.eucjp' LC_COLLATE='ja_JP.eucjp' template template0;
\connect "contrib_regression_EUC_JP"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_JP";
-- ko_KR.euckr
CREATE DATABASE "contrib_regression_EUC_KR" ENCODING EUC_KR LC_CTYPE='ko_KR.euckr' LC_COLLATE='ko_KR.euckr' template template0;
\connect "contrib_regression_EUC_KR"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_EUC_KR";
-- ISO_8859_5
CREATE DATABASE "contrib_regression_ISO_8859_5" ENCODING ISO_8859_5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_5";
-- ISO_8859_6
CREATE DATABASE "contrib_regression_ISO_8859_6" ENCODING ISO_8859_6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_6";
-- ISO_8859_7
CREATE DATABASE "contrib_regression_ISO_8859_7" ENCODING ISO_8859_7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_7";
-- ISO_8859_8
CREATE DATABASE "contrib_regression_ISO_8859_8" ENCODING ISO_8859_8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_8";
-- ISO_8859_9
CREATE DATABASE "contrib_regression_ISO_8859_9" ENCODING ISO_8859_9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_ISO_8859_9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_ISO_8859_9";
-- LATIN1
CREATE DATABASE "contrib_regression_LATIN1" ENCODING LATIN1 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN1"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN1";
-- LATIN2
CREATE DATABASE "contrib_regression_LATIN2" ENCODING LATIN2 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN2"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN2";
-- LATIN3
CREATE DATABASE "contrib_regression_LATIN3" ENCODING LATIN3 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN3"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN3";
-- LATIN4
CREATE DATABASE "contrib_regression_LATIN4" ENCODING LATIN4 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN4"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN4";
-- LATIN5
CREATE DATABASE "contrib_regression_LATIN5" ENCODING LATIN5 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN5"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN5";
-- LATIN6
CREATE DATABASE "contrib_regression_LATIN6" ENCODING LATIN6 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN6"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN6";
-- LATIN7
CREATE DATABASE "contrib_regression_LATIN7" ENCODING LATIN7 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN7"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN7";
-- LATIN8
CREATE DATABASE "contrib_regression_LATIN8" ENCODING LATIN8 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN8"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN8";
-- LATIN9
CREATE DATABASE "contrib_regression_LATIN9" ENCODING LATIN9 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN9"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN9";
-- LATIN10
CREATE DATABASE "contrib_regression_LATIN10" ENCODING LATIN10 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_LATIN10"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_LATIN10";
-- cp1250
CREATE DATABASE "contrib_regression_WIN1250" ENCODING WIN1250 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1250"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1250";
-- cp1251
CREATE DATABASE "contrib_regression_WIN1251" ENCODING WIN1251 LC_CTYPE='bg_BG' LC_COLLATE='bg_BG' template template0;
\connect "contrib_regression_WIN1251"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1251";
-- cp1252
CREATE DATABASE "contrib_regression_WIN1252" ENCODING WIN1252 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1252"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1252";
-- cp1253
CREATE DATABASE "contrib_regression_WIN1253" ENCODING WIN1253 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1253"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1253";
-- cp1254
CREATE DATABASE "contrib_regression_WIN1254" ENCODING WIN1254 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1254"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1254";
-- cp1255
CREATE DATABASE "contrib_regression_WIN1255" ENCODING WIN1255 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1255"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1255";
-- cp1256
CREATE DATABASE "contrib_regression_WIN1256" ENCODING WIN1256 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1256"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1256";
-- cp1257
CREATE DATABASE "contrib_regression_WIN1257" ENCODING WIN1257 LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_WIN1257"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_WIN1257";
-- SQL_ASCII
CREATE DATABASE "contrib_regression_SQL_ASCII" ENCODING SQL_ASCII LC_CTYPE='POSIX' LC_COLLATE='POSIX' template template0;
\connect "contrib_regression_SQL_ASCII"
CREATE EXTENSION sqlite_fdw;
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
CREATE FOREIGN TABLE "Unicode data"(i text OPTIONS (key 'true'), t text) SERVER sqlite_svr;
-- EUC_JP
SELECT * FROM "Unicode data" WHERE i = 'jap';
SELECT * FROM "Unicode data" WHERE t LIKE 'いろはにほ%';
INSERT INTO "Unicode data" (i, t) VALUES ('jap+', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._');
DELETE FROM "Unicode data" WHERE t = 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'jap+';
-- 1251, ISO_8859_5
SELECT * FROM "Unicode data" WHERE i = 'bel';
SELECT * FROM "Unicode data" WHERE i = 'bul';
SELECT * FROM "Unicode data" WHERE i = 'rus';
SELECT * FROM "Unicode data" WHERE i = 'ukr';
SELECT * FROM "Unicode data" WHERE t LIKE 'У руд%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ах, ч%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Широк%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Гей, %';
INSERT INTO "Unicode data" (i, t) VALUES ('bel+', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._');
SELECT * FROM "Unicode data" WHERE i = 'bel+';
DELETE FROM "Unicode data" WHERE t = 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bel+';
INSERT INTO "Unicode data" (i, t) VALUES ('bul+', 'Ах, чудна българска земьо, полюшвай цъфтящи жита._');
SELECT * FROM "Unicode data" WHERE i = 'bul+';
DELETE FROM "Unicode data" WHERE t = 'Ах, чудна българска земьо, полюшвай цъфтящи жита._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'bul+';
INSERT INTO "Unicode data" (i, t) VALUES ('rus+', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._');
SELECT * FROM "Unicode data" WHERE i = 'rus+';
DELETE FROM "Unicode data" WHERE t = 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'rus+';
INSERT INTO "Unicode data" (i, t) VALUES ('ukr+', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._');
SELECT * FROM "Unicode data" WHERE i = 'ukr+';
DELETE FROM "Unicode data" WHERE t = 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ukr+';
-- 1256, ISO_8859_6
SELECT * FROM "Unicode data" WHERE i = 'ara';
SELECT * FROM "Unicode data" WHERE t LIKE '%ضَظَغ%';
INSERT INTO "Unicode data" (i, t) VALUES ('ara+', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_');
SELECT * FROM "Unicode data" WHERE i = 'ara+';
DELETE FROM "Unicode data" WHERE t = 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'ara+';
-- 1253, ISO_8859_7
SELECT * FROM "Unicode data" WHERE i = 'gre';
SELECT * FROM "Unicode data" WHERE t LIKE 'Τάχισ%';
INSERT INTO "Unicode data" (i, t) VALUES ('gre+', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_');
SELECT * FROM "Unicode data" WHERE i = 'gre+';
DELETE FROM "Unicode data" WHERE t = 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός_';
-- 1255, ISO_8859_8
SELECT * FROM "Unicode data" WHERE i = 'heb';
SELECT * FROM "Unicode data" WHERE t LIKE '%כי ח%';
INSERT INTO "Unicode data" (i, t) VALUES ('heb+', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_');
SELECT * FROM "Unicode data" WHERE i = 'heb+';
DELETE FROM "Unicode data" WHERE t = 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'heb+';
-- 1252, LATIN1
SELECT * FROM "Unicode data" WHERE i = 'eus';
SELECT * FROM "Unicode data" WHERE i = 'fra';
SELECT * FROM "Unicode data" WHERE i = 'spa';
SELECT * FROM "Unicode data" WHERE t LIKE 'Permi%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Dès N%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Quier%';
INSERT INTO "Unicode data" (i, t) VALUES ('eus+', 'Permin gox dabiltzu yoskiñ._');
SELECT * FROM "Unicode data" WHERE i = 'eus+';
DELETE FROM "Unicode data" WHERE t = 'Permin gox dabiltzu yoskiñ._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'eus+';
INSERT INTO "Unicode data" (i, t) VALUES ('fra+', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_');
SELECT * FROM "Unicode data" WHERE i = 'fra+';
DELETE FROM "Unicode data" WHERE t = 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'fra+';
INSERT INTO "Unicode data" (i, t) VALUES ('spa+', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._');
SELECT * FROM "Unicode data" WHERE i = 'spa+';
DELETE FROM "Unicode data" WHERE t = 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'spa+';
-- 1250, LATIN2
SELECT * FROM "Unicode data" WHERE i = 'cze';
SELECT * FROM "Unicode data" WHERE i = 'pol';
SELECT * FROM "Unicode data" WHERE i = 'srp';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zvláš%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Pchną%';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ljuba%';
INSERT INTO "Unicode data" (i, t) VALUES ('cze+', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._');
SELECT * FROM "Unicode data" WHERE i = 'cze+';
DELETE FROM "Unicode data" WHERE t = 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'cze+';
INSERT INTO "Unicode data" (i, t) VALUES ('pol+', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._');
SELECT * FROM "Unicode data" WHERE i = 'pol+';
DELETE FROM "Unicode data" WHERE t = 'Pchnąć w tę łódź jeża lub ośm skrzyń fig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'pol+';
INSERT INTO "Unicode data" (i, t) VALUES ('srp+', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._');
SELECT * FROM "Unicode data" WHERE i = 'srp+';
DELETE FROM "Unicode data" WHERE t = 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'srp+';
-- 1257, LATIN7
SELECT * FROM "Unicode data" WHERE i = 'lav';
SELECT * FROM "Unicode data" WHERE t LIKE 'Ķieģeļu%';
INSERT INTO "Unicode data" (i, t) VALUES ('lav+', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._');
SELECT * FROM "Unicode data" WHERE i = 'lav+';
DELETE FROM "Unicode data" WHERE t = 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'lav+';
-- EUC_KR
SELECT * FROM "Unicode data" WHERE i = 'kor';
SELECT * FROM "Unicode data" WHERE t LIKE '키스의 고%';
INSERT INTO "Unicode data" (i, t) VALUES ('kor+', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._');
SELECT * FROM "Unicode data" WHERE i = 'kor+';
DELETE FROM "Unicode data" WHERE t = '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'kor+';
-- 1254, LATIN5
SELECT * FROM "Unicode data" WHERE i = 'aze';
SELECT * FROM "Unicode data" WHERE t LIKE 'Zəfər%';
INSERT INTO "Unicode data" (i, t) VALUES ('aze+', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._');
SELECT * FROM "Unicode data" WHERE i = 'aze+';
DELETE FROM "Unicode data" WHERE t = 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'aze+';
-- etc
INSERT INTO "Unicode data" (i, t) VALUES ('arm+', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_');
SELECT * FROM "Unicode data" WHERE i = 'arm+';
DELETE FROM "Unicode data" WHERE t = 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։_';
SELECT count(*) n FROM "Unicode data" WHERE i = 'arm+';
INSERT INTO "Unicode data" (i, t) VALUES ('gle+', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._');
SELECT * FROM "Unicode data" WHERE i = 'gle+';
DELETE FROM "Unicode data" WHERE t = 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'gle+';
INSERT INTO "Unicode data" (i, t) VALUES ('epo+', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._');
SELECT * FROM "Unicode data" WHERE i = 'epo+';
DELETE FROM "Unicode data" WHERE t = 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj._';
SELECT count(*) n FROM "Unicode data" WHERE i = 'epo+';
DROP FOREIGN TABLE "Unicode data";
DROP SERVER sqlite_svr;
DROP EXTENSION sqlite_fdw;
\connect contrib_regression;
DROP DATABASE "contrib_regression_SQL_ASCII";
================================================
FILE: sql/17.0/extra/insert.sql
================================================
--
-- insert with DEFAULT in the target_list
--
--Testcase 16:
CREATE EXTENSION sqlite_fdw;
--Testcase 17:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 18:
CREATE FOREIGN TABLE inserttest01 (col1 int4, col2 int4 NOT NULL, col3 text default 'testing') SERVER sqlite_svr;
--Testcase 1:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT, DEFAULT);
--Testcase 2:
insert into inserttest01 (col2, col3) values (3, DEFAULT);
--Testcase 3:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, 5, DEFAULT);
--Testcase 4:
insert into inserttest01 values (DEFAULT, 5, 'test');
--Testcase 5:
insert into inserttest01 values (DEFAULT, 7);
--Testcase 6:
select * from inserttest01;
--
-- insert with similar expression / target_list values (all fail)
--
--Testcase 7:
insert into inserttest01 (col1, col2, col3) values (DEFAULT, DEFAULT);
--Testcase 8:
insert into inserttest01 (col1, col2, col3) values (1, 2);
--Testcase 9:
insert into inserttest01 (col1) values (1, 2);
--Testcase 10:
insert into inserttest01 (col1) values (DEFAULT, DEFAULT);
--Testcase 11:
select * from inserttest01;
--
-- VALUES test
--
--Testcase 12:
insert into inserttest01 values(10, 20, '40'), (-1, 2, DEFAULT),
((select 2), (select i from (values(3)) as foo (i)), 'values are fun!');
--Testcase 13:
select * from inserttest01;
--
-- TOASTed value test
--
--Testcase 14:
insert into inserttest01 values(30, 50, repeat('x', 10000));
--Testcase 15:
select col1, col2, char_length(col3) from inserttest01;
--
-- tuple larger than fillfactor
-- foreign table does not support 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;
-- skip, sqlite fdw does not support customized type
/*
-- 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;
-- Make the same tests with domains over the array and composite fields
create domain insert_pos_ints as int[] check (value[1] > 0);
create domain insert_test_domain as insert_test_type
check ((value).if2[1] is not null);
create table inserttesta (f1 int, f2 insert_pos_ints);
create table inserttestb (f3 insert_test_domain, f4 insert_test_domain[]);
insert into inserttesta (f2[1], f2[2]) values (1,2);
insert into inserttesta (f2[1], f2[2]) values (3,4), (5,6);
insert into inserttesta (f2[1], f2[2]) select 7,8;
insert into inserttesta (f2[1], f2[2]) values (1,default); -- not supported
insert into inserttesta (f2[1], f2[2]) values (0,2);
insert into inserttesta (f2[1], f2[2]) values (3,4), (0,6);
insert into inserttesta (f2[1], f2[2]) select 0,8;
insert into inserttestb (f3.if1, f3.if2) values (1,array['foo']);
insert into inserttestb (f3.if1, f3.if2) values (1,'{foo}'), (2,'{bar}');
insert into inserttestb (f3.if1, f3.if2) select 3, '{baz,quux}';
insert into inserttestb (f3.if1, f3.if2) values (1,default); -- not supported
insert into inserttestb (f3.if1, f3.if2) values (1,array[null]);
insert into inserttestb (f3.if1, f3.if2) values (1,'{null}'), (2,'{bar}');
insert into inserttestb (f3.if1, f3.if2) select 3, '{null,quux}';
insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar');
insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar'), ('baz', 'quux');
insert into inserttestb (f3.if2[1], f3.if2[2]) select 'bear', 'beer';
insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar');
insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar'), (row(2,'{y}'), 'baz', 'quux');
insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) select row(1,'{x}')::insert_test_domain, 'bear', 'beer';
select * from inserttesta;
select * from inserttestb;
-- also check reverse-listing
create table inserttest2 (f1 bigint, f2 text);
create rule irule1 as on insert to inserttest2 do also
insert into inserttestb (f3.if2[1], f3.if2[2])
values (new.f1,new.f2);
create rule irule2 as on insert to inserttest2 do also
insert into inserttestb (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 inserttestb (f4[1].if1, f4[1].if2[2])
select new.f1, new.f2;
\d+ inserttest2
drop table inserttest2;
drop table inserttesta;
drop table inserttestb;
drop domain insert_pos_ints;
drop domain insert_test_domain;
-- Verify that multiple inserts to subfields of a domain-over-container
-- check the domain constraints only on the finished value
create domain insert_nnarray as int[]
check (value[1] is not null and value[2] is not null);
create domain insert_test_domain as insert_test_type
check ((value).if1 is not null and (value).if2 is not null);
create table inserttesta (f1 insert_nnarray);
insert into inserttesta (f1[1]) values (1); -- fail
insert into inserttesta (f1[1], f1[2]) values (1, 2);
create table inserttestb (f1 insert_test_domain);
insert into inserttestb (f1.if1) values (1); -- fail
insert into inserttestb (f1.if1, f1.if2) values (1, '{foo}');
drop table inserttesta;
drop table inserttestb;
drop domain insert_nnarray;
drop type insert_test_type cascade;
-- 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
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;
*/
-- drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 19:
DROP SERVER sqlite_svr;
--Testcase 20:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/join.sql
================================================
--
-- JOIN
-- Test JOIN clauses
--
--Testcase 360:
CREATE EXTENSION sqlite_fdw;
--Testcase 361:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 362:
CREATE FOREIGN TABLE J1_TBL (
i integer,
j integer,
t text
) SERVER sqlite_svr;
--Testcase 363:
CREATE FOREIGN TABLE J2_TBL (
i integer,
k integer
) SERVER sqlite_svr;
--Testcase 364:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 365:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 366:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 641:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 642:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 643:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 644:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 645:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
--Testcase 367:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 646:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 647:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 648:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 649:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 650:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
--Testcase 368:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 651:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 652:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 653:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 654:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 655:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 369:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO J1_TBL VALUES (1, 4, 'one');
--Testcase 2:
INSERT INTO J1_TBL VALUES (2, 3, 'two');
--Testcase 3:
INSERT INTO J1_TBL VALUES (3, 2, 'three');
--Testcase 4:
INSERT INTO J1_TBL VALUES (4, 1, 'four');
--Testcase 5:
INSERT INTO J1_TBL VALUES (5, 0, 'five');
--Testcase 6:
INSERT INTO J1_TBL VALUES (6, 6, 'six');
--Testcase 7:
INSERT INTO J1_TBL VALUES (7, 7, 'seven');
--Testcase 8:
INSERT INTO J1_TBL VALUES (8, 8, 'eight');
--Testcase 9:
INSERT INTO J1_TBL VALUES (0, NULL, 'zero');
--Testcase 10:
INSERT INTO J1_TBL VALUES (NULL, NULL, 'null');
--Testcase 11:
INSERT INTO J1_TBL VALUES (NULL, 0, 'zero');
--Testcase 12:
INSERT INTO J2_TBL VALUES (1, -1);
--Testcase 13:
INSERT INTO J2_TBL VALUES (2, 2);
--Testcase 14:
INSERT INTO J2_TBL VALUES (3, -3);
--Testcase 15:
INSERT INTO J2_TBL VALUES (2, 4);
--Testcase 16:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 17:
INSERT INTO J2_TBL VALUES (5, -5);
--Testcase 18:
INSERT INTO J2_TBL VALUES (0, NULL);
--Testcase 19:
INSERT INTO J2_TBL VALUES (NULL, NULL);
--Testcase 20:
INSERT INTO J2_TBL VALUES (NULL, 0);
-- useful in some tests below
--Testcase 370:
create temp table onerow();
--Testcase 371:
insert into onerow default values;
analyze onerow;
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
--Testcase 21:
SELECT *
FROM J1_TBL AS tx;
--Testcase 22:
SELECT *
FROM J1_TBL tx;
--Testcase 23:
SELECT *
FROM J1_TBL AS t1 (a, b, c);
--Testcase 24:
SELECT *
FROM J1_TBL t1 (a, b, c);
--Testcase 25:
SELECT *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
--Testcase 26:
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.
--
--Testcase 27:
SELECT *
FROM J1_TBL CROSS JOIN J2_TBL;
-- ambiguous column
--Testcase 28:
SELECT i, k, t
FROM J1_TBL CROSS JOIN J2_TBL;
-- resolve previous ambiguity by specifying the table name
--Testcase 29:
SELECT t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
--Testcase 30:
SELECT ii, tt, kk
FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
--Testcase 31:
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);
--Testcase 32:
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
--Testcase 33:
SELECT *
FROM J1_TBL INNER JOIN J2_TBL USING (i);
-- Same as above, slightly different syntax
--Testcase 34:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i);
--Testcase 35:
SELECT *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a)
ORDER BY a, d;
--Testcase 36:
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
--Testcase 489:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) WHERE J1_TBL.t = 'one'; -- ok
--Testcase 490:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one'; -- ok
--Testcase 491:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i)) AS x WHERE J1_TBL.t = 'one'; -- error
--Testcase 492:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.i = 1; -- ok
--Testcase 493:
SELECT *
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE x.t = 'one'; -- error
--Testcase 494:
SELECT *
FROM (J1_TBL JOIN J2_TBL USING (i) AS x) AS xx WHERE x.i = 1; -- error (XXX could use better hint)
--Testcase 495:
SELECT *
FROM J1_TBL a1 JOIN J2_TBL a2 USING (i) AS a1; -- error
--Testcase 496:
SELECT x.*
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 497:
SELECT ROW(x.*)
FROM J1_TBL JOIN J2_TBL USING (i) AS x WHERE J1_TBL.t = 'one';
--Testcase 498:
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
--
--Testcase 37:
SELECT *
FROM J1_TBL NATURAL JOIN J2_TBL;
--Testcase 38:
SELECT *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
--Testcase 39:
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
--Testcase 40:
SELECT *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
--
-- Inner joins (equi-joins)
--
--Testcase 41:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.i);
--Testcase 42:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i = J2_TBL.k);
--
-- Non-equi-joins
--
--Testcase 43:
SELECT *
FROM J1_TBL JOIN J2_TBL ON (J1_TBL.i <= J2_TBL.k);
--
-- Outer joins
-- Note that OUTER is a noise word
--
--Testcase 44:
SELECT *
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 45:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 46:
SELECT *
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
--Testcase 47:
SELECT *
FROM J1_TBL RIGHT JOIN J2_TBL USING (i);
--Testcase 48:
SELECT *
FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 49:
SELECT *
FROM J1_TBL FULL JOIN J2_TBL USING (i)
ORDER BY i, k, t;
--Testcase 50:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (k = 1);
--Testcase 51:
SELECT *
FROM J1_TBL LEFT JOIN J2_TBL USING (i) WHERE (i = 1);
--
-- semijoin selectivity for <>
--
--Testcase 52:
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
--
--Testcase 372:
CREATE FOREIGN TABLE t11 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 373:
CREATE FOREIGN TABLE t21 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 374:
CREATE FOREIGN TABLE t31 (name TEXT, n INTEGER) SERVER sqlite_svr;
--Testcase 483:
CREATE FOREIGN TABLE onek (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 53:
INSERT INTO t11 VALUES ( 'bb', 11 );
--Testcase 54:
INSERT INTO t21 VALUES ( 'bb', 12 );
--Testcase 55:
INSERT INTO t21 VALUES ( 'cc', 22 );
--Testcase 56:
INSERT INTO t21 VALUES ( 'ee', 42 );
--Testcase 57:
INSERT INTO t31 VALUES ( 'bb', 13 );
--Testcase 58:
INSERT INTO t31 VALUES ( 'cc', 23 );
--Testcase 59:
INSERT INTO t31 VALUES ( 'dd', 33 );
--Testcase 60:
SELECT * FROM t11 FULL JOIN t21 USING (name) FULL JOIN t31 USING (name);
--
-- Test interactions of join syntax and subqueries
--
-- Basic cases (we expect planner to pull up the subquery here)
--Testcase 61:
SELECT * FROM
(SELECT * FROM t21) as s2
INNER JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 62:
SELECT * FROM
(SELECT * FROM t21) as s2
LEFT JOIN
(SELECT * FROM t31) s3
USING (name);
--Testcase 63:
SELECT * FROM
(SELECT * FROM t21) as s2
FULL JOIN
(SELECT * FROM t31) s3
USING (name);
-- Cases with non-nullable expressions in subquery results;
-- make sure these go to null as expected
--Testcase 64:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 65:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL LEFT JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 66:
SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 67:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL INNER JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL INNER JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 68:
SELECT * FROM
(SELECT name, n as s1_n, 1 as s1_1 FROM t11) as s1
NATURAL FULL JOIN
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n, 3 as s3_2 FROM t31) s3;
--Testcase 69:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
--Testcase 70:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
NATURAL FULL JOIN
(SELECT * FROM
(SELECT name, n as s2_n, 2 as s2_2 FROM t21) as s2
NATURAL FULL JOIN
(SELECT name, n as s3_n FROM t31) as s3
) ss2;
-- Constants as join keys can also be problematic
--Testcase 375:
SELECT * FROM
(SELECT name, n as s1_n FROM t11) as s1
FULL JOIN
(SELECT name, 2 as s2_n FROM t21) as s2
ON (s1_n = s2_n);
-- Test for propagation of nullability constraints into sub-joins
--Testcase 376:
create foreign table x (x1 int, x2 int) server sqlite_svr;
--Testcase 71:
insert into x values (1,11);
--Testcase 72:
insert into x values (2,22);
--Testcase 73:
insert into x values (3,null);
--Testcase 74:
insert into x values (4,44);
--Testcase 75:
insert into x values (5,null);
--Testcase 377:
create foreign table y (y1 int, y2 int) server sqlite_svr;
--Testcase 76:
insert into y values (1,111);
--Testcase 77:
insert into y values (2,222);
--Testcase 78:
insert into y values (3,333);
--Testcase 79:
insert into y values (4,null);
--Testcase 80:
select * from x;
--Testcase 81:
select * from y;
--Testcase 82:
select * from x left join y on (x1 = y1 and x2 is not null);
--Testcase 83:
select * from x left join y on (x1 = y1 and y2 is not null);
--Testcase 84:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1);
--Testcase 85:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and x2 is not null);
--Testcase 86:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1 and y2 is not null);
--Testcase 87:
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
--Testcase 88:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (x2 is not null);
--Testcase 89:
select * from (x left join y on (x1 = y1)) left join x xx(xx1,xx2)
on (x1 = xx1) where (y2 is not null);
--Testcase 90:
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
--
--Testcase 91:
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
--
--Testcase 92:
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;
--Testcase 499:
set geqo = on;
--Testcase 500:
set geqo_threshold = 2;
--Testcase 93:
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
--
--Testcase 378:
create table b (aa int, bb int);
--Testcase 379:
explain (costs off)
select aa, bb, unique1, unique1
from tenk1 right join b on aa = unique1
where bb < bb and bb is null;
--Testcase 380:
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
--
--Testcase 94:
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;
--Testcase 95:
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()
-- used to give an imprecise result, causing an assertion failure
--
--Testcase 96:
select count(*)
from
(select t31.tenthous as x1, coalesce(t11.stringu1, t21.stringu1) as x2
from tenk1 t11
left join tenk1 t21 on t11.unique1 = t21.unique1
join tenk1 t31 on t11.unique2 = t31.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
--
--Testcase 97:
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;
--Testcase 98:
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;
--
-- checks for correct handling of quals in multiway outer joins
--
--Testcase 545:
explain (costs off)
select t1.f1
from int4_tbl t1, int4_tbl t2
left join int4_tbl t3 on t3.f1 > 0
left join int4_tbl t4 on t3.f1 > 1
where t4.f1 is null;
--Testcase 546:
select t1.f1
from int4_tbl t1, int4_tbl t2
left join int4_tbl t3 on t3.f1 > 0
left join int4_tbl t4 on t3.f1 > 1
where t4.f1 is null;
--Testcase 547:
explain (costs off)
select *
from int4_tbl t1 left join int4_tbl t2 on true
left join int4_tbl t3 on t2.f1 > 0
left join int4_tbl t4 on t3.f1 > 0;
--Testcase 548:
explain (costs off)
select * from onek t1
left join onek t2 on t1.unique1 = t2.unique1
left join onek t3 on t2.unique1 != t3.unique1
left join onek t4 on t3.unique1 = t4.unique1;
--Testcase 549:
explain (costs off)
select * from int4_tbl t1
left join (select now() from int4_tbl t2
left join int4_tbl t3 on t2.f1 = t3.f1
left join int4_tbl t4 on t3.f1 = t4.f1) s on true
inner join int4_tbl t5 on true;
--Testcase 550:
explain (costs off)
select * from int4_tbl t1
left join int4_tbl t2 on true
left join int4_tbl t3 on true
left join int4_tbl t4 on t2.f1 = t3.f1;
--Testcase 551:
explain (costs off)
select * from int4_tbl t1
left join int4_tbl t2 on true
left join int4_tbl t3 on t2.f1 = t3.f1
left join int4_tbl t4 on t3.f1 != t4.f1;
--Testcase 552:
explain (costs off)
select * from int4_tbl t1
left join (int4_tbl t2 left join int4_tbl t3 on t2.f1 > 0) on t2.f1 > 1
left join int4_tbl t4 on t2.f1 > 2 and t3.f1 > 3
where t1.f1 = coalesce(t2.f1, 1);
--Testcase 553:
explain (costs off)
select * from int4_tbl t1
left join ((select t2.f1 from int4_tbl t2
left join int4_tbl t3 on t2.f1 > 0
where t3.f1 is null) s
left join tenk1 t4 on s.f1 > 1)
on s.f1 = t1.f1;
--Testcase 554:
explain (costs off)
select * from int4_tbl t1
left join ((select t2.f1 from int4_tbl t2
left join int4_tbl t3 on t2.f1 > 0
where t2.f1 <> coalesce(t3.f1, -1)) s
left join tenk1 t4 on s.f1 > 1)
on s.f1 = t1.f1;
--Testcase 555:
explain (costs off)
select * from onek t1
left join onek t2 on t1.unique1 = t2.unique1
left join onek t3 on t2.unique1 = t3.unique1
left join onek t4 on t3.unique1 = t4.unique1 and t2.unique2 = t4.unique2;
--Testcase 556:
explain (costs off)
select * from int8_tbl t1 left join
(int8_tbl t2 left join int8_tbl t3 full join int8_tbl t4 on false on false)
left join int8_tbl t5 on t2.q1 = t5.q1
on t2.q2 = 123;
--Testcase 557:
explain (costs off)
select * from int8_tbl t1
left join int8_tbl t2 on true
left join lateral
(select * from int8_tbl t3 where t3.q1 = t2.q1 offset 0) s
on t2.q1 = 1;
--Testcase 558:
explain (costs off)
select * from int8_tbl t1
left join int8_tbl t2 on true
left join lateral
(select * from generate_series(t2.q1, 100)) s
on t2.q1 = 1;
--Testcase 559:
explain (costs off)
select * from int8_tbl t1
left join int8_tbl t2 on true
left join lateral
(select t2.q1 from int8_tbl t3) s
on t2.q1 = 1;
--Testcase 560:
explain (costs off)
select * from onek t1
left join onek t2 on true
left join lateral
(select * from onek t3 where t3.two = t2.two offset 0) s
on t2.unique1 = 1;
--
-- check a case where we formerly got confused by conflicting sort orders
-- in redundant merge join path keys
-- PS: Used ORDER BY to force SQLite and PG12 always order in the same way (NULLS FIRST/LAST default value for PG and Sqlite are different)
--
--Testcase 99:
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 ORDER BY j1_tbl.i, j2_tbl.k;
--Testcase 100:
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 BY j1_tbl.i, j2_tbl.k;
--
-- a different check for handling of redundant sort keys in merge joins
--
--Testcase 101:
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;
--Testcase 102:
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;
set enable_hashjoin = 0;
set enable_nestloop = 0;
set enable_hashagg = 0;
--
-- Check that we use the pathkeys from a prefix of the group by / order by
-- clause for the join pathkeys when that prefix covers all join quals. We
-- expect this to lead to an incremental sort for the group by / order by.
--
--Testcase 561:
explain (costs off)
select x.thousand, x.twothousand, count(*)
from tenk1 x inner join tenk1 y on x.thousand = y.thousand
group by x.thousand, x.twothousand
order by x.thousand desc, x.twothousand;
reset enable_hashagg;
reset enable_nestloop;
reset enable_hashjoin;
--
-- Clean up
--
--Testcase 381:
DROP FOREIGN TABLE t11;
--Testcase 382:
DROP FOREIGN TABLE t21;
--Testcase 383:
DROP FOREIGN TABLE t31;
--Testcase 384:
DROP FOREIGN TABLE J1_TBL;
--Testcase 385:
DROP FOREIGN TABLE J2_TBL;
-- Both DELETE and UPDATE allow the specification of additional tables
-- to "join" against to determine which rows should be modified.
--Testcase 386:
CREATE FOREIGN TABLE t12 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 387:
CREATE FOREIGN TABLE t22 (a int OPTIONS (key 'true'), b int) SERVER sqlite_svr;
--Testcase 388:
CREATE FOREIGN TABLE t32 (x int OPTIONS (key 'true'), y int) SERVER sqlite_svr;
--Testcase 103:
INSERT INTO t12 VALUES (5, 10);
--Testcase 104:
INSERT INTO t12 VALUES (15, 20);
--Testcase 105:
INSERT INTO t12 VALUES (100, 100);
--Testcase 106:
INSERT INTO t12 VALUES (200, 1000);
--Testcase 107:
INSERT INTO t22 VALUES (200, 2000);
--Testcase 108:
INSERT INTO t32 VALUES (5, 20);
--Testcase 109:
INSERT INTO t32 VALUES (6, 7);
--Testcase 110:
INSERT INTO t32 VALUES (7, 8);
--Testcase 111:
INSERT INTO t32 VALUES (500, 100);
--Testcase 112:
DELETE FROM t32 USING t12 table1 WHERE t32.x = table1.a;
--Testcase 113:
SELECT * FROM t32;
--Testcase 114:
DELETE FROM t32 USING t12 JOIN t22 USING (a) WHERE t32.x > t12.a;
--Testcase 115:
SELECT * FROM t32;
--Testcase 116:
DELETE FROM t32 USING t32 t3_other WHERE t32.x = t3_other.x AND t32.y = t3_other.y;
--Testcase 117:
SELECT * FROM t32;
-- Test join against inheritance tree
--Testcase 389:
create temp table t2a () inherits (t22);
--Testcase 118:
insert into t2a values (200, 2001);
--Testcase 119:
select * from t12 left join t22 on (t12.a = t22.a);
-- Test matching of column name with wrong alias
--Testcase 120:
select t12.x from t12 join t32 on (t12.a = t32.x);
-- Test matching of locking clause with wrong alias
--Testcase 540:
select t12.*, t22.*, unnamed_join.* from
t12 join t22 on (t12.a = t22.a), t32 as unnamed_join
for update of unnamed_join;
--Testcase 541:
select foo.*, unnamed_join.* from
t12 join t22 using (a) as foo, t32 as unnamed_join
for update of unnamed_join;
--Testcase 542:
select foo.*, unnamed_join.* from
t12 join t22 using (a) as foo, t32 as unnamed_join
for update of foo;
--Testcase 543:
select bar.*, unnamed_join.* from
(t12 join t22 using (a) as foo) as bar, t32 as unnamed_join
for update of foo;
--Testcase 544:
select bar.*, unnamed_join.* from
(t12 join t22 using (a) as foo) as bar, t32 as unnamed_join
for update of bar;
--Testcase 536:
drop table t2a;
--
-- regression test for 8.1 merge right join bug
--
--Testcase 390:
CREATE FOREIGN TABLE tt1 ( tt1_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO tt1 VALUES (1, 11);
--Testcase 122:
INSERT INTO tt1 VALUES (2, NULL);
--Testcase 391:
CREATE FOREIGN TABLE tt2 ( tt2_id int4, joincol int4 ) SERVER sqlite_svr;
--Testcase 123:
INSERT INTO tt2 VALUES (21, 11);
--Testcase 124:
INSERT INTO tt2 VALUES (22, 11);
--Testcase 501:
set enable_hashjoin to off;
--Testcase 502:
set enable_nestloop to off;
-- these should give the same results
--Testcase 125:
select tt1.*, tt2.* from tt1 left join tt2 on tt1.joincol = tt2.joincol;
--Testcase 126:
select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol;
--Testcase 503:
reset enable_hashjoin;
--Testcase 504:
reset enable_nestloop;
--
-- regression test for bug #18522 (merge-right-anti-join in inner_unique cases)
--
--Testcase 637:
create foreign table tbl_ra(a int options (key 'true'), b int) server sqlite_svr;
--Testcase 638:
insert into tbl_ra select i, i%100 from generate_series(1,1000)i;
-- CREATE INDEX, ANALYZE are not supported for foreign tables.
-- create index on tbl_ra (b);
-- analyze tbl_ra;
set enable_hashjoin to off;
set enable_nestloop to off;
-- Because CREATE INDEX is not supported for foreign tables,
-- we cannot use this index to create a merge right anti join plan
-- ensure we get a merge right anti join
--Testcase 639:
explain (costs off)
select * from tbl_ra t1
where not exists (select 1 from tbl_ra t2 where t2.b = t1.a) and t1.b < 2;
-- and check we get the expected results
--Testcase 640:
select * from tbl_ra t1
where not exists (select 1 from tbl_ra t2 where t2.b = t1.a) and t1.b < 2;
reset enable_hashjoin;
reset enable_nestloop;
--
-- regression test for bug #13908 (hash join with skew tuples & nbatch increase)
--
--Testcase 505:
set work_mem to '64kB';
--Testcase 506:
set enable_mergejoin to off;
--Testcase 507:
set enable_memoize to off;
--Testcase 127:
explain (costs off)
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 128:
select count(*) from tenk1 a, tenk1 b
where a.hundred = b.thousand and (b.fivethous % 10) < 10;
--Testcase 508:
reset work_mem;
--Testcase 509:
reset enable_mergejoin;
--Testcase 510:
reset enable_memoize;
--
-- regression test for 8.2 bug with improper re-ordering of left joins
--
--Testcase 392:
create foreign table tt3(f1 int, f2 text) server sqlite_svr;
--Testcase 129:
insert into tt3 select x, repeat('xyzzy', 100) from generate_series(1,10000) x;
--Testcase 393:
create foreign table tt4(f1 int) server sqlite_svr;
--Testcase 130:
insert into tt4 values (0),(1),(9999);
set enable_nestloop to off;
--Testcase 562:
EXPLAIN (COSTS OFF)
SELECT a.f1
FROM tt4 a
LEFT JOIN (
SELECT b.f1
FROM tt3 b LEFT JOIN tt3 c ON (b.f1 = c.f1)
WHERE COALESCE(c.f1, 0) = 0
) AS d ON (a.f1 = d.f1)
WHERE COALESCE(d.f1, 0) = 0
ORDER BY 1;
--Testcase 563:
SELECT a.f1
FROM tt4 a
LEFT JOIN (
SELECT b.f1
FROM tt3 b LEFT JOIN tt3 c ON (b.f1 = c.f1)
WHERE COALESCE(c.f1, 0) = 0
) AS d ON (a.f1 = d.f1)
WHERE COALESCE(d.f1, 0) = 0
ORDER BY 1;
reset enable_nestloop;
--
-- basic semijoin and antijoin recognition tests
--
--Testcase 564:
explain (costs off)
select a.* from tenk1 a
where unique1 in (select unique2 from tenk1 b);
-- sadly, this is not an antijoin
--Testcase 565:
explain (costs off)
select a.* from tenk1 a
where unique1 not in (select unique2 from tenk1 b);
--Testcase 566:
explain (costs off)
select a.* from tenk1 a
where exists (select 1 from tenk1 b where a.unique1 = b.unique2);
--Testcase 567:
explain (costs off)
select a.* from tenk1 a
where not exists (select 1 from tenk1 b where a.unique1 = b.unique2);
--Testcase 568:
explain (costs off)
select a.* from tenk1 a left join tenk1 b on a.unique1 = b.unique2
where b.unique2 is null;
--
-- regression test for proper handling of outer joins within antijoins
--
--Testcase 394:
create foreign table tt4x(c1 int, c2 int, c3 int) server sqlite_svr;
--Testcase 132:
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
--
--Testcase 395:
create foreign table tt5(f1 int, f2 int) server sqlite_svr;
--Testcase 396:
create foreign table tt6(f1 int, f2 int) server sqlite_svr;
--Testcase 133:
insert into tt5 values(1, 10);
--Testcase 134:
insert into tt5 values(1, 11);
--Testcase 135:
insert into tt6 values(1, 9);
--Testcase 136:
insert into tt6 values(1, 2);
--Testcase 137:
insert into tt6 values(2, 9);
--Testcase 138:
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
--
--Testcase 397:
create foreign table xx (pkxx int) server sqlite_svr;
--Testcase 398:
create foreign table yy (pkyy int, pkxx int) server sqlite_svr;
--Testcase 139:
insert into xx values (1);
--Testcase 140:
insert into xx values (2);
--Testcase 141:
insert into xx values (3);
--Testcase 142:
insert into yy values (101, 1);
--Testcase 143:
insert into yy values (201, 2);
--Testcase 144:
insert into yy values (301, NULL);
--Testcase 145:
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)
--
--Testcase 399:
create foreign table zt1 (f1 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 400:
create foreign table zt2 (f2 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 401:
create foreign table zt3 (f3 int OPTIONS(key 'true')) server sqlite_svr;
--Testcase 146:
insert into zt1 values(53);
--Testcase 147:
insert into zt2 values(53);
--Testcase 148:
select * from
zt2 left join zt3 on (f2 = f3)
left join zt1 on (f3 = f1)
where f2 = 53;
--Testcase 402:
create temp view zv1 as select *,'dummy'::text AS junk from zt1;
--Testcase 149:
select * from
zt2 left join zt3 on (f2 = f3)
left join zv1 on (f3 = f1)
where f2 = 53;
--Testcase 537:
drop view zv1;
--
-- regression test for improper extraction of OR indexqual conditions
-- (as seen in early 8.3.x releases)
--
--Testcase 150:
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)
--
--Testcase 151:
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));
--Testcase 152:
execute foo(true);
--Testcase 153:
execute foo(false);
--
-- test for sane behavior with noncanonical merge clauses, per bug #4926
--
begin;
--Testcase 511:
set enable_mergejoin = 1;
--Testcase 512:
set enable_hashjoin = 0;
--Testcase 513:
set enable_nestloop = 0;
--Testcase 403:
create foreign table a1 (i integer) server sqlite_svr;
--Testcase 404:
create foreign table b1 (x integer, y integer) server sqlite_svr;
--Testcase 154:
select * from a1 left join b1 on i = x and i = y and x = i;
rollback;
-- skip this test, sqlite fdw does not support customized type
-- test handling of merge clauses using record_ops
--
--begin;
--create type mycomptype as (id int, v bigint);
--create foreign table tidv (idv mycomptype) server sqlite_svr;
--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;
--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
--
--Testcase 155:
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;
--Testcase 156:
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;
--Testcase 157:
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;
--Testcase 158:
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;
--Testcase 405:
create foreign table a2 (
code char OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 406:
create foreign table b2 (
a char OPTIONS (key 'true'),
num integer OPTIONS (key 'true')
) server sqlite_svr;
--Testcase 407:
create foreign table c2 (
name char OPTIONS (key 'true'),
a char
) server sqlite_svr;
--Testcase 159:
insert into a2 (code) values ('p');
--Testcase 160:
insert into a2 (code) values ('q');
--Testcase 161:
insert into b2 (a, num) values ('p', 1);
--Testcase 162:
insert into b2 (a, num) values ('p', 2);
--Testcase 163:
insert into c2 (name, a) values ('A', 'p');
--Testcase 164:
insert into c2 (name, a) values ('B', 'q');
--Testcase 165:
insert into c2 (name, a) values ('C', null);
--Testcase 166:
select c2.name, ss.code, ss.b_cnt, ss.const
from c2 left join
(select a2.code, coalesce(b_grp.cnt, 0) as b_cnt, -1 as const
from a2 left join
(select count(1) as cnt, b2.a from b2 group by b2.a) as b_grp
on a2.code = b_grp.a
) as ss
on (c2.a = ss.code)
order by c2.name;
rollback;
--
-- test incorrect handling of placeholders that only appear in targetlists,
-- per bug #6154
--
--Testcase 408:
create foreign table sub_tbl (key1 int, key3 int, key5 int, key6 int, value1 int, id int options (key 'true')) server sqlite_svr;
--Testcase 409:
insert into sub_tbl values (1, 1, 1, 2, 42);
--Testcase 410:
SELECT * FROM
( SELECT key1 from sub_tbl) sub1
LEFT JOIN
( SELECT sub3.key3, sub4.value2, COALESCE(sub4.value2, 66) as value3 FROM
( SELECT key3 from sub_tbl) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl ) 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
--Testcase 411:
SELECT * FROM
( SELECT key1 from sub_tbl ) sub1
LEFT JOIN
( SELECT sub3.key3, value2, COALESCE(value2, 66) as value3 FROM
( SELECT key3 from sub_tbl ) sub3
LEFT JOIN
( SELECT sub5.key5, COALESCE(sub6.value1, 1) as value2 FROM
( SELECT key5 from sub_tbl ) sub5
LEFT JOIN
( SELECT key6, value1 from sub_tbl) 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
--
--Testcase 167:
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;
--Testcase 168:
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
--
--Testcase 412:
create foreign table nt1 (
id int OPTIONS (key 'true'),
a1 boolean,
a2 boolean
) server sqlite_svr;
--Testcase 413:
create foreign table nt2 (
id int OPTIONS (key 'true'),
nt1_id int,
b1 boolean,
b2 boolean
) server sqlite_svr;
--Testcase 414:
create foreign table nt3 (
id int OPTIONS (key 'true'),
nt2_id int,
c1 boolean
) server sqlite_svr;
--Testcase 169:
insert into nt1 values (1,true,true);
--Testcase 170:
insert into nt1 values (2,true,false);
--Testcase 171:
insert into nt1 values (3,false,false);
--Testcase 172:
insert into nt2 values (1,1,true,true);
--Testcase 173:
insert into nt2 values (2,2,true,false);
--Testcase 174:
insert into nt2 values (3,3,false,false);
--Testcase 175:
insert into nt3 values (1,1,true);
--Testcase 176:
insert into nt3 values (2,2,false);
--Testcase 177:
insert into nt3 values (3,3,true);
--Testcase 178:
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;
--Testcase 179:
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
--
--Testcase 180:
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;
--Testcase 181:
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
--
--Testcase 514:
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;
--Testcase 515:
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
--
--Testcase 182:
select * from int4_tbl a full join int4_tbl b on true;
--Testcase 183:
select * from int4_tbl a full join int4_tbl b on false;
--
-- test for ability to use a cartesian join when necessary
--
--Testcase 415:
create foreign table q1(i int) server sqlite_svr;
--Testcase 416:
insert into q1 values (1);
--Testcase 417:
create foreign table q2(i int) server sqlite_svr;
--Testcase 418:
insert into q2 values (0);
--Testcase 184:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where q1.i = thousand or q2.i = thousand;
--Testcase 185:
explain (costs off)
select * from
tenk1 join int4_tbl on f1 = twothousand,
q1, q2
where thousand = (q1.i + q2.i);
--
-- test ability to generate a suitable plan for a star-schema query
--
--Testcase 186:
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
--
--Testcase 187:
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;
--Testcase 188:
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
--Testcase 189:
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
--Testcase 419:
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;
--Testcase 420:
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
--Testcase 421:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
--Testcase 422:
select * from
(select key1 as x from sub_tbl as x) ss1 left join (select key6 as y from sub_tbl) ss2 on (true),
lateral (select ss2.y as z limit 1) ss3;
-- Test proper handling of appendrel PHVs during useless-RTE removal
--Testcase 516:
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;
--Testcase 517:
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 PHV in a semijoin qual, which confused useless-RTE removal (bug #17700)
--Testcase 569:
explain (verbose, costs off)
with ctetable as not materialized ( select 1 as f1 )
select * from ctetable c1
where f1 in ( select c3.f1 from ctetable c2 full join ctetable c3 on true );
--Testcase 570:
with ctetable as not materialized ( select 1 as f1 )
select * from ctetable c1
where f1 in ( select c3.f1 from ctetable c2 full join ctetable c3 on true );
-- Test PHV that winds up in a Result node, despite having nonempty nullingrels
--Testcase 571:
explain (verbose, costs off)
select table_catalog, table_name
from int4_tbl t1
inner join (int8_tbl t2
left join information_schema.column_udt_usage on null)
on null;
-- Test handling of qual pushdown to appendrel members with non-Var outputs
--Testcase 572:
explain (verbose, costs off)
select * from int4_tbl left join (
select text 'foo' union all select text 'bar'
) ss(x) on true
where ss.x is null;
--
-- test inlining of immutable functions
--
--Testcase 423:
create function f_immutable_int4(i integer) returns integer as
$$ begin return i; end; $$ language plpgsql immutable;
-- check optimization of function scan with join
--Testcase 424:
explain (costs off)
select unique1 from tenk1, (select * from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 425:
explain (verbose, costs off)
select unique1, x.*
from tenk1, (select *, random() from f_immutable_int4(1) x) x
where x = unique1;
--Testcase 426:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = unique1;
--Testcase 427:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x = unique1;
--Testcase 538:
explain (costs off)
select unique1 from tenk1, lateral f_immutable_int4(1) x where x in (select 17);
--Testcase 428:
explain (costs off)
select unique1, x from tenk1 join f_immutable_int4(1) x on unique1 = x;
--Testcase 429:
explain (costs off)
select unique1, x from tenk1 left join f_immutable_int4(1) x on unique1 = x;
--Testcase 430:
explain (costs off)
select unique1, x from tenk1 right join f_immutable_int4(1) x on unique1 = x;
--Testcase 431:
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
--Testcase 432:
explain (costs off)
select unique1 from tenk1, f_immutable_int4(1) x where x = 42;
-- test inlining of immutable functions with PlaceHolderVars
--Testcase 433:
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;
--Testcase 434:
drop function f_immutable_int4(int);
-- test inlining when function returns composite
--Testcase 435:
create function mki8(bigint, bigint) returns int8_tbl as
$$select row($1,$2)::int8_tbl$$ language sql;
--Testcase 436:
create function mki4(int) returns int4_tbl as
$$select row($1)::int4_tbl$$ language sql;
--Testcase 437:
explain (verbose, costs off)
select * from mki8(1,2);
--Testcase 438:
select * from mki8(1,2);
--Testcase 439:
explain (verbose, costs off)
select * from mki4(42);
--Testcase 440:
select * from mki4(42);
--Testcase 441:
drop function mki8(bigint, bigint);
--Testcase 442:
drop function mki4(int);
-- test const-folding of a whole-row Var into a per-field Var
-- (need to inline a function to reach this case, else parser does it)
--Testcase 632:
create function f_field_select(t onek) returns int4 as
$$ select t.unique2; $$ language sql immutable;
--Testcase 633:
explain (verbose, costs off)
select (t2.*).unique1, f_field_select(t2) from tenk1 t1
left join onek t2 on t1.unique1 = t2.unique1
left join int8_tbl t3 on true;
--Testcase 634:
drop function f_field_select(t onek);
--
-- test extraction of restriction OR clauses from join OR clause
-- (we used to only do this for indexable clauses)
--
--Testcase 190:
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);
--Testcase 191:
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);
--Testcase 192:
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
--
--Testcase 193:
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;
--Testcase 194:
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;
--Testcase 195:
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;
--Testcase 196:
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;
--Testcase 197:
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;
--Testcase 198:
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;
--Testcase 199:
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;
--Testcase 200:
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;
--Testcase 201:
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;
--Testcase 202:
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
--
--Testcase 203:
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);
--Testcase 204:
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);
--Testcase 205:
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;
--Testcase 206:
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)
--
--Testcase 207:
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;
--Testcase 208:
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;
-- related case
--Testcase 573:
explain (costs off)
select * from int8_tbl t1 left join int8_tbl t2 on t1.q2 = t2.q1,
lateral (select * from int8_tbl t3 where t2.q1 = t2.q2) ss;
--Testcase 574:
select * from int8_tbl t1 left join int8_tbl t2 on t1.q2 = t2.q1,
lateral (select * from int8_tbl t3 where t2.q1 = t2.q2) ss;
--
-- check handling of join aliases when flattening multiple levels of subquery
--
--Testcase 209:
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);
--Testcase 210:
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);
--
-- check handling of a variable-free join alias
--
--Testcase 575:
explain (verbose, costs off)
select * from
int4_tbl i0 left join
( (select *, 123 as x from int4_tbl i1) ss1
left join
(select *, q2 as x from int8_tbl i2) ss2
using (x)
) ss0
on (i0.f1 = ss0.f1)
order by i0.f1, x;
--Testcase 576:
select * from
int4_tbl i0 left join
( (select *, 123 as x from int4_tbl i1) ss1
left join
(select *, q2 as x from int8_tbl i2) ss2
using (x)
) ss0
on (i0.f1 = ss0.f1)
order by i0.f1, x;
--
-- test successful handling of nested outer joins with degenerate join quals
--
--Testcase 443:
create foreign table text_tbl(f1 text) server sqlite_svr;
--Testcase 211:
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);
--Testcase 212:
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);
--Testcase 213:
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);
--Testcase 214:
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);
--Testcase 215:
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);
--Testcase 216:
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);
--Testcase 217:
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;
--Testcase 218:
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;
-- check handling of a variable-free qual for a non-commutable outer join
--Testcase 577:
explain (costs off)
select nspname
from (select 1 as x) ss1
left join
( select n.nspname, c.relname
from pg_class c left join pg_namespace n on n.oid = c.relnamespace
where c.relkind = 'r'
) ss2 on false;
-- check handling of apparently-commutable outer joins with non-commutable
-- joins between them
--Testcase 578:
explain (costs off)
select 1 from
int4_tbl i4
left join int8_tbl i8 on i4.f1 is not null
left join (select 1 as a) ss1 on null
join int4_tbl i42 on ss1.a is null or i8.q1 <> i8.q2
right join (select 2 as b) ss2
on ss2.b < i4.f1;
--
-- test for appropriate join order in the presence of lateral references
--
--Testcase 219:
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;
--Testcase 220:
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;
--Testcase 221:
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;
--Testcase 222:
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;
--Testcase 223:
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;
--Testcase 224:
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;
--Testcase 579:
explain (verbose, costs off)
select 1 from
int4_tbl as i4
inner join
((select 42 as n from int4_tbl x1 left join int8_tbl x2 on f1 = q1) as ss1
right join (select 1 as z) as ss2 on true)
on false,
lateral (select i4.f1, ss1.n from int8_tbl as i8 limit 1) as ss3;
--Testcase 580:
select 1 from
int4_tbl as i4
inner join
((select 42 as n from int4_tbl x1 left join int8_tbl x2 on f1 = q1) as ss1
right join (select 1 as z) as ss2 on true)
on false,
lateral (select i4.f1, ss1.n from int8_tbl as i8 limit 1) as ss3;
--
-- check a case where we formerly generated invalid parameterized paths
--
begin;
--Testcase 630:
CREATE FOREIGN TABLE t (a int options (key 'true')) SERVER sqlite_svr;
--Testcase 631:
explain (costs off)
select 1 from t t1
join lateral (select t1.a from (select 1) foo offset 0) as s1 on true
join
(select 1 from t t2
inner join (t t3
left join (t t4 left join t t5 on t4.a = 1)
on t3.a = t4.a)
on false
where t3.a = coalesce(t5.a,1)) as s2
on true;
rollback;
--
-- check a case in which a PlaceHolderVar forces join order
--
--Testcase 225:
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;
--Testcase 226:
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)
--
--Testcase 227:
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));
--Testcase 228:
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
--
--Testcase 229:
explain (costs off)
select * from int4_tbl a left join tenk1 b on f1 = unique2 where f1 = 0;
--Testcase 230:
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
--
--Testcase 518:
set enable_hashjoin to off;
--Testcase 519:
set enable_nestloop to off;
--Testcase 231:
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;
--Testcase 232:
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;
--Testcase 520:
reset enable_hashjoin;
--Testcase 521:
reset enable_nestloop;
--
-- test join strength reduction with a SubPlan providing the proof
--
--Testcase 581:
explain (costs off)
select a.unique1, b.unique2
from onek a left join onek b on a.unique1 = b.unique2
where (b.unique2, random() > 0) = any (select q1, random() > 0 from int8_tbl c where c.q1 < b.unique1);
--Testcase 582:
select a.unique1, b.unique2
from onek a left join onek b on a.unique1 = b.unique2
where (b.unique2, random() > 0) = any (select q1, random() > 0 from int8_tbl c where c.q1 < b.unique1);
--
-- test full-join strength reduction
--
--Testcase 583:
explain (costs off)
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42;
--Testcase 584:
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42;
--Testcase 585:
explain (costs off)
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where b.unique2 = 43;
--Testcase 586:
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where b.unique2 = 43;
--Testcase 587:
explain (costs off)
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42 and b.unique2 = 42;
--Testcase 588:
select a.unique1, b.unique2
from onek a full join onek b on a.unique1 = b.unique2
where a.unique1 = 42 and b.unique2 = 42;
--
-- test result-RTE removal underneath a full join
--
--Testcase 589:
explain (costs off)
select * from
(select * from int8_tbl i81 join (values(123,2)) v(v1,v2) on q2=v1) ss1
full join
(select * from (values(456,2)) w(v1,v2) join int8_tbl i82 on q2=v1) ss2
on true;
--Testcase 590:
select * from
(select * from int8_tbl i81 join (values(123,2)) v(v1,v2) on q2=v1) ss1
full join
(select * from (values(456,2)) w(v1,v2) join int8_tbl i82 on q2=v1) ss2
on true;
--
-- test join removal
--
begin;
--Testcase 444:
CREATE FOREIGN TABLE a3 (id int OPTIONS (key 'true'), b_id int) SERVER sqlite_svr;
--Testcase 445:
CREATE FOREIGN TABLE b3 (id int OPTIONS (key 'true'), c_id int) SERVER sqlite_svr;
--Testcase 446:
CREATE FOREIGN TABLE c3 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 447:
CREATE FOREIGN TABLE d3 (a int, b int) SERVER sqlite_svr;
--Testcase 233:
INSERT INTO a3 VALUES (0, 0), (1, NULL);
--Testcase 234:
INSERT INTO b3 VALUES (0, 0), (1, NULL);
--Testcase 235:
INSERT INTO c3 VALUES (0), (1);
--Testcase 236:
INSERT INTO d3 VALUES (1,3), (2,2), (3,1);
-- all three cases should be optimizable into a3 simple seqscan
--Testcase 237:
explain (costs off) SELECT a3.* FROM a3 LEFT JOIN b3 ON a3.b_id = b3.id;
--Testcase 238:
explain (costs off) SELECT b3.* FROM b3 LEFT JOIN c3 ON b3.c_id = c3.id;
--Testcase 239:
explain (costs off)
SELECT a3.* FROM a3 LEFT JOIN (b3 left join c3 on b3.c_id = c3.id)
ON (a3.b_id = b3.id);
-- check optimization of outer join within another special join
--Testcase 240:
explain (costs off)
select id from a3 where id in (
select b3.id from b3 left join c3 on b3.id = c3.id
);
-- check optimization with oddly-nested outer joins
--Testcase 591:
explain (costs off)
select a31.id from
(a3 a31 left join a3 a32 on true)
left join
(a3 a33 left join a3 a34 on a33.id = a34.id)
on a32.id = a33.id;
--Testcase 592:
explain (costs off)
select a31.id from
(a3 a31 left join a3 a32 on a31.id = a32.id)
left join
(a3 a33 left join a3 a34 on a33.id = a34.id)
on a32.id = a33.id;
--Testcase 593:
explain (costs off)
select 1 from a3 t1
left join a3 t2 on true
inner join a3 t3 on true
left join a3 t4 on t2.id = t4.id and t2.id = t3.id;
-- another example (bug #17781)
--Testcase 594:
explain (costs off)
select ss1.f1
from int4_tbl as t1
left join (int4_tbl as t2
right join int4_tbl as t3 on null
left join (int4_tbl as t4
right join int8_tbl as t5 on null)
on t2.f1 = t4.f1
left join ((select null as f1 from int4_tbl as t6) as ss1
inner join int8_tbl as t7 on null)
on t5.q1 = t7.q2)
on false;
-- variant with Var rather than PHV coming from t6
--Testcase 595:
explain (costs off)
select ss1.f1
from int4_tbl as t1
left join (int4_tbl as t2
right join int4_tbl as t3 on null
left join (int4_tbl as t4
right join int8_tbl as t5 on null)
on t2.f1 = t4.f1
left join ((select f1 from int4_tbl as t6) as ss1
inner join int8_tbl as t7 on null)
on t5.q1 = t7.q2)
on false;
-- per further discussion of bug #17781
--Testcase 596:
explain (costs off)
select ss1.x
from (select f1/2 as x from int4_tbl i4 left join a3 on a3.id = i4.f1) ss1
right join int8_tbl i8 on true
where current_user is not null; -- this is to add a Result node
-- and further discussion of bug #17781
--Testcase 597:
explain (costs off)
select *
from int8_tbl t1
left join (int8_tbl t2 left join onek t3 on t2.q1 > t3.unique1)
on t1.q2 = t2.q2
left join onek t4
on t2.q2 < t3.unique2;
-- More tests of correct placement of pseudoconstant quals
-- simple constant-false condition
--Testcase 598:
explain (costs off)
select * from int8_tbl t1 left join
(int8_tbl t2 inner join int8_tbl t3 on false
left join int8_tbl t4 on t2.q2 = t4.q2)
on t1.q1 = t2.q1;
-- deduce constant-false from an EquivalenceClass
--Testcase 599:
explain (costs off)
select * from int8_tbl t1 left join
(int8_tbl t2 inner join int8_tbl t3 on (t2.q1-t3.q2) = 0 and (t2.q1-t3.q2) = 1
left join int8_tbl t4 on t2.q2 = t4.q2)
on t1.q1 = t2.q1;
-- pseudoconstant based on an outer-level Param
--Testcase 600:
explain (costs off)
select exists(
select * from int8_tbl t1 left join
(int8_tbl t2 inner join int8_tbl t3 on x0.f1 = 1
left join int8_tbl t4 on t2.q2 = t4.q2)
on t1.q1 = t2.q1
) from int4_tbl x0;
-- check that join removal works for a left join when joining a subquery
-- that is guaranteed to be unique by its GROUP BY clause
--Testcase 241:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id and d3.b = s.c_id;
-- similarly, but keying off a DISTINCT clause
--Testcase 242:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id and d3.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 b3.id is a
-- primary key and so drop b3.c_id from the GROUP BY of the resulting plan;
-- but this happens too late for join removal in the outer plan level.)
--Testcase 243:
explain (costs off)
select d3.* from d3 left join (select * from b3 group by b3.id, b3.c_id) s
on d3.a = s.id;
-- similarly, but keying off a DISTINCT clause
--Testcase 244:
explain (costs off)
select d3.* from d3 left join (select distinct * from b3) s
on d3.a = s.id;
-- join removal is not possible here
--Testcase 601:
explain (costs off)
select 1 from a3 t1
left join (a3 t2 left join a3 t3 on t2.id = 1) on t2.id = 1;
-- check join removal works when uniqueness of the join condition is enforced
-- by a UNION
--Testcase 245:
explain (costs off)
select d3.* from d3 left join (select id from a3 union select id from b3) s
on d3.a = s.id;
-- check join removal with a cross-type comparison operator
--Testcase 246:
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
--Testcase 247:
explain (costs off)
select 1 from (select a3.id FROM a3 left join b3 on a3.b_id = b3.id) q,
lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
-- check join removal within RHS of an outer join
--Testcase 602:
explain (costs off)
select c3.id, ss.a from c3
left join (select d3.a from onerow, d3 left join b3 on d3.a = b3.id) ss
on c3.id = ss.a;
--Testcase 603:
CREATE TEMP TABLE parted_b (id int PRIMARY KEY) partition by range(id);
--Testcase 604:
CREATE TEMP TABLE parted_b1 partition of parted_b for values from (0) to (10);
-- test join removals on a partitioned table
--Testcase 605:
explain (costs off)
select a3.* from a3 left join parted_b pb on a3.b_id = pb.id;
rollback;
--Testcase 448:
create foreign table parent (k int options (key 'true'), pd int) server sqlite_svr;
--Testcase 449:
create foreign table child (k int options (key 'true'), cd int) server sqlite_svr;
--Testcase 248:
insert into parent values (1, 10), (2, 20), (3, 30);
--Testcase 249:
insert into child values (1, 100), (4, 400);
-- this case is optimizable
--Testcase 250:
select p.* from parent p left join child c on (p.k = c.k);
--Testcase 251:
explain (costs off)
select p.* from parent p left join child c on (p.k = c.k);
-- this case is not
--Testcase 252:
select p.*, linked from parent p
left join (select c.*, true as linked from child c) as ss
on (p.k = ss.k);
--Testcase 253:
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
--Testcase 254:
select p.* from
parent p left join child c on (p.k = c.k)
where p.k = 1 and p.k = 2;
--Testcase 255:
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;
--Testcase 256:
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;
--Testcase 257:
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;
--Testcase 450:
CREATE FOREIGN TABLE a4 (id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 451:
CREATE FOREIGN TABLE b4 (id int OPTIONS (key 'true'), a_id int) SERVER sqlite_svr;
--Testcase 258:
INSERT INTO a4 VALUES (0), (1);
--Testcase 259:
INSERT INTO b4 VALUES (0, 0), (1, NULL);
--Testcase 260:
SELECT * FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
--Testcase 261:
SELECT b4.* FROM b4 LEFT JOIN a4 ON (b4.a_id = a4.id) WHERE (a4.id IS NULL OR a4.id > 0);
rollback;
-- another join removal bug: this is not optimizable, either
begin;
--Testcase 452:
create foreign table innertab (id int8 options (key 'true'), dat1 int8) server sqlite_svr;
--Testcase 262:
insert into innertab values(123, 42);
--Testcase 263:
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;
-- join removal bug #17769: can't remove if there's a pushed-down reference
--Testcase 606:
EXPLAIN (COSTS OFF)
SELECT q2 FROM
(SELECT *
FROM int8_tbl LEFT JOIN innertab ON q2 = id) ss
WHERE COALESCE(dat1, 0) = q1;
-- join removal bug #17773: otherwise-removable PHV appears in a qual condition
--Testcase 607:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT q2 FROM
(SELECT q2, 'constant'::text AS x
FROM int8_tbl LEFT JOIN innertab ON q2 = id) ss
RIGHT JOIN int4_tbl ON NULL
WHERE x >= x;
-- join removal bug #17786: check that OR conditions are cleaned up
--Testcase 608:
EXPLAIN (COSTS OFF)
SELECT f1, x
FROM int4_tbl
JOIN ((SELECT 42 AS x FROM int8_tbl LEFT JOIN innertab ON q1 = id) AS ss1
RIGHT JOIN tenk1 ON NULL)
ON tenk1.unique1 = ss1.x OR tenk1.unique2 = ss1.x;
rollback;
-- another join removal bug: we must clean up correctly when removing a PHV
begin;
--Testcase 453:
create foreign table uniquetbl (f1 text) server sqlite_svr;
--Testcase 264:
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;
--Testcase 265:
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;
--Testcase 266:
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;
-- another join removal bug: we must clean up EquivalenceClasses too
begin;
--Testcase 609:
create temp table t (a int unique);
--Testcase 610:
insert into t values (1);
--Testcase 611:
explain (costs off)
select 1
from t t1
left join (select 2 as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
where t1.a = s.c;
--Testcase 612:
select 1
from t t1
left join (select 2 as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
where t1.a = s.c;
rollback;
-- test cases where we can remove a join, but not a PHV computed at it
begin;
--Testcase 613:
create temp table t (a int unique, b int);
--Testcase 614:
insert into t values (1,1), (2,2);
--Testcase 615:
explain (costs off)
select 1
from t t1
left join (select t2.a, 1 as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
left join t t4 on true
where s.a < s.c;
--Testcase 616:
explain (costs off)
select t1.a, s.*
from t t1
left join lateral (select t2.a, coalesce(t1.a, 1) as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
left join t t4 on true
where s.a < s.c;
--Testcase 617:
select t1.a, s.*
from t t1
left join lateral (select t2.a, coalesce(t1.a, 1) as c
from t t2 left join t t3 on t2.a = t3.a) s
on true
left join t t4 on true
where s.a < s.c;
rollback;
-- test case to expose miscomputation of required relid set for a PHV
--Testcase 522:
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;
--Testcase 523:
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
--Testcase 267:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = f1; -- error
--Testcase 268:
select * from
int8_tbl x join (int4_tbl x cross join int4_tbl y) j on q1 = y.f1; -- error
--Testcase 269:
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
--
--Testcase 270:
select t1.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t1" suggestion
--Testcase 271:
select t2.uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, prefer "t2" suggestion
--Testcase 272:
select uunique1 from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, suggest both at once
--Testcase 618:
select ctid from
tenk1 t1 join tenk2 t2 on t1.two = t2.two; -- error, need qualification
--
-- Take care to reference the correct RTE
--
--Testcase 454:
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 bug in rangetable flattening
--Testcase 619:
explain (verbose, costs off)
select 1 from
(select * from int8_tbl where q1 <> (select 42) offset 0) ss
where false;
--
-- Test LATERAL
--
--Testcase 273:
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 274:
explain (costs off)
select unique2, x.*
from tenk1 a, lateral (select * from int4_tbl b where f1 = a.unique1) x;
--Testcase 275:
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 276:
explain (costs off)
select unique2, x.*
from int4_tbl x, lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 277:
explain (costs off)
select unique2, x.*
from int4_tbl x cross join lateral (select unique2 from tenk1 where f1 = unique1) ss;
--Testcase 278:
select unique2, x.*
from int4_tbl x left join lateral (select unique1, unique2 from tenk1 where f1 = unique1) ss on true;
--Testcase 279:
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
--Testcase 280:
select *, (select r from (select q1 as q2) x, (select q2 as r) y) from int8_tbl;
--Testcase 281:
select *, (select r from (select q1 as q2) x, lateral (select q2 as r) y) from int8_tbl;
-- lateral with function in FROM
--Testcase 282:
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 283:
explain (costs off)
select count(*) from tenk1 a, lateral generate_series(1,two) g;
--Testcase 284:
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
--Testcase 285:
explain (costs off)
select count(*) from tenk1 a, generate_series(1,two) g;
-- lateral with UNION ALL subselect
--Testcase 286:
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;
--Testcase 287:
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
--Testcase 288:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1)) ss(x) on b.unique2 = ss.x;
--Testcase 289:
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
--Testcase 290:
explain (costs off)
select count(*) from tenk1 a,
tenk1 b join lateral (values(a.unique1),(-1)) ss(x) on b.unique2 = ss.x;
--Testcase 291:
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
--Testcase 292:
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;
--Testcase 293:
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
--Testcase 294:
select * from (select f1/2 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (select x) ss2(y);
--Testcase 295:
select * from (select f1 as x from int4_tbl) ss1 join int4_tbl i4 on x = f1,
lateral (values(x)) ss2(y);
--Testcase 296:
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
--Testcase 297:
select * from (values(1)) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 298:
select * from (select f1/1000000000 from int4_tbl) x(lb),
lateral generate_series(lb,4) x4;
--Testcase 299:
select * from (values(1)) x(lb),
lateral (values(lb)) y(lbcopy);
--Testcase 300:
select * from (values(1)) x(lb),
lateral (select lb from int4_tbl) y(lbcopy);
--Testcase 301:
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);
--Testcase 302:
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);
--Testcase 303:
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);
--Testcase 304:
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);
--Testcase 305:
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);
--Testcase 307:
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);
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 455:
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;
--Testcase 456:
select * from
int8_tbl a left join
lateral (select *, a.q2 as x from int8_tbl b) ss on a.q2 = ss.q1;
--Testcase 457:
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;
--Testcase 458:
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
--Testcase 308:
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;
--Testcase 309:
select * from int4_tbl i left join
lateral (select * from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 310:
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;
--Testcase 311:
select * from int4_tbl i left join
lateral (select coalesce(i) from int2_tbl j where i.f1 = j.f1) k on true;
--Testcase 312:
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;
--Testcase 313:
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
-- Error when using sub-query with multi instances of table, this issue is fixed on PostgreSQL-12
--Testcase 459:
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;
--Testcase 460:
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
--Testcase 461:
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;
-- another case requiring nested PlaceHolderVars
--Testcase 635:
explain (verbose, costs off)
select * from
(select 0 as val0 FROM int8_tbl LIMIT 1) as ss0
left join (select 1 as val FROM int8_tbl LIMIT 1) as ss1 on true
left join lateral (select ss1.val as val_filtered where false) as ss2 on true;
--Testcase 636:
select * from
(select 0 as val0 FROM int8_tbl LIMIT 1) as ss0
left join (select 1 as val FROM int8_tbl LIMIT 1) as ss1 on true
left join lateral (select ss1.val as val_filtered where false) as ss2 on true;
-- case that breaks the old ph_may_need optimization
--Testcase 462:
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)
--Testcase 463:
delete from sub_tbl;
--Testcase 464:
insert into sub_tbl values (1, 2, 3, 4, 5);
--Testcase 465:
explain (verbose, costs off)
select * from
(select key1 as x from sub_tbl offset 0) x cross join (select key3 as y from sub_tbl offset 0) y
left join lateral (
select * from (select key5 as z from sub_tbl offset 0) z where z.z = x.x
) zz on zz.z = y.y;
-- a new postponed-quals issue (bug #17768)
--Testcase 620:
explain (costs off)
select * from int4_tbl t1,
lateral (select * from int4_tbl t2 inner join int4_tbl t3 on t1.f1 = 1
inner join (int4_tbl t4 left join int4_tbl t5 on true) on true) ss;
-- check dummy rels with lateral references (bug #15694)
--Testcase 466:
explain (verbose, costs off)
select * from int8_tbl i8 left join lateral
(select *, i8.q2 from int4_tbl where false) ss on true;
--Testcase 467:
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
--Testcase 468:
select * from
((select key3 as v from sub_tbl) union all (select key5 as v from sub_tbl)) as q1
cross join lateral
((select * from
((select key6 as v from sub_tbl) union all (select value1 as v from sub_tbl)) as q3)
union all
(select q1.v)
) as q2;
-- check the number of columns specified
--Testcase 539:
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
--Testcase 314:
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;
--Testcase 315:
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)
--Testcase 316:
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, random() > 0) = any (select q2, random() > 0 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;
--Testcase 317:
select * from (values (0), (1)) v(id),
lateral (select * from int8_tbl t1,
lateral (select * from
(select * from int8_tbl t2
where (q1, random() > 0) = any (select q2, random() > 0 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
--Testcase 318:
select f1,g from int4_tbl a, (select f1 as g) ss;
--Testcase 319:
select f1,g from int4_tbl a, (select a.f1 as g) ss;
--Testcase 320:
select f1,g from int4_tbl a cross join (select f1 as g) ss;
--Testcase 321:
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
--Testcase 322:
select f1,g from int4_tbl a right join lateral generate_series(0, a.f1) g on true;
--Testcase 323:
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
--Testcase 324:
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
--Testcase 325:
select 1 from tenk1 a, lateral (select max(a.unique1) from int4_tbl b) ss;
-- check behavior of LATERAL in UPDATE/DELETE
--Testcase 469:
create temp table xx1 as select f1 as x1, -f1 as x2 from int4_tbl;
-- error, can't do this:
--Testcase 326:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = x1) ss;
--Testcase 327:
update xx1 set x2 = f1 from (select * from int4_tbl where f1 = xx1.x1) ss;
-- can't do it even with LATERAL:
--Testcase 328:
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:
--Testcase 329:
update xx1 set x2 = f1 from xx1, lateral (select * from int4_tbl where f1 = x1) ss;
-- also errors:
--Testcase 330:
delete from xx1 using (select * from int4_tbl where f1 = x1) ss;
--Testcase 331:
delete from xx1 using (select * from int4_tbl where f1 = xx1.x1) ss;
--Testcase 332:
delete from xx1 using lateral (select * from int4_tbl where f1 = x1) ss;
-- Skip this test, sqlite fdw does not support to create partition table
-- 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;
--Testcase 524:
create table fkest (x integer, x10 integer, x10b integer, x100 integer);
--Testcase 525:
insert into fkest select x, x/10, x/10, x/100 from generate_series(1,1000) x;
--Testcase 526:
create unique index on fkest(x, x10, x100);
analyze fkest;
--Testcase 527:
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;
--Testcase 528:
alter table fkest add constraint fk
foreign key (x, x10b, x100) references fkest (x, x10, x100);
--Testcase 529:
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;
--Testcase 470:
create foreign table fkest (a int options (key 'true'), b int options (key 'true'), c int) server sqlite_svr;
--Testcase 471:
create foreign table fkest1 (a int options (key 'true'), b int options (key 'true')) server sqlite_svr;
--Testcase 333:
insert into fkest select x/10, x%10, x from generate_series(1,1000) x;
--Testcase 334:
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;
--Testcase 335:
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
--
--Testcase 472:
create foreign table j11 (id int options (key 'true')) server sqlite_svr;
--Testcase 473:
create foreign table j21 (id int options (key 'true')) server sqlite_svr;
--Testcase 474:
create foreign table j31 (id int) server sqlite_svr;
--Testcase 336:
insert into j11 values(1),(2),(3);
--Testcase 337:
insert into j21 values(1),(2),(3);
--Testcase 338:
insert into j31 values(1),(1);
-- ensure join is properly marked as unique
--Testcase 339:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id = j21.id;
-- ensure join is not unique when not an equi-join
--Testcase 340:
explain (verbose, costs off)
select * from j11 inner join j21 on j11.id > j21.id;
-- ensure non-unique rel is not chosen as inner
--Testcase 341:
explain (verbose, costs off)
select * from j11 inner join j31 on j11.id = j31.id;
-- ensure left join is marked as unique
--Testcase 342:
explain (verbose, costs off)
select * from j11 left join j21 on j11.id = j21.id;
-- ensure right join is marked as unique
--Testcase 343:
explain (verbose, costs off)
select * from j11 right join j21 on j11.id = j21.id;
-- ensure full join is marked as unique
--Testcase 344:
explain (verbose, costs off)
select * from j11 full join j21 on j11.id = j21.id;
-- a clauseless (cross) join can't be unique
--Testcase 345:
explain (verbose, costs off)
select * from j11 cross join j21;
-- ensure a natural join is marked as unique
--Testcase 346:
explain (verbose, costs off)
select * from j11 natural join j21;
-- ensure a distinct clause allows the inner to become unique
--Testcase 347:
explain (verbose, costs off)
select * from j11
inner join (select distinct id from j31) j31 on j11.id = j31.id;
-- ensure group by clause allows the inner to become unique
--Testcase 348:
explain (verbose, costs off)
select * from j11
inner join (select id from j31 group by id) j31 on j11.id = j31.id;
--drop table j1;
--drop table j2;
--drop table j3;
-- test more complex permutations of unique joins
--Testcase 475:
create foreign table j12 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 476:
create foreign table j22 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 477:
create foreign table j32 (id1 int options (key 'true'), id2 int options (key 'true')) server sqlite_svr;
--Testcase 349:
insert into j12 values(1,1),(1,2);
--Testcase 350:
insert into j22 values(1,1);
--Testcase 351:
insert into j32 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
--Testcase 352:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1;
-- ensure proper unique detection with multiple join quals
--Testcase 353:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2;
-- ensure we don't detect the join to be unique when quals are not part of the
-- join condition
--Testcase 354:
explain (verbose, costs off)
select * from j12
inner join j22 on j12.id1 = j22.id1 where j12.id2 = 1;
-- as above, but for left joins.
--Testcase 355:
explain (verbose, costs off)
select * from j12
left join j22 on j12.id1 = j22.id1 where j12.id2 = 1;
-- create unique index command does not work with foreign table
-- Add these normal tables for it.
--Testcase 624:
create table j1 (id1 int, id2 int, primary key(id1,id2));
--Testcase 625:
create table j2 (id1 int, id2 int, primary key(id1,id2));
--Testcase 626:
insert into j1 values(1,1),(1,2);
--Testcase 627:
insert into j2 values(1,1);
analyze j1;
analyze j2;
--Testcase 621:
create unique index j1_id2_idx on j1(id2) where id2 is not null;
-- ensure we don't use a partial unique index as unique proofs
--Testcase 622:
explain (verbose, costs off)
select * from j1
inner join j2 on j1.id2 = j2.id2;
--Testcase 623:
drop index j1_id2_idx;
--Testcase 628:
drop table j1;
--Testcase 629:
drop table j2;
-- 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.
--Testcase 530:
set enable_nestloop to 0;
--Testcase 531:
set enable_hashjoin to 0;
--Testcase 532:
set enable_sort to 0;
-- skip, cannot create index on foreign table
-- 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
--Testcase 478:
insert into j22 values(1,2);
--analyze j2;
--Testcase 356:
explain (costs off) select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
--Testcase 357:
select * from j12 j12
inner join j12 j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1;
-- Exercise array keys mark/restore B-Tree code
--Testcase 479:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
--Testcase 480:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 = any (array[1]);
-- Exercise array keys "find extreme element" B-Tree code
--Testcase 481:
explain (costs off) select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 482:
select * from j12
inner join j22 on j12.id1 = j22.id1 and j12.id2 = j22.id2
where j12.id1 % 1000 = 1 and j22.id1 % 1000 = 1 and j22.id1 >= any (array[1,5]);
--Testcase 533:
reset enable_nestloop;
--Testcase 534:
reset enable_hashjoin;
--Testcase 535:
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
--Testcase 358:
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
--Testcase 484:
create table j3 as select unique1, tenthous from onek;
vacuum analyze j3;
--Testcase 485:
create unique index on j3(unique1, tenthous);
--Testcase 359:
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;
--Testcase 486:
drop table j3;
-- sqlite_fdw is not supported WITH fillfactor, INDEX, VACUM, ANALYZE with foreign table.
-- Exercise the "skip fetch" Bitmap Heap Scan optimization when candidate
-- tuples are discarded. This may occur when:
-- 1. A join doesn't require all inner tuples to be scanned for each outer
-- tuple, and
-- 2. The inner side is scanned using a bitmap heap scan, and
-- 3. The bitmap heap scan is eligible for the "skip fetch" optimization.
-- This optimization is usable when no data from the underlying table is
-- needed. Use a temp table so it is only visible to this backend and
-- vacuum may reliably mark all blocks in the table all visible in the
-- visibility map.
-- CREATE TEMP TABLE skip_fetch (a INT, b INT) WITH (fillfactor=10);
-- INSERT INTO skip_fetch SELECT i % 3, i FROM generate_series(0,30) i;
-- CREATE INDEX ON skip_fetch(a);
-- VACUUM (ANALYZE) skip_fetch;
-- SET enable_indexonlyscan = off;
-- SET enable_seqscan = off;
-- EXPLAIN (COSTS OFF)
-- SELECT t1.a FROM skip_fetch t1 LEFT JOIN skip_fetch t2 ON t2.a = 1 WHERE t2.a IS NULL;
-- SELECT t1.a FROM skip_fetch t1 LEFT JOIN skip_fetch t2 ON t2.a = 1 WHERE t2.a IS NULL;
-- RESET enable_indexonlyscan;
-- RESET enable_seqscan;
--Testcase 656:
DELETE FROM INT4_TBL;
--Testcase 657:
DELETE FROM FLOAT8_TBL;
--Testcase 658:
DELETE FROM INT8_TBL;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 487:
DROP SERVER sqlite_svr;
--Testcase 488:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/limit.sql
================================================
--
-- LIMIT
-- Check the LIMIT/OFFSET feature of SELECT
--
--Testcase 27:
CREATE EXTENSION sqlite_fdw;
--Testcase 28:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 29:
CREATE FOREIGN TABLE onek(
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 30:
CREATE FOREIGN TABLE int8_tbl(q1 int8 OPTIONS (key 'true'), q2 int8) SERVER sqlite_svr;
--Testcase 105:
INSERT INTO int8_tbl VALUES(' 123 ',' 456');
--Testcase 106:
INSERT INTO int8_tbl VALUES('123 ','4567890123456789');
--Testcase 107:
INSERT INTO int8_tbl VALUES('4567890123456789','123');
--Testcase 108:
INSERT INTO int8_tbl VALUES(+4567890123456789,'4567890123456789');
--Testcase 109:
INSERT INTO int8_tbl VALUES('+4567890123456789','-4567890123456789');
--Testcase 31:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 32:
CREATE FOREIGN TABLE tenk1 (
unique1 int4 OPTIONS (key 'true'),
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
) SERVER sqlite_svr;
--Testcase 88:
CREATE TABLE parent_table (
unique1 int4 PRIMARY KEY,
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
);
--Testcase 89:
CREATE FOREIGN table inherited_table ()
INHERITS (parent_table)
SERVER sqlite_svr options (table 'tenk1');
--Testcase 1:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
ORDER BY unique1 LIMIT 2;
--Testcase 2:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60
ORDER BY unique1 LIMIT 5;
--Testcase 3:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 60 AND unique1 < 63
ORDER BY unique1 LIMIT 5;
--Testcase 4:
SELECT ''::text AS three, unique1, unique2, stringu1
FROM onek WHERE unique1 > 100
ORDER BY unique1 LIMIT 3 OFFSET 20;
--Testcase 5:
SELECT ''::text AS zero, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 8 OFFSET 99;
--Testcase 6:
SELECT ''::text AS eleven, unique1, unique2, stringu1
FROM onek WHERE unique1 < 50
ORDER BY unique1 DESC LIMIT 20 OFFSET 39;
--Testcase 7:
SELECT ''::text AS ten, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990;
--Testcase 8:
SELECT ''::text AS five, unique1, unique2, stringu1
FROM onek
ORDER BY unique1 OFFSET 990 LIMIT 5;
--Testcase 9:
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:
--Testcase 10:
select * from int8_tbl limit (case when random() < 0.5 then null::bigint end);
--Testcase 11:
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
begin;
declare c1 scroll cursor for select * from int8_tbl order by q1 limit 10;
--Testcase 12:
fetch all in c1;
--Testcase 13:
fetch 1 in c1;
--Testcase 14:
fetch backward 1 in c1;
--Testcase 33:
fetch backward all in c1;
--Testcase 34:
fetch backward 1 in c1;
--Testcase 35:
fetch all in c1;
declare c2 scroll cursor for select * from int8_tbl limit 3;
--Testcase 36:
fetch all in c2;
--Testcase 37:
fetch 1 in c2;
--Testcase 38:
fetch backward 1 in c2;
--Testcase 39:
fetch backward all in c2;
--Testcase 40:
fetch backward 1 in c2;
--Testcase 41:
fetch all in c2;
declare c3 scroll cursor for select * from int8_tbl offset 3;
--Testcase 42:
fetch all in c3;
--Testcase 43:
fetch 1 in c3;
--Testcase 44:
fetch backward 1 in c3;
--Testcase 45:
fetch backward all in c3;
--Testcase 46:
fetch backward 1 in c3;
--Testcase 47:
fetch all in c3;
declare c4 scroll cursor for select * from int8_tbl offset 10;
--Testcase 48:
fetch all in c4;
--Testcase 49:
fetch 1 in c4;
--Testcase 50:
fetch backward 1 in c4;
--Testcase 51:
fetch backward all in c4;
--Testcase 52:
fetch backward 1 in c4;
--Testcase 53:
fetch all in c4;
declare c5 scroll cursor for select * from int8_tbl order by q1 fetch first 2 rows with ties;
--Testcase 54:
fetch all in c5;
--Testcase 55:
fetch 1 in c5;
--Testcase 56:
fetch backward 1 in c5;
--Testcase 57:
fetch backward 1 in c5;
--Testcase 58:
fetch all in c5;
--Testcase 59:
fetch backward all in c5;
--Testcase 60:
fetch all in c5;
--Testcase 61:
fetch backward all in c5;
rollback;
-- Stress test for variable LIMIT in conjunction with bounded-heap sorting
--Testcase 62:
DELETE FROM INT8_TMP;
--Testcase 63:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series(1,10) q1;
--Testcase 64:
SELECT
(SELECT s.q1
FROM (VALUES (1)) AS x,
(SELECT q1 FROM INT8_TMP as n
ORDER BY q1 LIMIT 1 OFFSET s.q1-1) AS y) AS z
FROM INT8_TMP AS s;
--
-- Test behavior of volatile and set-returning functions in conjunction
-- with ORDER BY and LIMIT.
--
--Testcase 65:
create temp sequence testseq;
--Testcase 15:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 16:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10;
--Testcase 90:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 91:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 limit 10 offset 5;
--Testcase 17:
select currval('testseq');
--Testcase 92:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 93:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10;
--Testcase 94:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 95:
select unique1, unique2, nextval('testseq')
from tenk1 order by unique2 desc limit 10 offset 5;
--Testcase 96:
select currval('testseq');
--Testcase 18:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 19:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10;
--Testcase 97:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 98:
select unique1, unique2, nextval('testseq')
from tenk1 order by tenthous limit 10 offset 5;
--Testcase 20:
select currval('testseq');
-- test for limit and offset when querying table and foreign table inherited
--Testcase 99:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
--Testcase 100:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10;
-- when querying regular tables with inherited tables, only limit is pushed-down when no offset is specified
--Testcase 101:
explain (verbose, costs off)
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 102:
select unique1, unique2, nextval('testseq')
from parent_table order by tenthous limit 10 offset 5;
--Testcase 103:
select currval('testseq');
--Testcase 21:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 22:
select unique1, unique2, generate_series(1,10)
from tenk1 order by unique2 limit 7;
--Testcase 23:
explain (verbose, costs off)
select unique1, unique2, generate_series(1,10)
from tenk1 order by tenthous limit 7;
--Testcase 24:
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
--Testcase 66:
DELETE FROM INT8_TMP;
--Testcase 67:
INSERT INTO INT8_TMP VALUES (generate_series(0,2), generate_series((random()*.1)::int,2));
--Testcase 68:
explain (verbose, costs off)
select q1, q2 from int8_tmp;
--Testcase 69:
select q1, q2 from int8_tmp;
--Testcase 70:
explain (verbose, costs off)
select q1, q2 from int8_tmp order by q2 desc;
--Testcase 71:
select q1, q2 from int8_tmp order by q2 desc;
-- test for failure to set all aggregates' aggtranstype
--Testcase 25:
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;
--Testcase 26:
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
--
--Testcase 72:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW WITH TIES;
--Testcase 73:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST ROWS WITH TIES;
--Testcase 74:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES;
--Testcase 75:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 2 ROW ONLY;
-- SKIP LOCKED and WITH TIES are incompatible
--Testcase 104:
SELECT thousand
FROM onek WHERE thousand < 5
ORDER BY thousand FETCH FIRST 1 ROW WITH TIES FOR UPDATE SKIP LOCKED;
-- should fail
--Testcase 76:
SELECT ''::text AS two, unique1, unique2, stringu1
FROM onek WHERE unique1 > 50
FETCH FIRST 2 ROW WITH TIES;
-- test ruleutils
--Testcase 77:
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;
--Testcase 78:
\d+ limit_thousand_v_1
--Testcase 79:
CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY;
--Testcase 80:
\d+ limit_thousand_v_2
--Testcase 81:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS WITH TIES; -- fails
--Testcase 82:
CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES;
--Testcase 83:
\d+ limit_thousand_v_3
--Testcase 84:
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
--Testcase 85:
\d+ limit_thousand_v_4
-- leave these views
--Testcase 110:
DELETE FROM int8_tbl;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 86:
DROP SERVER sqlite_svr;
--Testcase 87:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/prepare.sql
================================================
-- Regression tests for prepareable statements. We query the content
-- of the pg_prepared_statements view as prepared statements are
-- created and removed.
--Testcase 26:
CREATE EXTENSION sqlite_fdw;
--Testcase 27:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 28:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 29:
CREATE FOREIGN TABLE road (
name text,
thepath path
) SERVER sqlite_svr;
--Testcase 30:
create foreign table road_tmp (a int, b int, id int options (key 'true')) server sqlite_svr;
--Testcase 31:
insert into road_tmp values (1, 2);
--Testcase 1:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
--Testcase 2:
PREPARE q1 AS SELECT a FROM road_tmp;
--Testcase 3:
EXECUTE q1;
--Testcase 4:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
-- should fail
--Testcase 5:
PREPARE q1 AS SELECT b FROM road_tmp;
-- should succeed
DEALLOCATE q1;
--Testcase 6:
PREPARE q1 AS SELECT b FROM road_tmp;
--Testcase 7:
EXECUTE q1;
--Testcase 8:
PREPARE q2 AS SELECT b FROM road_tmp;
--Testcase 9:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
-- sql92 syntax
DEALLOCATE PREPARE q1;
--Testcase 10:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
DEALLOCATE PREPARE q2;
-- the view should return the empty set again
--Testcase 11:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements;
-- parameterized queries
--Testcase 12:
PREPARE q2(text) AS
SELECT datname, datistemplate, datallowconn
FROM pg_database WHERE datname = $1;
--Testcase 13:
EXECUTE q2('postgres');
--Testcase 14:
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;
--Testcase 15:
EXECUTE q3('AAAAxx', 5::smallint, 10.5::float, false, 4::bigint);
-- too few params
--Testcase 16:
EXECUTE q3('bool');
-- too many params
--Testcase 17:
EXECUTE q3('bytea', 5::smallint, 10.5::float, false, 4::bigint, true);
-- wrong param types
--Testcase 18:
EXECUTE q3(5::smallint, 10.5::float, false, 4::bigint, 'bytea');
-- invalid type
--Testcase 19:
PREPARE q4(nonexistenttype) AS SELECT * FROM road WHERE name = $1;
-- create table as execute
--Testcase 20:
PREPARE q5(int, text) AS
SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2
ORDER BY unique1;
--Testcase 32:
CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA');
--Testcase 21:
SELECT * FROM q5_prep_results;
--Testcase 33:
CREATE TEMPORARY TABLE q5_prep_nodata AS EXECUTE q5(200, 'DTAAAA')
WITH NO DATA;
--Testcase 34:
SELECT * FROM q5_prep_nodata;
-- unknown or unspecified parameter types: should succeed
--Testcase 22:
PREPARE q6 AS
SELECT * FROM tenk1 WHERE unique1 = $1 AND stringu1 = $2;
--Testcase 23:
PREPARE q7(unknown) AS
SELECT * FROM road WHERE thepath = $1;
-- DML statements
PREPARE q8 AS
UPDATE tenk1 SET stringu1 = $2 WHERE unique1 = $1;
--Testcase 24:
SELECT name, statement, parameter_types, result_types FROM pg_prepared_statements
ORDER BY name;
-- test DEALLOCATE ALL;
DEALLOCATE ALL;
--Testcase 25:
SELECT name, statement, parameter_types FROM pg_prepared_statements
ORDER BY name;
--Testcase 35:
DROP FOREIGN TABLE tenk1;
--Testcase 36:
DROP FOREIGN TABLE road;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/select.sql
================================================
--
-- SELECT
--
--Testcase 43:
CREATE EXTENSION sqlite_fdw;
--Testcase 44:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 45:
CREATE FOREIGN 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
) SERVER sqlite_svr;
--Testcase 46:
CREATE FOREIGN TABLE onek2 (
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
) SERVER sqlite_svr;
--Testcase 47:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 73:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 74:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 75:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 76:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 77:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
--Testcase 48:
CREATE FOREIGN TABLE person (
name text,
age int4,
location point
) SERVER sqlite_svr;
-- btree index
-- awk '{if($1<10){print;}else{next;}}' onek.data | sort +0n -1
--
--Testcase 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
--
--Testcase 2:
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
--
--Testcase 3:
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
--
--Testcase 4:
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
--
--Testcase 5:
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
--
--Testcase 6:
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
--
--Testcase 7:
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
--
--Testcase 8:
SELECT onek2.* FROM onek2 WHERE onek2.unique1 < 10 order by onek2.unique1;
--
-- awk '{if($1<20){print $1,$14;}else{next;}}' onek.data | sort +0nr -1
--
--Testcase 9:
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
--
--Testcase 10:
SELECT onek2.unique1, onek2.stringu1 FROM onek2
WHERE onek2.unique1 > 980 ORDER BY onek2.unique1;
RESET enable_seqscan;
RESET enable_bitmapscan;
RESET enable_sort;
--
-- 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
--Testcase 12:
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
--
--Testcase 13:
SELECT p.name, p.age FROM person* p ORDER BY age using >, name;
--
-- Test some cases involving whole-row Var referencing a subquery
--
--Testcase 49:
select foo from (select 1 offset 0) as foo;
--Testcase 50:
select foo from (select null offset 0) as foo;
--Testcase 51:
select foo from (select 'xyzzy',1,null offset 0) as foo;
--
-- Test VALUES lists
--
--Testcase 14:
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 :-)
--Testcase 15:
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
--Testcase 16:
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
--Testcase 17:
VALUES (1,2), (3,4+4), (7,77.7);
--Testcase 52:
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
--
--Testcase 53:
CREATE FOREIGN TABLE foo (f1 int options (key 'true')) SERVER sqlite_svr;
--Testcase 18:
INSERT INTO foo VALUES (42),(3),(10),(7),(null),(null),(1);
--Testcase 19:
SELECT * FROM foo ORDER BY f1;
--Testcase 20:
SELECT * FROM foo ORDER BY f1 ASC; -- same thing
--Testcase 21:
SELECT * FROM foo ORDER BY f1 NULLS FIRST;
--Testcase 22:
SELECT * FROM foo ORDER BY f1 DESC;
--Testcase 23:
SELECT * FROM foo ORDER BY f1 DESC NULLS LAST;
-- Skip, cannot create index on foreign table
-- 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
--Testcase 24:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 25:
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- actually run the query with an analyze to use the partial index
--Testcase 54:
explain (costs off, analyze on, timing off, summary off)
select * from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 27:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
--Testcase 28:
select unique2 from onek2 where unique2 = 11 and stringu1 = 'ATAAAA';
-- partial index predicate implies clause, so no need for retest
--Testcase 29:
explain (costs off)
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 30:
select * from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 31:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 32:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
-- but if it's an update target, must retest anyway
--Testcase 33:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
--Testcase 34:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
-- partial index is not applicable
--Testcase 35:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'C';
--Testcase 36:
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;
--Testcase 37:
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
--Testcase 38:
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B';
RESET enable_indexscan;
-- check multi-index cases too
--Testcase 39:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 40:
select unique1, unique2 from onek2
where (unique2 = 11 or unique1 = 0) and stringu1 < 'B';
--Testcase 41:
explain (costs off)
select unique1, unique2 from onek2
where (unique2 = 11 and stringu1 < 'B') or unique1 = 0;
--Testcase 42:
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
--Testcase 55:
SELECT 1 AS x ORDER BY x;
-- But ORDER BY on a set-valued expression does
--Testcase 56:
create function sillysrf(int) returns setof int as
'values (1),(10),(2),($1)' language sql immutable;
--Testcase 57:
select sillysrf(42);
--Testcase 58:
select sillysrf(-1) order by 1;
--Testcase 59:
drop function sillysrf(int);
-- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict
-- (see bug #5084)
--Testcase 60:
select * from (values (2),(null),(1)) v(k) where k = k order by k;
--Testcase 61:
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.
--Testcase 62:
create table list_parted_tbl (a int,b int) partition by list (a);
--Testcase 63:
create table list_parted_tbl1 partition of list_parted_tbl
for values in (1) partition by list(b);
--Testcase 64:
explain (costs off) select * from list_parted_tbl;
--Testcase 65:
drop table list_parted_tbl;
--Testcase 78:
DELETE FROM INT8_TBL;
--Testcase 66:
DROP FOREIGN TABLE onek;
--Testcase 67:
DROP FOREIGN TABLE onek2;
--Testcase 68:
DROP FOREIGN TABLE int8_tbl;
--Testcase 69:
DROP FOREIGN TABLE person;
--Testcase 70:
DROP FOREIGN TABLE foo;
--Testcase 71:
DROP SERVER sqlite_svr;
--Testcase 72:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/select_having.sql
================================================
--
-- SELECT_HAVING
--
--Testcase 22:
CREATE EXTENSION sqlite_fdw;
--Testcase 23:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 24:
CREATE FOREIGN TABLE test_having(a int OPTIONS (key 'true'), b int, c char(8), d char) SERVER sqlite_svr;
-- load test data
--Testcase 1:
INSERT INTO test_having VALUES (0, 1, 'XXXX', 'A');
--Testcase 2:
INSERT INTO test_having VALUES (1, 2, 'AAAA', 'b');
--Testcase 3:
INSERT INTO test_having VALUES (2, 2, 'AAAA', 'c');
--Testcase 4:
INSERT INTO test_having VALUES (3, 3, 'BBBB', 'D');
--Testcase 5:
INSERT INTO test_having VALUES (4, 3, 'BBBB', 'e');
--Testcase 6:
INSERT INTO test_having VALUES (5, 3, 'bbbb', 'F');
--Testcase 7:
INSERT INTO test_having VALUES (6, 4, 'cccc', 'g');
--Testcase 8:
INSERT INTO test_having VALUES (7, 4, 'cccc', 'h');
--Testcase 9:
INSERT INTO test_having VALUES (8, 4, 'CCCC', 'I');
--Testcase 10:
INSERT INTO test_having VALUES (9, 4, 'CCCC', 'j');
--Testcase 11:
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
--Testcase 12:
SELECT b, c FROM test_having
GROUP BY b, c HAVING b = 3 ORDER BY b, c collate "en_US.utf8";
--Testcase 13:
SELECT lower(c), count(c) FROM test_having
GROUP BY lower(c) HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY lower(c);
--Testcase 14:
SELECT c, max(a) FROM test_having
GROUP BY c HAVING count(*) > 2 OR min(a) = max(a)
ORDER BY c collate "en_US.utf8";
-- test degenerate cases involving HAVING without GROUP BY
-- Per SQL spec, these should generate 0 or 1 row, even without aggregates
--Testcase 15:
SELECT min(a), max(a) FROM test_having HAVING min(a) = max(a);
--Testcase 16:
SELECT min(a), max(a) FROM test_having HAVING min(a) < max(a);
-- errors: ungrouped column references
--Testcase 17:
SELECT a FROM test_having HAVING min(a) < max(a);
--Testcase 18:
SELECT 1 AS one FROM test_having HAVING a > 1;
-- the really degenerate case: need not scan table at all
--Testcase 19:
SELECT 1 AS one FROM test_having HAVING 1 > 2;
--Testcase 20:
SELECT 1 AS one FROM test_having HAVING 1 < 2;
-- and just to prove that we aren't scanning the table:
--Testcase 21:
SELECT 1 AS one FROM test_having WHERE 1/a = 1 HAVING 1 < 2;
--Testcase 25:
DROP FOREIGN TABLE test_having;
--Testcase 26:
DROP SERVER sqlite_svr;
--Testcase 27:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/sqlite_fdw_post.sql
================================================
-- ===================================================================
-- create FDW objects
-- ===================================================================
--Testcase 483:
CREATE EXTENSION sqlite_fdw;
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr2 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
EXECUTE $$CREATE SERVER sqlite_svr3 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- SQLite FDW does not need User and User Mapping.
--Testcase 484:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 485:
-- CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 756:
-- CREATE USER MAPPING FOR public SERVER sqlite_svr3;
-- ===================================================================
-- create objects used through FDW sqlite server
-- ===================================================================
--Testcase 486:
CREATE SCHEMA "S 1";
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO "S 1";
--Testcase 1:
INSERT INTO "S 1"."T 1"
SELECT id,
id % 10,
to_char(id, 'FM00000'),
'1970-01-01'::timestamptz + ((id % 100) || ' days')::interval,
'1970-01-01'::timestamp + ((id % 100) || ' days')::interval,
id % 10,
id % 10,
'foo'
FROM generate_series(1, 1000) id;
--Testcase 2:
INSERT INTO "S 1"."T 2"
SELECT id,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 3:
INSERT INTO "S 1"."T 3"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 487:
DELETE FROM "S 1"."T 3" WHERE c1 % 2 != 0; -- delete for outer join tests
--Testcase 4:
INSERT INTO "S 1"."T 4"
SELECT id,
id + 1,
'AAA' || to_char(id, 'FM000')
FROM generate_series(1, 100) id;
--Testcase 488:
DELETE FROM "S 1"."T 4" WHERE c1 % 3 != 0; -- delete for outer join tests
/*ANALYZE "S 1"."T 1";
ANALYZE "S 1"."T 2";
ANALYZE "S 1"."T 3";
ANALYZE "S 1"."T 4";*/
-- ===================================================================
-- create foreign tables
-- ===================================================================
--Testcase 489:
CREATE FOREIGN TABLE ft1 (
c0 int,
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr;
--Testcase 757:
ALTER FOREIGN TABLE ft1 DROP COLUMN c0;
--Testcase 490:
CREATE FOREIGN TABLE ft2 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
cx int,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft2',
c8 text
) SERVER sqlite_svr;
--Testcase 758:
ALTER FOREIGN TABLE ft2 DROP COLUMN cx;
--Testcase 491:
CREATE FOREIGN TABLE ft4 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 3');
--Testcase 492:
CREATE FOREIGN TABLE ft5 (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr OPTIONS (table 'T 4');
--Testcase 493:
CREATE FOREIGN TABLE ft6 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr2 OPTIONS (table 'T 4');
--Testcase 759:
CREATE FOREIGN TABLE ft7 (
c1 int NOT NULL,
c2 int NOT NULL,
c3 text
) SERVER sqlite_svr3 OPTIONS (table 'T 4');
--Testcase 760:
ALTER FOREIGN TABLE ft1 OPTIONS (table 'T 1');
--Testcase 761:
ALTER FOREIGN TABLE ft2 OPTIONS (table 'T 1');
--Testcase 762:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 763:
ALTER FOREIGN TABLE ft2 ALTER COLUMN c1 OPTIONS (column_name 'C 1');
--Testcase 5:
\det+
-- Test that alteration of server options causes reconnection
-- Remote's errors might be non-English, so hide them to ensure stable results
\set VERBOSITY terse
--Testcase 6:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work
--Testcase 764:
ALTER SERVER sqlite_svr OPTIONS (SET database 'no such database');
--Testcase 7:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should fail
DO $d$
BEGIN
EXECUTE $$ALTER SERVER sqlite_svr
OPTIONS (SET database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
--Testcase 8:
SELECT c3, c4 FROM ft1 ORDER BY c3, c1 LIMIT 1; -- should work again
\set VERBOSITY default
-- Now we should be able to run ANALYZE.
-- To exercise multiple code paths, we use local stats on ft1
-- and remote-estimate mode on ft2.
--ANALYZE ft1;
--ALTER FOREIGN TABLE ft2 OPTIONS (use_remote_estimate 'true');
-- ===================================================================
-- test error case for create publication on foreign table
-- ===================================================================
--Testcase 955:
CREATE PUBLICATION testpub_ftbl FOR TABLE ft1; -- should fail
-- ===================================================================
-- simple queries
-- ===================================================================
-- single table without alias
--Testcase 9:
EXPLAIN (COSTS OFF) SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
--Testcase 10:
SELECT * FROM ft1 ORDER BY c3, c1 OFFSET 100 LIMIT 10;
-- single table with alias - also test that tableoid sort is not pushed to remote side
--Testcase 11:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
--Testcase 12:
SELECT * FROM ft1 t1 ORDER BY t1.c3, t1.c1, t1.tableoid OFFSET 100 LIMIT 10;
-- whole-row reference
--Testcase 13:
EXPLAIN (VERBOSE, COSTS OFF) SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 14:
SELECT t1 FROM ft1 t1 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- empty result
--Testcase 15:
SELECT * FROM ft1 WHERE false;
-- with WHERE clause
--Testcase 16:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
--Testcase 17:
SELECT * FROM ft1 t1 WHERE t1.c1 = 101 AND t1.c6 = '1' AND t1.c7 >= '1';
-- with FOR UPDATE/SHARE
--Testcase 18:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 19:
SELECT * FROM ft1 t1 WHERE c1 = 101 FOR UPDATE;
--Testcase 20:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
--Testcase 21:
SELECT * FROM ft1 t1 WHERE c1 = 102 FOR SHARE;
-- aggregate
--Testcase 22:
SELECT COUNT(*) FROM ft1 t1;
-- subquery
--Testcase 23:
SELECT * FROM ft1 t1 WHERE t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 <= 10) ORDER BY c1;
-- subquery+MAX
--Testcase 24:
SELECT * FROM ft1 t1 WHERE t1.c3 = (SELECT MAX(c3) FROM ft2 t2) ORDER BY c1;
-- used in CTE
--Testcase 25:
WITH t1 AS (SELECT * FROM ft1 WHERE c1 <= 10) SELECT t2.c1, t2.c2, t2.c3, t2.c4 FROM t1, ft2 t2 WHERE t1.c1 = t2.c1 ORDER BY t1.c1;
-- fixed values
--Testcase 26:
SELECT 'fixed', NULL FROM ft1 t1 WHERE c1 = 1;
-- Test forcing the remote server to produce sorted data for a merge join.
--Testcase 765:
SET enable_hashjoin TO false;
--Testcase 766:
SET enable_nestloop TO false;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 27:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 28:
SELECT t1.c1, t2."C 1" FROM ft2 t1 JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 29:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
--Testcase 30:
SELECT t1.c1, t2."C 1" FROM ft2 t1 LEFT JOIN "S 1"."T 1" t2 ON (t1.c1 = t2."C 1") OFFSET 100 LIMIT 10;
-- A join between local table and foreign join. ORDER BY clause is added to the
-- foreign join so that the local table can be joined using merge join strategy.
--Testcase 31:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 32:
SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above, except that the full join prevents any equivalence
-- classes from being merged. This produces single relation equivalence classes
-- included in join restrictions.
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 34:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
-- Test similar to above with all full outer joins
--Testcase 35:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 36:
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
--Testcase 767:
RESET enable_hashjoin;
--Testcase 768:
RESET enable_nestloop;
-- Test executing assertion in estimate_path_cost_size() that makes sure that
-- retrieved_rows for foreign rel re-used to cost pre-sorted foreign paths is
-- a sensible value even when the rel has tuples=0
-- CREATE TABLE loct_empty (c1 int NOT NULL, c2 text);
--Testcase 769:
CREATE FOREIGN TABLE ft_empty (c1 int NOT NULL, c2 text)
SERVER sqlite_svr OPTIONS (table 'loct_empty');
--Testcase 770:
INSERT INTO "S 1".loct_empty
SELECT id, 'AAA' || to_char(id, 'FM000') FROM generate_series(1, 100) id;
--Testcase 771:
DELETE FROM "S 1".loct_empty;
-- ANALYZE ft_empty;
--Testcase 772:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1;
-- test restriction on non-system foreign tables.
SET restrict_nonsystem_relation_kind TO 'foreign-table';
--Testcase 1029:
SELECT * from ft1 where c1 < 1; -- ERROR
--Testcase 1030:
INSERT INTO ft1 (c1) VALUES (1); -- ERROR
--Testcase 1031:
DELETE FROM ft1 WHERE c1 = 1; -- ERROR
TRUNCATE ft1; -- ERROR
RESET restrict_nonsystem_relation_kind;
-- ===================================================================
-- WHERE with remotely-executable conditions
-- ===================================================================
--Testcase 37:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 1; -- Var, OpExpr(b), Const
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = 0; -- BoolExpr
--Testcase 39:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c3 IS NULL; -- NullTest
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c3 IS NOT NULL; -- NullTest
--Testcase 41:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr
--Testcase 42:
--Testcase 956:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = -c1; -- OpExpr(l)
--Testcase 44:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE (c1 IS NOT NULL) IS DISTINCT FROM (c1 IS NOT NULL); -- DistinctExpr
--Testcase 45:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = ANY(ARRAY[c2, 1, c1 + 0]); -- ScalarArrayOpExpr
--Testcase 46:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = (ARRAY[c1,c2,3])[1]; -- SubscriptingRef
--Testcase 47:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c6 = E'foo''s\\bar'; -- check special chars
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c8 = 'foo'; -- can't be sent to remote
-- parameterized remote path for foreign table
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2;
--Testcase 50:
SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2;
-- check both safe and unsafe join conditions
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
--Testcase 52:
SELECT * FROM ft2 a, ft2 b
WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7);
-- bug before 9.3.5 due to sloppy handling of remote-estimate parameters
--Testcase 53:
SELECT * FROM ft1 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft2 WHERE c1 < 5));
--Testcase 54:
SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5));
-- user-defined operator/function
--Testcase 494:
CREATE FUNCTION sqlite_fdw_abs(int) RETURNS int AS $$
BEGIN
RETURN abs($1);
END
$$ LANGUAGE plpgsql IMMUTABLE;
--Testcase 495:
CREATE OPERATOR === (
LEFTARG = int,
RIGHTARG = int,
PROCEDURE = int4eq,
COMMUTATOR = ===
);
-- built-in operators and functions can be shipped for remote execution
--Testcase 57:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 58:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = abs(t1.c2);
--Testcase 59:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 60:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = t1.c2;
-- by default, user-defined ones cannot
--Testcase 61:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 62:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 63:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 64:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- ORDER BY can be shipped, though
--Testcase 496:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 497:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- but let's put them in an extension ...
--Testcase 773:
ALTER EXTENSION sqlite_fdw ADD FUNCTION sqlite_fdw_abs(int);
--Testcase 774:
ALTER EXTENSION sqlite_fdw ADD OPERATOR === (int, int);
--ALTER SERVER sqlite_svr2 OPTIONS (ADD extensions 'sqlite_fdw');
-- ... now they can be shipped
--Testcase 498:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 499:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 = sqlite_fdw_abs(t1.c2);
--Testcase 500:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 501:
SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
-- and both ORDER BY and LIMIT can be shipped
--Testcase 502:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
--Testcase 503:
SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1;
-- Ensure we don't ship FETCH FIRST .. WITH TIES
--Testcase 1027:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c2 FROM ft1 t1 WHERE t1.c1 > 960 ORDER BY t1.c2 FETCH FIRST 2 ROWS WITH TIES;
--Testcase 1028:
SELECT t1.c2 FROM ft1 t1 WHERE t1.c1 > 960 ORDER BY t1.c2 FETCH FIRST 2 ROWS WITH TIES;
-- Test CASE pushdown
--Testcase 957:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1;
--Testcase 958:
SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1;
-- Nested CASE
--Testcase 959:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1,c2,c3 FROM ft2 WHERE CASE CASE WHEN c2 > 0 THEN c2 END WHEN 100 THEN 601 WHEN c2 THEN c2 ELSE 0 END > 600 ORDER BY c1;
--Testcase 960:
SELECT c1,c2,c3 FROM ft2 WHERE CASE CASE WHEN c2 > 0 THEN c2 END WHEN 100 THEN 601 WHEN c2 THEN c2 ELSE 0 END > 600 ORDER BY c1;
-- CASE arg WHEN
--Testcase 961:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- CASE cannot be pushed down because of unshippable arg clause
--Testcase 962:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c1 > (CASE random()::integer WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 963:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 964:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 965:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
-- a regconfig constant referring to this text search configuration
-- is initially unshippable--Testcase 984:
CREATE TEXT SEARCH CONFIGURATION public.custom_search
(COPY = pg_catalog.english);
--Testcase 985:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
--Testcase 986:
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
-- but if it's in a shippable extension, it can be shipped
ALTER EXTENSION sqlite_fdw ADD TEXT SEARCH CONFIGURATION public.custom_search;
-- however, that doesn't flush the shippability cache, so do a quick reconnect
\c -
--Testcase 995:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
--Testcase 996:
SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1
WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0;
-- ===================================================================
-- ORDER BY queries
-- ===================================================================
-- we should not push order by clause with volatile expressions or unsafe
-- collations
--Testcase 1006:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, random();
--Testcase 1007:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C";
-- Ensure we don't push ORDER BY expressions which are Consts at the UNION
-- child level to the foreign server.
--Testcase 1008:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM (
SELECT 1 AS type,c1 FROM ft1
UNION ALL
SELECT 2 AS type,c1 FROM ft2
) a ORDER BY type,c1;
--Testcase 1009:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM (
SELECT 1 AS type,c1 FROM ft1
UNION ALL
SELECT 2 AS type,c1 FROM ft2
) a ORDER BY type;
-- ===================================================================
-- JOIN queries
-- ===================================================================
-- Analyze ft4 and ft5 so that we have better statistics. These tables do not
-- have use_remote_estimate set.
--ANALYZE ft4;
--ANALYZE ft5;
-- join two tables
--Testcase 65:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 66:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join three tables
--Testcase 67:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 68:
SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t3 ON (t3.c1 = t1.c1) ORDER BY t1.c3, t1.c1 OFFSET 10 LIMIT 10;
-- left outer join
--Testcase 69:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 70:
SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- left outer join three tables
--Testcase 71:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 72:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- left outer join + placement of clauses.
-- clauses within the nullable side are not pulled up, but top level clause on
-- non-nullable side is pushed into non-nullable side
--Testcase 73:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
--Testcase 74:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
-- clauses within the nullable side are not pulled up, but the top level clause
-- on nullable side is not pushed down into nullable side
--Testcase 75:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
--Testcase 76:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1)
WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
-- right outer join
--Testcase 77:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
--Testcase 78:
SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2.c1, t1.c1 OFFSET 10 LIMIT 10;
-- right outer join three tables
--Testcase 79:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 80:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- full outer join
--Testcase 81:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
--Testcase 82:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 45 LIMIT 10;
-- full outer join with restrictions on the joining relations
-- a. the joining relations are both base relations
--Testcase 83:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 84:
SELECT t1.c1, t2.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1;
--Testcase 85:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
--Testcase 86:
SELECT 1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t2 ON (TRUE) OFFSET 10 LIMIT 10;
-- b. one of the joining relations is a base relation and the other is a join
-- relation
--Testcase 87:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 88:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM ft4 t2 LEFT JOIN ft5 t3 ON (t2.c1 = t3.c1) WHERE (t2.c1 between 50 and 60)) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- c. test deparsing the remote query as nested subqueries
--Testcase 89:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
--Testcase 90:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t1 FULL JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (t1.c1 = ss.a) ORDER BY t1.c1, ss.a, ss.b;
-- d. test deparsing rowmarked relations as subqueries
--Testcase 91:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
--Testcase 92:
SELECT t1.c1, ss.a, ss.b FROM (SELECT c1 FROM "S 1"."T 3" WHERE c1 = 50) t1 INNER JOIN (SELECT t2.c1, t3.c1 FROM (SELECT c1 FROM ft4 WHERE c1 between 50 and 60) t2 FULL JOIN (SELECT c1 FROM ft5 WHERE c1 between 50 and 60) t3 ON (t2.c1 = t3.c1) WHERE t2.c1 IS NULL OR t2.c1 IS NOT NULL) ss(a, b) ON (TRUE) ORDER BY t1.c1, ss.a, ss.b FOR UPDATE OF t1;
-- full outer join + inner join
--Testcase 93:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
--Testcase 94:
SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 and t1.c1 between 50 and 60) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1, t2.c1, t3.c1 LIMIT 10;
-- full outer join three tables
--Testcase 95:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 96:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + right outer join
--Testcase 97:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 98:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
-- right outer join + full outer join
--Testcase 99:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 100:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + left outer join
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 102:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- left outer join + full outer join
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 104:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
--Testcase 775:
SET enable_memoize TO off;
-- right outer join + left outer join
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 106:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 776:
RESET enable_memoize;
-- left outer join + right outer join
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) OFFSET 10 LIMIT 10;
--Testcase 108:
SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT JOIN ft4 t3 ON (t2.c1 = t3.c1) ORDER BY t1.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause, only matched rows
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 110:
SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1 = t2.c1 OR t1.c1 IS NULL) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
-- full outer join + WHERE clause with shippable extensions set
--Testcase 504:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--ALTER SERVER sqlite_svr2 OPTIONS (DROP extensions);
-- full outer join + WHERE clause with shippable extensions not set
--Testcase 505:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2, t1.c3 FROM ft1 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE sqlite_fdw_abs(t1.c1) > 0 OFFSET 10 LIMIT 10;
--Testcase 777:
-- ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- join two tables with FOR UPDATE clause
-- tests whole-row reference for row marks
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 112:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE OF t1;
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
--Testcase 114:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR UPDATE;
-- join two tables with FOR SHARE clause
--Testcase 115:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 116:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE OF t1;
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
--Testcase 118:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10 FOR SHARE;
-- join in CTE
--Testcase 119:
EXPLAIN (VERBOSE, COSTS OFF)
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
--Testcase 120:
WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) SELECT c1_1, c2_1 FROM t ORDER BY c1_3, c1_1 OFFSET 100 LIMIT 10;
-- ctid with whole-row reference
--Testcase 121:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- SEMI JOIN
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 123:
SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- ANTI JOIN, not pushed down
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
--Testcase 125:
SELECT t1.c1 FROM ft1 t1 WHERE NOT EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c2) ORDER BY t1.c1 OFFSET 100 LIMIT 10;
-- CROSS JOIN can be pushed down
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 127:
SELECT t1.c1, t2.c1 FROM ft1 t1 CROSS JOIN ft2 t2 ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- different server, not pushed down. No result expected.
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 129:
SELECT t1.c1, t2.c1 FROM ft5 t1 JOIN ft6 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe join conditions (c8 has a UDT), not pushed down. Practically a CROSS
-- JOIN since c8 in both tables has same value.
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
--Testcase 131:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c8 = t2.c8) ORDER BY t1.c1, t2.c1 OFFSET 100 LIMIT 10;
-- unsafe conditions on one side (c8 has a UDT), not pushed down.
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 133:
SELECT t1.c1, t2.c1 FROM ft1 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = 'foo' ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- join where unsafe to pushdown condition in WHERE clause has a column not
-- in the SELECT clause. In this test unsafe clause needs to have column
-- references from both joining sides so that the clause is not pushed down
-- into one of the joining sides.
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
--Testcase 135:
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.c8 ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- Aggregate after UNION, for testing setrefs
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
--Testcase 137:
SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) UNION SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1)) AS t (t1c1, t2c1) GROUP BY t1c1 ORDER BY t1c1 OFFSET 100 LIMIT 10;
-- join with lateral reference
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
--Testcase 139:
SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10;
-- join with pseudoconstant quals
--Testcase 997:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1 AND CURRENT_USER = SESSION_USER) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10;
-- non-Var items in targetlist of the nullable rel of a join preventing
-- push-down in some cases
-- unable to push {ft1, ft2}
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
--Testcase 141:
SELECT q.a, ft2.c1 FROM (SELECT 13 FROM ft1 WHERE c1 = 13) q(a) RIGHT JOIN ft2 ON (q.a = ft2.c1) WHERE ft2.c1 BETWEEN 10 AND 15;
-- ok to push {ft1, ft2} but not {ft1, ft2, ft4}
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
--Testcase 143:
SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT JOIN ft2 ON (ft1.c1 = ft2.c1) WHERE ft1.c1 = 12) q(a, b, c) ON (ft4.c1 = q.b) WHERE ft4.c1 BETWEEN 10 AND 15;
-- join with nullable side with some columns with null values
--Testcase 144:
UPDATE ft5 SET c3 = null where c1 % 9 = 0;
--Testcase 145:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
--Testcase 146:
SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
-- multi-way join involving multiple merge joins
-- (this case used to have EPQ-related planning problems)
--Testcase 506:
CREATE TABLE local_tbl (c1 int NOT NULL, c2 int NOT NULL, c3 text, CONSTRAINT local_tbl_pkey PRIMARY KEY (c1));
--Testcase 507:
INSERT INTO local_tbl SELECT id, id % 10, to_char(id, 'FM0000') FROM generate_series(1, 1000) id;
ANALYZE local_tbl;
--Testcase 778:
SET enable_nestloop TO false;
--Testcase 779:
SET enable_hashjoin TO false;
--Testcase 147:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 FOR UPDATE;
--Testcase 148:
SELECT * FROM ft1, ft2, ft4, ft5, local_tbl WHERE ft1.c1 = ft2.c1 AND ft1.c2 = ft4.c1
AND ft1.c2 = ft5.c1 AND ft1.c2 = local_tbl.c1 AND ft1.c1 < 100 AND ft2.c1 < 100 ORDER BY ft1.c1 FOR UPDATE;
--Testcase 780:
RESET enable_nestloop;
--Testcase 781:
RESET enable_hashjoin;
-- test that add_paths_with_pathkeys_for_rel() arranges for the epq_path to
-- return columns needed by the parent ForeignScan node
-- This does not work as SQLite FDW does not support use_remote_estimate
--Testcase 987:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM local_tbl LEFT JOIN (SELECT ft1.*, COALESCE(ft1.c3 || ft2.c3, 'foobar') FROM ft1 INNER JOIN ft2 ON (ft1.c1 = ft2.c1 AND ft1.c1 < 100)) ss ON (local_tbl.c1 = ss.c1) ORDER BY local_tbl.c1 FOR UPDATE OF local_tbl;
-- ALTER SERVER loopback OPTIONS (DROP extensions);
-- ALTER SERVER loopback OPTIONS (ADD fdw_startup_cost '10000.0');
--Testcase 988:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM local_tbl LEFT JOIN (SELECT ft1.* FROM ft1 INNER JOIN ft2 ON (ft1.c1 = ft2.c1 AND ft1.c1 < 100 AND (ft1.c1 - sqlite_fdw_abs(ft2.c2)) = 0)) ss ON (local_tbl.c3 = ss.c3) ORDER BY local_tbl.c1 FOR UPDATE OF local_tbl;
-- ALTER SERVER loopback OPTIONS (DROP fdw_startup_cost);
-- ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
--DROP TABLE local_tbl;
-- check join pushdown in situations where multiple userids are involved
-- Although SQLite FDW does not need User and User mapping to connect to
-- the database file, however, JOIN pushdown is decided by the core code.
-- If outer and inner relation are foreign tables (or joins) belonging to
-- the same server and assigned to the same user, join will be pushed down.
-- Otherwise, join cannot be pushed down.
-- In addition to an exact match of userid, we allow the case where one side
-- has zero userid (implying current user) and the other side has explicit
-- userid that happens to equal the current user; but in that case, pushdown of
-- the join is only valid for the current user.
--Testcase 508:
CREATE ROLE regress_view_owner SUPERUSER;
--Testcase 509:
-- CREATE USER MAPPING FOR regress_view_owner SERVER sqlite_svr;
GRANT SELECT ON ft4 TO regress_view_owner;
GRANT SELECT ON ft5 TO regress_view_owner;
--Testcase 510:
CREATE VIEW v4 AS SELECT * FROM ft4;
--Testcase 511:
CREATE VIEW v5 AS SELECT * FROM ft5;
--Testcase 782:
ALTER VIEW v5 OWNER TO regress_view_owner;
--Testcase 149:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, different view owners
--Testcase 150:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 783:
ALTER VIEW v4 OWNER TO regress_view_owner;
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 152:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can't be pushed down, view owner not current user
--Testcase 154:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 784:
ALTER VIEW v4 OWNER TO CURRENT_USER;
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; -- can be pushed down
--Testcase 156:
SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10;
--Testcase 785:
ALTER VIEW v4 OWNER TO regress_view_owner;
-- Comment out these test cases.
-- sqlite_fdw does not need to getUserMapping in planning phase,
-- so it is unable to check userid to use when querying the remote table is correctly propagated into foreign rels.
-- -- ====================================================================
-- -- Check that userid to use when querying the remote table is correctly
-- -- propagated into foreign rels present in subqueries under an UNION ALL
-- -- ====================================================================
-- CREATE ROLE regress_view_owner_another;
-- ALTER VIEW v4 OWNER TO regress_view_owner_another;
-- GRANT SELECT ON ft4 TO regress_view_owner_another;
-- ALTER FOREIGN TABLE ft4 OPTIONS (ADD use_remote_estimate 'true');
-- -- The following should query the remote backing table of ft4 as user
-- -- regress_view_owner_another, the view owner, though it fails as expected
-- -- due to the lack of a user mapping for that user.
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4;
-- -- Likewise, but with the query under an UNION ALL
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4);
-- -- Should not get that error once a user mapping is created
-- CREATE USER MAPPING FOR regress_view_owner_another SERVER loopback OPTIONS (password_required 'false');
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4;
-- EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4);
-- DROP USER MAPPING FOR regress_view_owner_another SERVER loopback;
-- DROP OWNED BY regress_view_owner_another;
-- DROP ROLE regress_view_owner_another;
-- ALTER FOREIGN TABLE ft4 OPTIONS (SET use_remote_estimate 'false');
-- cleanup
--Testcase 512:
DROP OWNED BY regress_view_owner;
--Testcase 513:
DROP ROLE regress_view_owner;
-- ===================================================================
-- Aggregate and grouping queries
-- ===================================================================
-- Simple aggregates
--Testcase 157:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 158:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2;
--Testcase 514:
explain (verbose, costs off)
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
--Testcase 515:
select count(c6), sum(c1), avg(c1), min(c2), max(c1), stddev(c2), sum(c1) * (random() <= 1)::int as sum2 from ft1 where c2 < 5 group by c2 order by 1, 2 limit 1;
-- Aggregate is not pushed down as aggregation contains random()
--Testcase 159:
explain (verbose, costs off)
select sum(c1 * (random() <= 1)::int) as sum, avg(c1) from ft1;
-- Aggregate over join query
--Testcase 160:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
--Testcase 161:
select count(*), sum(t1.c1), avg(t2.c1) from ft1 t1 inner join ft1 t2 on (t1.c2 = t2.c2) where t1.c2 = 6;
-- Not pushed down due to local conditions present in underneath input rel
--Testcase 162:
explain (verbose, costs off)
select sum(t1.c1), count(t2.c1) from ft1 t1 inner join ft2 t2 on (t1.c1 = t2.c1) where ((t1.c1 * t2.c1)/(t1.c1 * t2.c1)) * random() <= 1;
-- GROUP BY clause having expressions
--Testcase 163:
explain (verbose, costs off)
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
--Testcase 164:
select c2/2, sum(c2) * (c2/2) from ft1 group by c2/2 order by c2/2;
-- Aggregates in subquery are pushed down.
set enable_incremental_sort = off;
--Testcase 165:
explain (verbose, costs off)
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
--Testcase 166:
select count(x.a), sum(x.a) from (select c2 a, sum(c1) b from ft1 group by c2, sqrt(c1) order by 1, 2) x;
reset enable_incremental_sort;
-- Aggregate is still pushed down by taking unshippable expression out
--Testcase 167:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
--Testcase 168:
select c2 * (random() <= 1)::int as sum1, sum(c1) * c2 as sum2 from ft1 group by c2 order by 1, 2;
-- Aggregate with unshippable GROUP BY clause are not pushed
--Testcase 169:
explain (verbose, costs off)
select c2 * (random() <= 1)::int as c2 from ft2 group by c2 * (random() <= 1)::int order by 1;
-- GROUP BY clause in various forms, cardinal, alias and constant expression
--Testcase 516:
explain (verbose, costs off)
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
--Testcase 517:
select count(c2) w, c2 x, 5 y, 7.0 z from ft1 group by 2, y, 9.0::int order by 2;
-- GROUP BY clause referring to same column multiple times
-- Also, ORDER BY contains an aggregate function
--Testcase 170:
--Testcase 966:
explain (verbose, costs off)
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
--Testcase 171:
select c2, c2 from ft1 where c2 > 6 group by 1, 2 order by sum(c1);
-- Testing HAVING clause shippability
--Testcase 172:
explain (verbose, costs off)
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
--Testcase 173:
select c2, sum(c1) from ft2 group by c2 having avg(c1) < 500 and sum(c1) < 49800 order by c2;
-- Unshippable HAVING clause will be evaluated locally, and other qual in HAVING clause is pushed down
--Testcase 174:
explain (verbose, costs off)
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
--Testcase 175:
select count(*) from (select c5, count(c1) from ft1 group by c5, sqrt(c2) having (avg(c1) / avg(c1)) * random() <= 1 and avg(c1) < 500) x;
-- Aggregate in HAVING clause is not pushable, and thus aggregation is not pushed down
--Testcase 176:
explain (verbose, costs off)
select sum(c1) from ft1 group by c2 having avg(c1 * (random() <= 1)::int) > 100 order by 1;
-- Remote aggregate in combination with a local Param (for the output
-- of an initplan) can be trouble, per bug #15781
--Testcase 518:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 519:
select exists(select 1 from pg_enum), sum(c1) from ft1;
--Testcase 520:
explain (verbose, costs off)
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
--Testcase 521:
select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1;
-- Testing ORDER BY, DISTINCT, FILTER, Ordered-sets and VARIADIC within aggregates
-- ORDER BY within aggregate, same column used to order
--Testcase 177:
explain (verbose, costs off)
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
--Testcase 178:
select array_agg(c1 order by c1) from ft1 where c1 < 100 group by c2 order by 1;
-- ORDER BY within aggregate, different column used to order also using DESC
--Testcase 179:
explain (verbose, costs off)
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
--Testcase 180:
select array_agg(c5 order by c1 desc) from ft2 where c2 = 6 and c1 < 50;
-- DISTINCT within aggregate
--Testcase 181:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 182:
select array_agg(distinct (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- DISTINCT combined with ORDER BY within aggregate
--Testcase 183:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 184:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 185:
explain (verbose, costs off)
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
--Testcase 186:
select array_agg(distinct (t1.c1)%5 order by (t1.c1)%5 desc nulls last) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) where t1.c1 < 20 or (t1.c1 is null and t2.c1 < 5) group by (t2.c1)%3 order by 1;
-- FILTER within aggregate
--Testcase 187:
explain (verbose, costs off)
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
--Testcase 188:
select sum(c1) filter (where c1 < 100 and c2 > 5) from ft1 group by c2 order by 1 nulls last;
-- DISTINCT, ORDER BY and FILTER within aggregate
--Testcase 189:
explain (verbose, costs off)
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
--Testcase 190:
select sum(c1%3), sum(distinct c1%3 order by c1%3) filter (where c1%3 < 2), c2 from ft1 where c2 = 6 group by c2;
-- Outer query is aggregation query
--Testcase 191:
explain (verbose, costs off)
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 192:
select distinct (select count(*) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Inner query is aggregation query
--Testcase 193:
explain (verbose, costs off)
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
--Testcase 194:
select distinct (select count(t1.c1) filter (where t2.c2 = 6 and t2.c1 < 10) from ft1 t1 where t1.c1 = 6) from ft2 t2 where t2.c2 % 6 = 0 order by 1;
-- Aggregate not pushed down as FILTER condition is not pushable
--Testcase 195:
explain (verbose, costs off)
select sum(c1) filter (where (c1 / c1) * random() <= 1) from ft1 group by c2 order by 1;
--Testcase 196:
explain (verbose, costs off)
select sum(c2) filter (where c2 in (select c2 from ft1 where c2 < 5)) from ft1;
-- Ordered-sets within aggregate
--Testcase 197:
explain (verbose, costs off)
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
--Testcase 198:
select c2, rank('10'::varchar) within group (order by c6), percentile_cont(c2/10::numeric) within group (order by c1) from ft1 where c2 < 10 group by c2 having percentile_cont(c2/10::numeric) within group (order by c1) < 500 order by c2;
-- Using multiple arguments within aggregates
--Testcase 199:
explain (verbose, costs off)
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
--Testcase 200:
select c1, rank(c1, c2) within group (order by c1, c2) from ft1 group by c1, c2 having c1 = 6 order by 1;
-- User defined function for user defined aggregate, VARIADIC
--Testcase 522:
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)';
--Testcase 523:
create aggregate least_agg(variadic items anyarray) (
stype = anyelement, sfunc = least_accum
);
-- Disable hash aggregation for plan stability.
--Testcase 786:
set enable_hashagg to false;
-- Not pushed down due to user defined aggregate
--Testcase 524:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Add function and aggregate into extension
--alter extension postgres_fdw add function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw add aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Now aggregate will be pushed. Aggregate will display VARIADIC argument.
--Testcase 525:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
--Testcase 526:
select c2, least_agg(c1) from ft1 where c2 < 100 group by c2 order by c2;
-- Remove function and aggregate from extension
--alter extension postgres_fdw drop function least_accum(anyelement, variadic anyarray);
--alter extension postgres_fdw drop aggregate least_agg(variadic items anyarray);
--alter server loopback options (set extensions 'postgres_fdw');
-- Not pushed down as we have dropped objects from extension.
--Testcase 527:
explain (verbose, costs off)
select c2, least_agg(c1) from ft1 group by c2 order by c2;
-- Cleanup
--Testcase 787:
reset enable_hashagg;
--Testcase 528:
drop aggregate least_agg(variadic items anyarray);
--Testcase 529:
drop function least_accum(anyelement, variadic anyarray);
-- Testing USING OPERATOR() in ORDER BY within aggregate.
-- For this, we need user defined operators along with operator family and
-- operator class. Create those and then add them in extension. Note that
-- user defined objects are considered unshippable unless they are part of
-- the extension.
--Testcase 530:
create operator public.<^ (
leftarg = int4,
rightarg = int4,
procedure = int4eq
);
--Testcase 531:
create operator public.=^ (
leftarg = int4,
rightarg = int4,
procedure = int4lt
);
--Testcase 532:
create operator public.>^ (
leftarg = int4,
rightarg = int4,
procedure = int4gt
);
--Testcase 533:
create operator family my_op_family using btree;
--Testcase 534:
create function my_op_cmp(a int, b int) returns int as
$$begin return btint4cmp(a, b); end $$ language plpgsql;
--Testcase 535:
create operator class my_op_class for type int using btree family my_op_family as
operator 1 public.<^,
operator 3 public.=^,
operator 5 public.>^,
function 1 my_op_cmp(int, int);
-- This will not be pushed as user defined sort operator is not part of the
-- extension yet.
--Testcase 536:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- This should not be pushed either.
--Testcase 967:
explain (verbose, costs off)
select * from ft2 order by c1 using operator(public.<^);
-- Update local stats on ft2
--ANALYZE ft2;
-- Add into extension
--Testcase 788:
alter extension sqlite_fdw add operator class my_op_class using btree;
--Testcase 789:
alter extension sqlite_fdw add function my_op_cmp(a int, b int);
--Testcase 790:
alter extension sqlite_fdw add operator family my_op_family using btree;
--Testcase 791:
alter extension sqlite_fdw add operator public.<^(int, int);
--Testcase 792:
alter extension sqlite_fdw add operator public.=^(int, int);
--Testcase 793:
alter extension sqlite_fdw add operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
--alter server loopback options (add fdw_tuple_cost '0.5');
-- Now this will be pushed as sort operator is part of the extension.
--Testcase 537:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
--Testcase 538:
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
--alter server loopback options (drop fdw_tuple_cost);
-- This should be pushed too.
-- Sqlite not support pushdown user defined operators
--Testcase 968:
explain (verbose, costs off)
select * from ft2 order by c1 using operator(public.<^);
-- Remove from extension
--Testcase 794:
alter extension sqlite_fdw drop operator class my_op_class using btree;
--Testcase 795:
alter extension sqlite_fdw drop function my_op_cmp(a int, b int);
--Testcase 796:
alter extension sqlite_fdw drop operator family my_op_family using btree;
--Testcase 797:
alter extension sqlite_fdw drop operator public.<^(int, int);
--Testcase 798:
alter extension sqlite_fdw drop operator public.=^(int, int);
--Testcase 799:
alter extension sqlite_fdw drop operator public.>^(int, int);
--alter server loopback options (set extensions 'postgres_fdw');
-- This will not be pushed as sort operator is now removed from the extension.
--Testcase 539:
explain (verbose, costs off)
select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
-- Cleanup
--Testcase 540:
drop operator class my_op_class using btree;
--Testcase 541:
drop function my_op_cmp(a int, b int);
--Testcase 542:
drop operator family my_op_family using btree;
--Testcase 543:
drop operator public.>^(int, int);
--Testcase 544:
drop operator public.=^(int, int);
--Testcase 545:
drop operator public.<^(int, int);
-- Input relation to aggregate push down hook is not safe to pushdown and thus
-- the aggregate cannot be pushed down to foreign server.
--Testcase 201:
explain (verbose, costs off)
select count(t1.c3) from ft2 t1 left join ft2 t2 on (t1.c1 = random() * t2.c2);
-- Subquery in FROM clause having aggregate
--Testcase 202:
explain (verbose, costs off)
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
--Testcase 203:
select count(*), x.b from ft1, (select c2 a, sum(c1) b from ft1 group by c2) x where ft1.c2 = x.a group by x.b order by 1, 2;
-- FULL join with IS NULL check in HAVING
--Testcase 204:
explain (verbose, costs off)
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
--Testcase 205:
select avg(t1.c1), sum(t2.c1) from ft4 t1 full join ft5 t2 on (t1.c1 = t2.c1) group by t2.c1 having (avg(t1.c1) is null and sum(t2.c1) < 10) or sum(t2.c1) is null order by 1 nulls last, 2;
-- Aggregate over FULL join needing to deparse the joining relations as
-- subqueries.
--Testcase 206:
explain (verbose, costs off)
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
--Testcase 207:
select count(*), sum(t1.c1), avg(t2.c1) from (select c1 from ft4 where c1 between 50 and 60) t1 full join (select c1 from ft5 where c1 between 50 and 60) t2 on (t1.c1 = t2.c1);
-- ORDER BY expression is part of the target list but not pushed down to
-- foreign server.
--Testcase 208:
explain (verbose, costs off)
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
--Testcase 209:
select sum(c2) * (random() <= 1)::int as sum from ft1 order by 1;
-- LATERAL join, with parameterization
--Testcase 800:
set enable_hashagg to false;
--Testcase 210:
explain (verbose, costs off)
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 211:
select c2, sum from "S 1"."T 1" t1, lateral (select sum(t2.c1 + t1."C 1") sum from ft2 t2 group by t2.c1) qry where t1.c2 * 2 = qry.sum and t1.c2 < 3 and t1."C 1" < 100 order by 1;
--Testcase 801:
reset enable_hashagg;
-- bug #15613: bad plan for foreign table scan with lateral reference
--Testcase 546:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
--Testcase 547:
SELECT ref_0.c2, subq_1.*
FROM
"S 1"."T 1" AS ref_0,
LATERAL (
SELECT ref_0."C 1" c1, subq_0.*
FROM (SELECT ref_0.c2, ref_1.c3
FROM ft1 AS ref_1) AS subq_0
RIGHT JOIN ft2 AS ref_3 ON (subq_0.c3 = ref_3.c3)
) AS subq_1
WHERE ref_0."C 1" < 10 AND subq_1.c3 = '00001'
ORDER BY ref_0."C 1";
-- Check with placeHolderVars
--Testcase 212:
explain (verbose, costs off)
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
--Testcase 213:
select sum(q.a), count(q.b) from ft4 left join (select 13, avg(ft1.c1), sum(ft2.c1) from ft1 right join ft2 on (ft1.c1 = ft2.c1)) q(a, b, c) on (ft4.c1 <= q.b);
-- Not supported cases
-- Grouping sets
--Testcase 214:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 215:
select c2, sum(c1) from ft1 where c2 < 3 group by rollup(c2) order by 1 nulls last;
--Testcase 216:
explain (verbose, costs off)
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 217:
select c2, sum(c1) from ft1 where c2 < 3 group by cube(c2) order by 1 nulls last;
--Testcase 218:
explain (verbose, costs off)
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 219:
select c2, c6, sum(c1) from ft1 where c2 < 3 group by grouping sets(c2, c6) order by 1 nulls last, 2 nulls last;
--Testcase 220:
explain (verbose, costs off)
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
--Testcase 221:
select c2, sum(c1), grouping(c2) from ft1 where c2 < 3 group by c2 order by 1 nulls last;
-- DISTINCT itself is not pushed down, whereas underneath aggregate is pushed
--Testcase 222:
explain (verbose, costs off)
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
--Testcase 223:
select distinct sum(c1)/1000 s from ft2 where c2 < 6 group by c2 order by 1;
-- WindowAgg
--Testcase 224:
explain (verbose, costs off)
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 225:
select c2, sum(c2), count(c2) over (partition by c2%2) from ft2 where c2 < 10 group by c2 order by 1;
--Testcase 226:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 227:
select c2, array_agg(c2) over (partition by c2%2 order by c2 desc) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 228:
explain (verbose, costs off)
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
--Testcase 229:
select c2, array_agg(c2) over (partition by c2%2 order by c2 range between current row and unbounded following) from ft1 where c2 < 10 group by c2 order by 1;
-- ===================================================================
-- parameterized queries
-- ===================================================================
-- simple join
--Testcase 230:
PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $1 AND t2.c1 = $2;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2);
--Testcase 232:
EXECUTE st1(1, 1);
--Testcase 233:
EXECUTE st1(101, 101);
SET enable_hashjoin TO off;
SET enable_sort TO off;
-- subquery using stable function (can't be sent to remote)
--Testcase 234:
PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1;
--Testcase 235:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st2(10, 20);
--Testcase 236:
EXECUTE st2(10, 20);
--Testcase 237:
EXECUTE st2(101, 121);
RESET enable_hashjoin;
RESET enable_sort;
-- subquery using immutable function (can be sent to remote)
--Testcase 238:
PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1;
--Testcase 239:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st3(10, 20);
--Testcase 240:
EXECUTE st3(10, 20);
--Testcase 241:
EXECUTE st3(20, 30);
-- custom plan should be chosen initially
--Testcase 242:
PREPARE st4(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 = $1;
--Testcase 243:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 244:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 245:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 246:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
--Testcase 247:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- once we try it enough times, should switch to generic plan
--Testcase 248:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st4(1);
-- value of $1 should not be sent to remote
--Testcase 249:
PREPARE st5(text,int) AS SELECT * FROM ft1 t1 WHERE c8 = $1 and c1 = $2;
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 254:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 255:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st5('foo', 1);
--Testcase 256:
EXECUTE st5('foo', 1);
-- altering FDW options requires replanning
--Testcase 257:
PREPARE st6 AS SELECT * FROM ft1 t1 WHERE t1.c1 = t1.c2;
--Testcase 258:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 259:
PREPARE st7 AS INSERT INTO ft1 (c1,c2,c3) VALUES (1001,101,'foo');
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 548:
INSERT INTO "S 1"."T 0" SELECT * FROM "S 1"."T 1";
--Testcase 802:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 0');
--Testcase 261:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6;
--Testcase 262:
EXECUTE st6;
--Testcase 263:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7;
--Testcase 803:
ALTER FOREIGN TABLE ft1 OPTIONS (SET table 'T 1');
--Testcase 549:
PREPARE st8 AS SELECT count(c3) FROM ft1 t1 WHERE t1.c1 === t1.c2;
--Testcase 550:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 551:
EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st8;
--Testcase 552:
EXECUTE st8;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- cleanup
DEALLOCATE st1;
DEALLOCATE st2;
DEALLOCATE st3;
DEALLOCATE st4;
DEALLOCATE st5;
DEALLOCATE st6;
DEALLOCATE st7;
DEALLOCATE st8;
-- System columns, except ctid and oid, should not be sent to remote
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'pg_class'::regclass LIMIT 1;
--Testcase 265:
SELECT * FROM ft1 t1 WHERE t1.tableoid = 'ft1'::regclass LIMIT 1;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 267:
SELECT tableoid::regclass, * FROM ft1 t1 LIMIT 1;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 553:
SELECT * FROM ft1 t1 WHERE t1.ctid = '(0,2)';
--Testcase 554:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ctid, * FROM ft1 t1 LIMIT 1;
--Testcase 271:
SELECT ctid, * FROM ft1 t1 LIMIT 1;
-- ===================================================================
-- used in PL/pgSQL function
-- ===================================================================
--Testcase 555:
CREATE OR REPLACE FUNCTION f_test(p_c1 int) RETURNS int AS $$
DECLARE
v_c1 int;
BEGIN
--Testcase 556:
SELECT c1 INTO v_c1 FROM ft1 WHERE c1 = p_c1 LIMIT 1;
PERFORM c1 FROM ft1 WHERE c1 = p_c1 AND p_c1 = v_c1 LIMIT 1;
RETURN v_c1;
END;
$$ LANGUAGE plpgsql;
--Testcase 272:
SELECT f_test(100);
--Testcase 557:
DROP FUNCTION f_test(int);
-- ===================================================================
-- REINDEX
-- ===================================================================
-- remote table is not created here
--Testcase 804:
CREATE FOREIGN TABLE reindex_foreign (c1 int, c2 int)
SERVER sqlite_svr2 OPTIONS (table 'reindex_local');
REINDEX TABLE reindex_foreign; -- error
REINDEX TABLE CONCURRENTLY reindex_foreign; -- error
--Testcase 805:
DROP FOREIGN TABLE reindex_foreign;
-- partitions and foreign tables
--Testcase 806:
CREATE TABLE reind_fdw_parent (c1 int) PARTITION BY RANGE (c1);
--Testcase 807:
CREATE TABLE reind_fdw_0_10 PARTITION OF reind_fdw_parent
FOR VALUES FROM (0) TO (10);
--Testcase 808:
CREATE FOREIGN TABLE reind_fdw_10_20 PARTITION OF reind_fdw_parent
FOR VALUES FROM (10) TO (20)
SERVER sqlite_svr OPTIONS (table 'reind_local_10_20');
REINDEX TABLE reind_fdw_parent; -- ok
REINDEX TABLE CONCURRENTLY reind_fdw_parent; -- ok
--Testcase 809:
DROP TABLE reind_fdw_parent;
-- ===================================================================
-- conversion error
-- ===================================================================
--Testcase 810:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE int;
--Testcase 273:
SELECT * FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8) WHERE x1 = 1;
--Testcase 274:
SELECT ftx.x1, ft2.c2, ftx.x8 FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 275:
SELECT ftx.x1, ft2.c2, ftx FROM ft1 ftx(x1,x2,x3,x4,x5,x6,x7,x8), ft2 WHERE ftx.x1 = ft2.c1 AND ftx.x1 = 1;
--Testcase 276:
SELECT sum(c2), array_agg(c8) FROM ft1 GROUP BY c8;
-- ANALYZE ft1; -- ERROR
-- ===================================================================
-- local type can be different from remote type in some cases,
-- in particular if similarly-named operators do equivalent things
-- ===================================================================
--Testcase 811:
ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE text;
--Testcase 969:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE c8 = 'foo' LIMIT 1;
--Testcase 970:
SELECT * FROM ft1 WHERE c8 = 'foo' LIMIT 1;
--Testcase 971:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM ft1 WHERE 'foo' = c8 LIMIT 1;
--Testcase 972:
SELECT * FROM ft1 WHERE 'foo' = c8 LIMIT 1;
-- we declared c8 to be text locally, but it's still the same type on
-- the remote which will balk if we try to do anything incompatible
-- with that remote type
-- Can not create user define type in SqliteDB.
-- Type c8 of foreign table ft1 and remote table T1 are
-- match. These case below not error with sqlite_fdw.
-- with that remote type
--Testcase 973:
SELECT * FROM ft1 WHERE c8 LIKE 'foo' LIMIT 1; -- ERROR
--Testcase 974:
SELECT * FROM ft1 WHERE c8::text LIKE 'foo' LIMIT 1; -- ERROR; cast not pushed down
-- ===================================================================
-- subtransaction
-- + local/remote error doesn't break cursor
-- ===================================================================
BEGIN;
DECLARE c CURSOR FOR SELECT * FROM ft1 ORDER BY c1;
--Testcase 277:
FETCH c;
SAVEPOINT s;
ERROR OUT; -- ERROR
ROLLBACK TO s;
--Testcase 278:
FETCH c;
SAVEPOINT s;
--Testcase 279:
SELECT * FROM ft1 WHERE 1 / (c1 - 1) > 0; -- ERROR
ROLLBACK TO s;
--Testcase 280:
FETCH c;
--Testcase 281:
SELECT * FROM ft1 ORDER BY c1 LIMIT 1;
COMMIT;
-- ===================================================================
-- test handling of collations
-- ===================================================================
--Testcase 558:
create foreign table ft3 (f1 text collate "C", f2 text, f3 varchar(10)) server sqlite_svr;
-- can be sent to remote
--Testcase 559:
explain (verbose, costs off) select * from ft3 where f1 = 'foo';
--Testcase 560:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "C" = 'foo';
--Testcase 561:
explain (verbose, costs off) select * from ft3 where f2 = 'foo';
--Testcase 562:
explain (verbose, costs off) select * from ft3 where f3 = 'foo';
--Testcase 563:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 and l.f1 = 'foo';
-- can't be sent to remote
--Testcase 564:
explain (verbose, costs off) select * from ft3 where f1 COLLATE "POSIX" = 'foo';
--Testcase 565:
explain (verbose, costs off) select * from ft3 where f1 = 'foo' COLLATE "C";
--Testcase 566:
explain (verbose, costs off) select * from ft3 where f2 COLLATE "C" = 'foo';
--Testcase 567:
explain (verbose, costs off) select * from ft3 where f2 = 'foo' COLLATE "C";
--Testcase 568:
explain (verbose, costs off) select * from ft3 f, loct3 l
where f.f3 = l.f3 COLLATE "POSIX" and l.f1 = 'foo';
-- ===================================================================
-- test SEMI-JOIN pushdown
-- ===================================================================
--Testcase 1012:
EXPLAIN (verbose, costs off)
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN ft4 ON ft2.c2 = ft4.c1
WHERE ft2.c1 > 900
AND EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)
ORDER BY ft2.c1;
--Testcase 1013:
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN ft4 ON ft2.c2 = ft4.c1
WHERE ft2.c1 > 900
AND EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)
ORDER BY ft2.c1;
-- The same query, different join order
--Testcase 1014:
EXPLAIN (verbose, costs off)
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN
(SELECT * FROM ft4 WHERE
EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4
ON ft2.c2 = ft4.c1
WHERE ft2.c1 > 900
ORDER BY ft2.c1;
--Testcase 1015:
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN
(SELECT * FROM ft4 WHERE
EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4
ON ft2.c2 = ft4.c1
WHERE ft2.c1 > 900
ORDER BY ft2.c1;
-- Left join
--Testcase 1016:
EXPLAIN (verbose, costs off)
SELECT ft2.*, ft4.* FROM ft2 LEFT JOIN
(SELECT * FROM ft4 WHERE
EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4
ON ft2.c2 = ft4.c1
WHERE ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
--Testcase 1017:
SELECT ft2.*, ft4.* FROM ft2 LEFT JOIN
(SELECT * FROM ft4 WHERE
EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4
ON ft2.c2 = ft4.c1
WHERE ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
-- Several semi-joins per upper level join
--Testcase 1018:
EXPLAIN (verbose, costs off)
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN
(SELECT * FROM ft4 WHERE
EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4
ON ft2.c2 = ft4.c1
INNER JOIN (SELECT * FROM ft5 WHERE
EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft5.c1)) ft5
ON ft2.c2 <= ft5.c1
WHERE ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
--Testcase 1019:
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN
(SELECT * FROM ft4 WHERE
EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4
ON ft2.c2 = ft4.c1
INNER JOIN (SELECT * FROM ft5 WHERE
EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft5.c1)) ft5
ON ft2.c2 <= ft5.c1
WHERE ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
-- Semi-join below Semi-join
--Testcase 1020:
EXPLAIN (verbose, costs off)
SELECT ft2.* FROM ft2 WHERE
c1 = ANY (
SELECT c1 FROM ft2 WHERE
EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2))
AND ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
--Testcase 1021:
SELECT ft2.* FROM ft2 WHERE
c1 = ANY (
SELECT c1 FROM ft2 WHERE
EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2))
AND ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
-- Upper level relations shouldn't refer EXISTS() subqueries
--Testcase 1022:
EXPLAIN (verbose, costs off)
SELECT * FROM ft2 ftupper WHERE
EXISTS (
SELECT c1 FROM ft2 WHERE
EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2) AND c1 = ftupper.c1 )
AND ftupper.c1 > 900
ORDER BY ftupper.c1 LIMIT 10;
--Testcase 1023:
SELECT * FROM ft2 ftupper WHERE
EXISTS (
SELECT c1 FROM ft2 WHERE
EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2) AND c1 = ftupper.c1 )
AND ftupper.c1 > 900
ORDER BY ftupper.c1 LIMIT 10;
-- EXISTS should be propagated to the highest upper inner join
--Testcase 1024:
EXPLAIN (verbose, costs off)
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN
(SELECT * FROM ft4 WHERE EXISTS (
SELECT 1 FROM ft2 WHERE ft2.c2 = ft4.c2)) ft4
ON ft2.c2 = ft4.c1
INNER JOIN
(SELECT * FROM ft2 WHERE EXISTS (
SELECT 1 FROM ft4 WHERE ft2.c2 = ft4.c2)) ft21
ON ft2.c2 = ft21.c2
WHERE ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
--Testcase 1025:
SELECT ft2.*, ft4.* FROM ft2 INNER JOIN
(SELECT * FROM ft4 WHERE EXISTS (
SELECT 1 FROM ft2 WHERE ft2.c2 = ft4.c2)) ft4
ON ft2.c2 = ft4.c1
INNER JOIN
(SELECT * FROM ft2 WHERE EXISTS (
SELECT 1 FROM ft4 WHERE ft2.c2 = ft4.c2)) ft21
ON ft2.c2 = ft21.c2
WHERE ft2.c1 > 900
ORDER BY ft2.c1 LIMIT 10;
-- Can't push down semi-join with inner rel vars in targetlist
--Testcase 1026:
EXPLAIN (verbose, costs off)
SELECT ft1.c1 FROM ft1 JOIN ft2 on ft1.c1 = ft2.c1 WHERE
ft1.c1 IN (
SELECT ft2.c1 FROM ft2 JOIN ft4 ON ft2.c1 = ft4.c1)
ORDER BY ft1.c1 LIMIT 5;
-- ===================================================================
-- test writable foreign table stuff
-- ===================================================================
--Testcase 282:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 283:
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
--Testcase 284:
INSERT INTO ft2 (c1,c2,c3) VALUES (1101,201,'aaa'), (1102,202,'bbb'), (1103,203,'ccc');
--Testcase 285:
SELECT * FROM ft2 WHERE c1 >= 1101;
--Testcase 286:
INSERT INTO ft2 (c1,c2,c3) VALUES (1104,204,'ddd'), (1105,205,'eee');
--Testcase 287:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3; -- can be pushed down
--Testcase 288:
UPDATE ft2 SET c2 = c2 + 300, c3 = c3 || '_update3' WHERE c1 % 10 = 3;
--Testcase 289:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7; -- can be pushed down
--Testcase 290:
UPDATE ft2 SET c2 = c2 + 400, c3 = c3 || '_update7' WHERE c1 % 10 = 7;
--Testcase 291:
SELECT * FROM ft2 WHERE c1 % 10 = 7;
--Testcase 292:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9; -- can be pushed down
--Testcase 293:
UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
FROM ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 9;
--Testcase 294:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 % 10 = 5; -- can be pushed down
--Testcase 295:
SELECT c1, c4 FROM ft2 WHERE c1 % 10 = 5;
--Testcase 569:
DELETE FROM ft2 WHERE c1 % 10 = 5;
--Testcase 297:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2; -- can be pushed down
--Testcase 298:
DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
--Testcase 299:
SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1;
--Testcase 300:
EXPLAIN (verbose, costs off)
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 301:
INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo');
--Testcase 302:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200; -- can be pushed down
--Testcase 303:
UPDATE ft2 SET c3 = 'bar' WHERE c1 = 1200;
--Testcase 304:
EXPLAIN (verbose, costs off)
DELETE FROM ft2 WHERE c1 = 1200; -- can be pushed down
--Testcase 305:
DELETE FROM ft2 WHERE c1 = 1200;
-- Test UPDATE/DELETE on a three-table join
--Testcase 306:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id;
--Testcase 307:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 308:
UPDATE ft2 SET c3 = 'foo'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1;
--Testcase 309:
SELECT ft2, ft2.*, ft4, ft4.*
FROM ft2 INNER JOIN ft4 ON (ft2.c1 > 1200 AND ft2.c2 = ft4.c1)
INNER JOIN ft5 ON (ft4.c1 = ft5.c1);
--Testcase 310:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1; -- can be pushed down
--Testcase 311:
SELECT 100 FROM ft2, ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 570:
DELETE FROM ft2
USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1;
--Testcase 312:
DELETE FROM ft2 WHERE ft2.c1 > 1200;
-- Test UPDATE with a MULTIEXPR sub-select
-- (maybe someday this'll be remotely executable, but not today)
--Testcase 571:
EXPLAIN (verbose, costs off)
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 572:
UPDATE ft2 AS target SET (c2, c7) = (
SELECT c2 * 10, c7
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
--Testcase 573:
UPDATE ft2 AS target SET (c2) = (
SELECT c2 / 10
FROM ft2 AS src
WHERE target.c1 = src.c1
) WHERE c1 > 1100;
-- Test UPDATE involving a join that can be pushed down,
-- but a SET clause that can't be
--Testcase 812:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
--Testcase 813:
UPDATE ft2 d SET c2 = CASE WHEN random() >= 0 THEN d.c2 ELSE 0 END
FROM ft2 AS t WHERE d.c1 = t.c1 AND d.c1 > 1000;
-- Test UPDATE/DELETE with WHERE or JOIN/ON conditions containing
-- user-defined operators/functions
--ALTER SERVER loopback OPTIONS (DROP extensions);
--Testcase 574:
INSERT INTO ft2 (c1,c2,c3)
SELECT id, id % 10, to_char(id, 'FM00000') FROM generate_series(2001, 2010) id;
--Testcase 575:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000; -- can't be pushed down
--Testcase 576:
UPDATE ft2 SET c3 = 'bar' WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 577:
SELECT * FROM ft2 WHERE sqlite_fdw_abs(c1) > 2000;
--Testcase 578:
EXPLAIN (verbose, costs off)
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1; -- can't be pushed down
--Testcase 579:
UPDATE ft2 SET c3 = 'baz'
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 580:
SELECT ft2.*, ft4.*, ft5.*
FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1;
--Testcase 581:
EXPLAIN (verbose, costs off)
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 582:
SELECT ft2.c1, ft2.c2, ft2.c3 FROM ft2, ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1; -- can't be pushed down
--Testcase 583:
DELETE FROM ft2
USING ft4 INNER JOIN ft5 ON (ft4.c1 === ft5.c1)
WHERE ft2.c1 > 2000 AND ft2.c2 = ft4.c1;
--Testcase 584:
DELETE FROM ft2 WHERE ft2.c1 > 2000;
--ALTER SERVER loopback OPTIONS (ADD extensions 'postgres_fdw');
-- Test that trigger on remote table works as expected
--Testcase 585:
CREATE OR REPLACE FUNCTION "S 1".F_BRTRIG() RETURNS trigger AS $$
BEGIN
NEW.c3 = NEW.c3 || '_trig_update';
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
--Testcase 586:
CREATE TRIGGER t1_br_insert BEFORE INSERT OR UPDATE
ON ft2 FOR EACH ROW EXECUTE PROCEDURE "S 1".F_BRTRIG();
--Testcase 313:
INSERT INTO ft2 (c1,c2,c3) VALUES (1208, 818, 'fff');
--Testcase 314:
SELECT * FROM ft2 WHERE c1 = 1208;
--Testcase 315:
INSERT INTO ft2 (c1,c2,c3,c6) VALUES (1218, 818, 'ggg', '(--;');
--Testcase 316:
SELECT * FROM ft2 WHERE c1 = 1218;
--Testcase 317:
UPDATE ft2 SET c2 = c2 + 600, c3 = c3 WHERE c1 % 10 = 8 AND c1 < 1200;
--Testcase 318:
SELECT * FROM ft2 WHERE c1 % 10 = 8 AND c1 < 1200;
-- Test errors thrown on remote side during update
-- create table in the remote server with check contraint
--Testcase 738:
CREATE FOREIGN TABLE ft1_constraint (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_svr OPTIONS (table 't1_constraint');
--Testcase 747:
INSERT INTO ft1_constraint SELECT * FROM ft1 ON CONFLICT DO NOTHING;
-- c2 must be greater than or equal to 0, so this case is ignored.
--Testcase 754:
INSERT INTO ft1_constraint(c1, c2) VALUES (2222, -2) ON CONFLICT DO NOTHING; -- ignore, do nothing
--Testcase 755:
SELECT c1, c2 FROM ft1_constraint WHERE c1 = 2222 or c2 = -2; -- empty result
--Testcase 748:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 749:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
--Testcase 319:
INSERT INTO ft1(c1, c2) VALUES(11, 12); -- duplicate key
--Testcase 320:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO NOTHING; -- unsupported
--Testcase 321:
INSERT INTO ft1(c1, c2) VALUES(11, 12) ON CONFLICT (c1, c2) DO UPDATE SET c3 = 'ffg'; -- unsupported
--Testcase 743:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 744:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 750:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_constraint;
--Testcase 751:
ALTER FOREIGN TABLE ft1_org RENAME TO ft1;
-- Test savepoint/rollback behavior
--Testcase 322:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 323:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
begin;
--Testcase 324:
update ft2 set c2 = 42 where c2 = 0;
--Testcase 325:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s1;
--Testcase 326:
update ft2 set c2 = 44 where c2 = 4;
--Testcase 327:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s1;
--Testcase 328:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s2;
--Testcase 329:
update ft2 set c2 = 46 where c2 = 6;
--Testcase 330:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
rollback to savepoint s2;
--Testcase 331:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s2;
--Testcase 332:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
savepoint s3;
--Testcase 333:
--skip, does not support CHECK
--update ft2 set c2 = -2 where c2 = 42 and c1 = 10; -- fail on remote side
rollback to savepoint s3;
--Testcase 334:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
release savepoint s3;
--Testcase 335:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
-- none of the above is committed yet remotely
--Testcase 336:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
commit;
--Testcase 337:
select c2, count(*) from ft2 where c2 < 500 group by 1 order by 1;
--Testcase 338:
select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
--VACUUM ANALYZE "S 1"."T 1";
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
-- FIRST behavior here.
-- ORDER BY DESC NULLS LAST options
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
--Testcase 340:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS LAST, c1 OFFSET 795 LIMIT 10;
-- ORDER BY DESC NULLS FIRST options
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 342:
SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- ORDER BY ASC NULLS FIRST options
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
--Testcase 344:
SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10;
-- Test ReScan code path that recreates the cursor even when no parameters
-- change (bug #17889)
--Testcase 1032:
CREATE FOREIGN TABLE loct1_rescan (c1 int OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'loct1_rescan');
--Testcase 1033:
CREATE FOREIGN TABLE loct2_rescan (c1 int OPTIONS (key 'true'), c2 text) SERVER sqlite_svr OPTIONS (table 'loct2_rescan');
--Testcase 1034:
INSERT INTO loct1_rescan VALUES (1001);
--Testcase 1035:
INSERT INTO loct1_rescan VALUES (1002);
--Testcase 1036:
INSERT INTO loct2_rescan SELECT id, to_char(id, 'FM0000') FROM generate_series(1, 1000) id;
--Testcase 1037:
INSERT INTO loct2_rescan VALUES (1001, 'foo');
--Testcase 1038:
INSERT INTO loct2_rescan VALUES (1002, 'bar');
--Testcase 1039:
CREATE FOREIGN TABLE remt2_rescan (c1 int OPTIONS (key 'true'), c2 text) SERVER sqlite_svr OPTIONS (table 'loct2_rescan');
-- ANALYZE loct1_rescan;
-- ANALYZE remt2_rescan;
SET enable_mergejoin TO false;
SET enable_hashjoin TO false;
SET enable_material TO false;
--Testcase 1040:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE remt2_rescan SET c2 = remt2_rescan.c2 || remt2_rescan.c2 FROM loct1_rescan WHERE loct1_rescan.c1 = remt2_rescan.c1;
--Testcase 1041:
UPDATE remt2_rescan SET c2 = remt2_rescan.c2 || remt2_rescan.c2 FROM loct1_rescan WHERE loct1_rescan.c1 = remt2_rescan.c1;
--Testcase 1042:
SELECT remt2_rescan.* FROM loct1_rescan, remt2_rescan WHERE loct1_rescan.c1 = remt2_rescan.c1;
RESET enable_mergejoin;
RESET enable_hashjoin;
RESET enable_material;
--Testcase 1043:
DROP FOREIGN TABLE loct1_rescan;
--Testcase 1044:
DROP FOREIGN TABLE loct2_rescan;
--Testcase 1045:
DROP FOREIGN TABLE remt2_rescan;
-- ===================================================================
-- test check constraints
-- ===================================================================
--Testcase 752:
ALTER FOREIGN TABLE ft1 RENAME TO ft1_org;
--Testcase 753:
ALTER FOREIGN TABLE ft1_constraint RENAME TO ft1;
-- Consistent check constraints provide consistent results
--Testcase 814:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2positive CHECK (c2 >= 0);
--Testcase 587:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 588:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 815:
SET constraint_exclusion = 'on';
--Testcase 589:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 590:
SELECT count(*) FROM ft1 WHERE c2 < 0;
--Testcase 816:
RESET constraint_exclusion;
-- check constraint is enforced on the remote side, not locally
--Testcase 745:
INSERT INTO ft1(c1, c2) VALUES(1111, -2); -- c2positive
--Testcase 746:
UPDATE ft1 SET c2 = -c2 WHERE c1 = 1; -- c2positive
--Testcase 817:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2positive;
-- But inconsistent check constraints provide inconsistent results
--Testcase 818:
ALTER FOREIGN TABLE ft1 ADD CONSTRAINT ft1_c2negative CHECK (c2 < 0);
--Testcase 591:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 592:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 819:
SET constraint_exclusion = 'on';
--Testcase 593:
EXPLAIN (VERBOSE, COSTS OFF) SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 594:
SELECT count(*) FROM ft1 WHERE c2 >= 0;
--Testcase 820:
RESET constraint_exclusion;
-- local check constraint is not actually enforced
--Testcase 595:
INSERT INTO ft1(c1, c2) VALUES(1111, 2);
--Testcase 596:
UPDATE ft1 SET c2 = c2 + 1 WHERE c1 = 1;
--Testcase 821:
ALTER FOREIGN TABLE ft1 DROP CONSTRAINT ft1_c2negative;
-- ===================================================================
-- test WITH CHECK OPTION constraints
-- ===================================================================
--Testcase 597:
CREATE FUNCTION row_before_insupd_trigfunc() RETURNS trigger AS $$BEGIN NEW.a := NEW.a + 10; RETURN NEW; END$$ LANGUAGE plpgsql;
--Testcase 598:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 599:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 600:
CREATE VIEW rw_view AS SELECT * FROM foreign_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 601:
\d+ rw_view
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 602:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 603:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 604:
INSERT INTO rw_view VALUES (0, 15); -- error
--Testcase 605:
SELECT * FROM foreign_tbl;
--Testcase 606:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 607:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 608:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 609:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 610:
SELECT * FROM foreign_tbl;
-- We don't allow batch insert when there are any WCO constraints
ALTER SERVER sqlite_svr OPTIONS (ADD batch_size '10');
--Testcase 989:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15), (1, 5);
--Testcase 990:
INSERT INTO rw_view VALUES (0, 15), (1, 5); -- should fail
--Testcase 991:
SELECT * FROM foreign_tbl;
ALTER SERVER sqlite_svr OPTIONS (DROP batch_size);
--Testcase 611:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 612:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
-- test WCO for partitions
--Testcase 613:
CREATE FOREIGN TABLE foreign_tbl (a int OPTIONS (key 'true'), b int)
SERVER sqlite_svr;
--Testcase 614:
CREATE TRIGGER row_before_insupd_trigger BEFORE INSERT OR UPDATE ON foreign_tbl FOR EACH ROW EXECUTE PROCEDURE row_before_insupd_trigfunc();
--Testcase 615:
CREATE TABLE parent_tbl (a int, b int) PARTITION BY RANGE(a);
--Testcase 822:
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
-- Detach and re-attach once, to stress the concurrent detach case.
--Testcase 975:
ALTER TABLE parent_tbl DETACH PARTITION foreign_tbl CONCURRENTLY;
--Testcase 976:
ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES FROM (0) TO (100);
--Testcase 616:
CREATE VIEW rw_view AS SELECT * FROM parent_tbl
WHERE a < b WITH CHECK OPTION;
--Testcase 617:
\d+ rw_view
--Testcase 618:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 5);
--Testcase 619:
INSERT INTO rw_view VALUES (0, 5); -- should fail
--Testcase 620:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15);
--Testcase 621:
INSERT INTO rw_view VALUES (0, 15); -- ok
--Testcase 622:
SELECT * FROM foreign_tbl;
--Testcase 623:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 5;
--Testcase 624:
UPDATE rw_view SET b = b + 5; -- should fail
--Testcase 625:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE rw_view SET b = b + 15;
--Testcase 626:
UPDATE rw_view SET b = b + 15; -- ok
--Testcase 627:
SELECT * FROM foreign_tbl;
-- We don't allow batch insert when there are any WCO constraints
ALTER SERVER sqlite_svr OPTIONS (ADD batch_size '10');
--Testcase 992:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO rw_view VALUES (0, 15), (1, 5);
--Testcase 993:
INSERT INTO rw_view VALUES (0, 15), (1, 5); -- should fail
--Testcase 994:
SELECT * FROM foreign_tbl;
ALTER SERVER sqlite_svr OPTIONS (DROP batch_size);
--Testcase 628:
DROP TRIGGER row_before_insupd_trigger ON foreign_tbl;
--Testcase 629:
DROP FOREIGN TABLE foreign_tbl CASCADE;
--Testcase 630:
DROP TABLE parent_tbl CASCADE;
--Testcase 631:
DROP FUNCTION row_before_insupd_trigfunc;
-- -- Try a more complex permutation of WCO where there are multiple levels of
-- -- partitioned tables with columns not all in the same order
-- CREATE TABLE parent_tbl (a int, b text, c numeric) PARTITION BY RANGE(a);
-- CREATE TABLE sub_parent (c numeric, a int, b text) PARTITION BY RANGE(a);
-- ALTER TABLE parent_tbl ATTACH PARTITION sub_parent FOR VALUES FROM (1) TO (10);
-- CREATE TABLE child_local (b text, c numeric, a int);
-- CREATE FOREIGN TABLE child_foreign (b text, c numeric, a int)
-- SERVER loopback OPTIONS (table_name 'child_local');
-- ALTER TABLE sub_parent ATTACH PARTITION child_foreign FOR VALUES FROM (1) TO (10);
-- CREATE VIEW rw_view AS SELECT * FROM parent_tbl WHERE a < 5 WITH CHECK OPTION;
-- INSERT INTO parent_tbl (a) VALUES(1),(5);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- UPDATE rw_view SET b = 'text', c = 123.456;
-- UPDATE rw_view SET b = 'text', c = 123.456;
-- SELECT * FROM parent_tbl ORDER BY a;
-- DROP VIEW rw_view;
-- DROP TABLE child_local;
-- DROP FOREIGN TABLE child_foreign;
-- DROP TABLE sub_parent;
-- DROP TABLE parent_tbl;
-- ===================================================================
-- test serial columns (ie, sequence-based defaults)
-- ===================================================================
--Testcase 632:
create foreign table loc1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr;
--Testcase 633:
create foreign table rem1 (f1 serial, f2 text, id integer options (key 'true'))
server sqlite_svr options(table 'loc1');
--Testcase 352:
select pg_catalog.setval('rem1_f1_seq', 10, false);
--Testcase 353:
insert into loc1(f2) values('hi');
--Testcase 634:
insert into rem1(f2) values('hi remote');
--Testcase 354:
insert into loc1(f2) values('bye');
--Testcase 635:
insert into rem1(f2) values('bye remote');
--Testcase 355:
select f1, f2 from loc1;
--Testcase 636:
select f1, f2 from rem1;
-- ===================================================================
-- test generated columns
-- ===================================================================
--Testcase 637:
create foreign table grem1 (
a int options (key 'true'),
b int generated always as (a * 2) stored)
server sqlite_svr options(table 'grem1_post14');
--Testcase 638:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 823:
insert into grem1 (a) values (1), (2);
--Testcase 639:
explain (verbose, costs off)
update grem1 set a = 22 where a = 2;
--Testcase 824:
update grem1 set a = 22 where a = 2;
--Testcase 640:
select * from grem1;
--Testcase 825:
delete from grem1;
-- -- test copy from
-- copy grem1 from stdin;
-- 1
-- 2
-- \.
-- select * from grem1;
-- delete from grem1;
-- test batch insert
--Testcase 826:
alter server sqlite_svr options (add batch_size '10');
--Testcase 827:
explain (verbose, costs off)
insert into grem1 (a) values (1), (2);
--Testcase 828:
insert into grem1 (a) values (1), (2);
--Testcase 829:
select * from grem1;
--Testcase 830:
delete from grem1;
-- -- batch insert with foreign partitions.
-- -- This schema uses two partitions, one local and one remote with a modulo
-- -- to loop across all of them in batches.
-- create table tab_batch_local (id int, data text);
-- insert into tab_batch_local select i, 'test'|| i from generate_series(1, 45) i;
-- create table tab_batch_sharded (id int, data text) partition by hash(id);
-- create table tab_batch_sharded_p0 partition of tab_batch_sharded
-- for values with (modulus 2, remainder 0);
-- create table tab_batch_sharded_p1_remote (id int, data text);
-- create foreign table tab_batch_sharded_p1 partition of tab_batch_sharded
-- for values with (modulus 2, remainder 1)
-- server loopback options (table_name 'tab_batch_sharded_p1_remote');
-- insert into tab_batch_sharded select * from tab_batch_local;
-- select count(*) from tab_batch_sharded;
-- drop table tab_batch_local;
-- drop table tab_batch_sharded;
-- drop table tab_batch_sharded_p1_remote;
--Testcase 831:
alter server sqlite_svr options (drop batch_size);
-- ===================================================================
-- test local triggers
-- ===================================================================
-- Trigger functions "borrowed" from triggers regress test.
--Testcase 641:
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;$$;
--Testcase 642:
CREATE TRIGGER trig_stmt_before BEFORE DELETE OR INSERT OR UPDATE OR TRUNCATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 1005:
CREATE TRIGGER trig_stmt_after AFTER DELETE OR INSERT OR UPDATE OR TRUNCATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 644:
CREATE OR REPLACE FUNCTION trigger_data() RETURNS trigger
LANGUAGE plpgsql AS $$
declare
oldnew text[];
relid text;
argstr text;
begin
relid := TG_relid::regclass;
argstr := '';
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 '%(%) % % % ON %',
tg_name, argstr, TG_when, TG_level, TG_OP, relid;
oldnew := '{}'::text[];
if TG_OP != 'INSERT' then
oldnew := array_append(oldnew, format('OLD: %s', OLD));
end if;
if TG_OP != 'DELETE' then
oldnew := array_append(oldnew, format('NEW: %s', NEW));
end if;
RAISE NOTICE '%', array_to_string(oldnew, ',');
if TG_OP = 'DELETE' then
return OLD;
else
return NEW;
end if;
end;
$$;
-- Test basic functionality
--Testcase 645:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 646:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 356:
delete from rem1;
--Testcase 357:
insert into rem1 values(1,'insert');
--Testcase 358:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 359:
update rem1 set f2 = f2 || f2;
truncate rem1;
-- cleanup
--Testcase 647:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 648:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 649:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 650:
DROP TRIGGER trig_stmt_after ON rem1;
--Testcase 360:
DELETE from rem1;
-- Test multiple AFTER ROW triggers on a foreign table
--Testcase 651:
CREATE TRIGGER trig_row_after1
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 652:
CREATE TRIGGER trig_row_after2
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 653:
insert into rem1 values(1,'insert');
--Testcase 654:
update rem1 set f2 = 'update' where f1 = 1;
--Testcase 655:
update rem1 set f2 = f2 || f2;
--Testcase 656:
delete from rem1;
-- cleanup
--Testcase 657:
DROP TRIGGER trig_row_after1 ON rem1;
--Testcase 658:
DROP TRIGGER trig_row_after2 ON rem1;
-- Test WHEN conditions
--Testcase 659:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 660:
CREATE TRIGGER trig_row_after_insupd
AFTER INSERT OR UPDATE ON rem1
FOR EACH ROW
WHEN (NEW.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Insert or update not matching: nothing happens
--Testcase 363:
INSERT INTO rem1 values(1, 'insert');
--Testcase 364:
UPDATE rem1 set f2 = 'test';
-- Insert or update matching: triggers are fired
--Testcase 365:
INSERT INTO rem1 values(2, 'update');
--Testcase 366:
UPDATE rem1 set f2 = 'update update' where f1 = '2';
--Testcase 661:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 662:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW
WHEN (OLD.f2 like '%update%')
EXECUTE PROCEDURE trigger_data(23,'skidoo');
-- Trigger is fired for f1=2, not for f1=1
--Testcase 369:
DELETE FROM rem1;
-- cleanup
--Testcase 663:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 664:
DROP TRIGGER trig_row_after_insupd ON rem1;
--Testcase 665:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 666:
DROP TRIGGER trig_row_after_delete ON rem1;
-- Test various RETURN statements in BEFORE triggers.
--Testcase 667:
CREATE FUNCTION trig_row_before_insupdate() RETURNS TRIGGER AS $$
BEGIN
NEW.f2 := NEW.f2 || ' triggered !';
RETURN NEW;
END
$$ language plpgsql;
--Testcase 668:
CREATE TRIGGER trig_row_before_insupd
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
-- The new values should have 'triggered' appended
--Testcase 370:
INSERT INTO rem1 values(1, 'insert');
--Testcase 371:
SELECT f1, f2 from rem1;
--Testcase 372:
INSERT INTO rem1 values(2, 'insert');
--Testcase 373:
SELECT f1, f2 from rem1;
--Testcase 374:
UPDATE rem1 set f2 = '';
--Testcase 375:
SELECT f1, f2 from rem1;
--Testcase 376:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 377:
SELECT f1, f2 from rem1;
--Testcase 669:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f1 = 10; -- all columns should be transmitted
--Testcase 670:
UPDATE rem1 set f1 = 10;
--Testcase 671:
SELECT f1, f2 from rem1;
--Testcase 378:
DELETE FROM rem1;
-- Add a second trigger, to check that the changes are propagated correctly
-- from trigger to trigger
--Testcase 672:
CREATE TRIGGER trig_row_before_insupd2
BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 379:
INSERT INTO rem1 values(1, 'insert');
--Testcase 380:
SELECT f1, f2 from rem1;
--Testcase 381:
INSERT INTO rem1 values(2, 'insert');
--Testcase 382:
SELECT f1, f2 from rem1;
--Testcase 383:
UPDATE rem1 set f2 = '';
--Testcase 384:
SELECT f1, f2 from rem1;
--Testcase 385:
UPDATE rem1 set f2 = 'skidoo';
--Testcase 386:
SELECT f1, f2 from rem1;
--Testcase 673:
DROP TRIGGER trig_row_before_insupd ON rem1;
--Testcase 674:
DROP TRIGGER trig_row_before_insupd2 ON rem1;
--Testcase 387:
DELETE from rem1;
--Testcase 388:
INSERT INTO rem1 VALUES (1, 'test');
-- Test with a trigger returning NULL
--Testcase 675:
CREATE FUNCTION trig_null() RETURNS TRIGGER AS $$
BEGIN
RETURN NULL;
END
$$ language plpgsql;
--Testcase 676:
CREATE TRIGGER trig_null
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_null();
-- Nothing should have changed.
--Testcase 389:
INSERT INTO rem1 VALUES (2, 'test2');
--Testcase 390:
SELECT f1, f2 from rem1;
--Testcase 391:
UPDATE rem1 SET f2 = 'test2';
--Testcase 392:
SELECT f1, f2 from rem1;
--Testcase 393:
DELETE from rem1;
--Testcase 394:
SELECT f1, f2 from rem1;
--Testcase 677:
DROP TRIGGER trig_null ON rem1;
--Testcase 395:
DELETE from rem1;
-- Test a combination of local and remote triggers
--Testcase 678:
CREATE TRIGGER trig_row_before
BEFORE INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 679:
CREATE TRIGGER trig_row_after
AFTER INSERT OR UPDATE OR DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 680:
CREATE TRIGGER trig_local_before BEFORE INSERT OR UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trig_row_before_insupdate();
--Testcase 681:
INSERT INTO rem1(f2) VALUES ('test');
--Testcase 682:
UPDATE rem1 SET f2 = 'testo';
-- Test returning a system attribute
--Testcase 683:
INSERT INTO rem1(f2) VALUES ('test');
-- cleanup
--Testcase 684:
DROP TRIGGER trig_row_before ON rem1;
--Testcase 685:
DROP TRIGGER trig_row_after ON rem1;
--Testcase 686:
DROP TRIGGER trig_local_before ON rem1;
-- Test direct foreign table modification functionality
--Testcase 832:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 833:
EXPLAIN (verbose, costs off)
DELETE FROM rem1 WHERE false; -- currently can't be pushed down
-- Test with statement-level triggers
--Testcase 687:
CREATE TRIGGER trig_stmt_before
BEFORE DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 396:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 397:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 688:
DROP TRIGGER trig_stmt_before ON rem1;
--Testcase 689:
CREATE TRIGGER trig_stmt_after
AFTER DELETE OR INSERT OR UPDATE ON rem1
FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func();
--Testcase 398:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 399:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 690:
DROP TRIGGER trig_stmt_after ON rem1;
-- Test with row-level ON INSERT triggers
--Testcase 691:
CREATE TRIGGER trig_row_before_insert
BEFORE INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 400:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 401:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 692:
DROP TRIGGER trig_row_before_insert ON rem1;
--Testcase 693:
CREATE TRIGGER trig_row_after_insert
AFTER INSERT ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 402:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 403:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 694:
DROP TRIGGER trig_row_after_insert ON rem1;
-- Test with row-level ON UPDATE triggers
--Testcase 695:
CREATE TRIGGER trig_row_before_update
BEFORE UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 404:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 405:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 696:
DROP TRIGGER trig_row_before_update ON rem1;
--Testcase 697:
CREATE TRIGGER trig_row_after_update
AFTER UPDATE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 406:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can't be pushed down
--Testcase 407:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can be pushed down
--Testcase 698:
DROP TRIGGER trig_row_after_update ON rem1;
-- Test with row-level ON DELETE triggers
--Testcase 699:
CREATE TRIGGER trig_row_before_delete
BEFORE DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 408:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 409:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 700:
DROP TRIGGER trig_row_before_delete ON rem1;
--Testcase 701:
CREATE TRIGGER trig_row_after_delete
AFTER DELETE ON rem1
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 410:
EXPLAIN (verbose, costs off)
UPDATE rem1 set f2 = ''; -- can be pushed down
--Testcase 411:
EXPLAIN (verbose, costs off)
DELETE FROM rem1; -- can't be pushed down
--Testcase 702:
DROP TRIGGER trig_row_after_delete ON rem1;
-- ===================================================================
-- test inheritance features
-- ===================================================================
--Testcase 703:
CREATE TABLE a (aa TEXT);
--Testcase 834:
ALTER TABLE a SET (autovacuum_enabled = 'false');
--Testcase 704:
CREATE FOREIGN TABLE b (aa TEXT OPTIONS (key 'true'), bb TEXT) INHERITS (a)
SERVER sqlite_svr OPTIONS (table 'loct');
--Testcase 412:
INSERT INTO a(aa) VALUES('aaa');
--Testcase 413:
INSERT INTO a(aa) VALUES('aaaa');
--Testcase 414:
INSERT INTO a(aa) VALUES('aaaaa');
--Testcase 415:
INSERT INTO b(aa) VALUES('bbb');
--Testcase 416:
INSERT INTO b(aa) VALUES('bbbb');
--Testcase 417:
INSERT INTO b(aa) VALUES('bbbbb');
--Testcase 418:
SELECT tableoid::regclass, * FROM a;
--Testcase 419:
SELECT tableoid::regclass, * FROM b;
--Testcase 420:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 421:
UPDATE a SET aa = 'zzzzzz' WHERE aa LIKE 'aaaa%';
--Testcase 422:
SELECT tableoid::regclass, * FROM a;
--Testcase 423:
SELECT tableoid::regclass, * FROM b;
--Testcase 424:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 425:
UPDATE b SET aa = 'new';
--Testcase 426:
SELECT tableoid::regclass, * FROM a;
--Testcase 427:
SELECT tableoid::regclass, * FROM b;
--Testcase 428:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 429:
UPDATE a SET aa = 'newtoo';
--Testcase 430:
SELECT tableoid::regclass, * FROM a;
--Testcase 431:
SELECT tableoid::regclass, * FROM b;
--Testcase 432:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 433:
DELETE FROM a;
--Testcase 434:
SELECT tableoid::regclass, * FROM a;
--Testcase 435:
SELECT tableoid::regclass, * FROM b;
--Testcase 436:
SELECT tableoid::regclass, * FROM ONLY a;
--Testcase 705:
DROP TABLE a CASCADE;
-- Check SELECT FOR UPDATE/SHARE with an inherited source table
--Testcase 706:
create table foo (f1 int, f2 int);
--Testcase 707:
create foreign table foo2 (f3 int OPTIONS (key 'true')) inherits (foo)
server sqlite_svr options (table 'loct1');
--Testcase 708:
create table bar (f1 int, f2 int);
--Testcase 709:
create foreign table bar2 (f3 int OPTIONS (key 'true')) inherits (bar)
server sqlite_svr options (table 'loct2');
--Testcase 835:
alter table foo set (autovacuum_enabled = 'false');
--Testcase 836:
alter table bar set (autovacuum_enabled = 'false');
--Testcase 437:
insert into foo values(1,1);
--Testcase 438:
insert into foo values(3,3);
--Testcase 439:
insert into foo2 values(2,2,2);
--Testcase 440:
insert into foo2 values(4,4,4);
--Testcase 441:
insert into bar values(1,11);
--Testcase 442:
insert into bar values(2,22);
--Testcase 443:
insert into bar values(6,66);
--Testcase 444:
insert into bar2 values(3,33,33);
--Testcase 445:
insert into bar2 values(4,44,44);
--Testcase 446:
insert into bar2 values(7,77,77);
--Testcase 447:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 448:
select * from bar where f1 in (select f1 from foo) for update;
--Testcase 449:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo) for share;
--Testcase 450:
select * from bar where f1 in (select f1 from foo) for share;
-- Now check SELECT FOR UPDATE/SHARE with an inherited source table,
-- where the parent is itself a foreign table
--Testcase 837:
create foreign table foo2child (f3 int) inherits (foo2)
server sqlite_svr options (table 'loct4_2');
--Testcase 838:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 839:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 840:
drop foreign table foo2child;
-- And with a local child relation of the foreign table parent
--Testcase 841:
create table foo2child (f3 int) inherits (foo2);
--Testcase 842:
explain (verbose, costs off)
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 843:
select * from bar where f1 in (select f1 from foo2) for share;
--Testcase 844:
drop table foo2child;
-- Check UPDATE with inherited target and an inherited source table
--Testcase 451:
explain (verbose, costs off)
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 452:
update bar set f2 = f2 + 100 where f1 in (select f1 from foo);
--Testcase 453:
select tableoid::regclass, * from bar order by 1,2;
-- Check UPDATE with inherited target and an appendrel subquery
--Testcase 454:
explain (verbose, costs off)
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 455:
update bar set f2 = f2 + 100
from
( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;
--Testcase 456:
select tableoid::regclass, * from bar order by 1,2;
-- Test forcing the remote server to produce sorted data for a merge join,
-- but the foreign table is an inheritance child.
--truncate table loct1;
--Testcase 710:
delete from foo2;
truncate table only foo;
\set num_rows_foo 2000
--Testcase 711:
insert into foo2 select generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2), generate_series(0, :num_rows_foo, 2);
--Testcase 712:
insert into foo select generate_series(1, :num_rows_foo, 2), generate_series(1, :num_rows_foo, 2);
--Testcase 845:
SET enable_hashjoin to false;
--Testcase 846:
SET enable_nestloop to false;
--alter foreign table foo2 options (use_remote_estimate 'true');
--create index i_loct1_f1 on loct1(f1);
--Testcase 713:
create index i_foo_f1 on foo(f1);
analyze foo;
--analyze loct1;
-- inner join; expressions in the clauses appear in the equivalence class list
--Testcase 714:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 715:
select foo.f1, foo2.f1 from foo join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
-- outer join; expressions in the clauses do not appear in equivalence class
-- list but no output change as compared to the previous query
--Testcase 716:
explain (verbose, costs off)
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 717:
select foo.f1, foo2.f1 from foo left join foo2 on (foo.f1 = foo2.f1) order by foo.f2 offset 10 limit 10;
--Testcase 847:
RESET enable_hashjoin;
--Testcase 848:
RESET enable_nestloop;
-- Test that WHERE CURRENT OF is not supported
begin;
declare c cursor for select * from bar where f1 = 7;
--Testcase 457:
fetch from c;
--Testcase 458:
update bar set f2 = null where current of c;
rollback;
--Testcase 459:
explain (verbose, costs off)
delete from foo where f1 < 5;
--Testcase 460:
delete from foo where f1 < 5;
--Testcase 461:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 462:
update bar set f2 = f2 + 100;
--Testcase 463:
select * from bar;
-- Test that UPDATE/DELETE with inherited target works with row-level triggers
--Testcase 718:
CREATE TRIGGER trig_row_before
BEFORE UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 719:
CREATE TRIGGER trig_row_after
AFTER UPDATE OR DELETE ON bar2
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 464:
explain (verbose, costs off)
update bar set f2 = f2 + 100;
--Testcase 465:
update bar set f2 = f2 + 100;
--Testcase 466:
explain (verbose, costs off)
delete from bar where f2 < 400;
--Testcase 467:
delete from bar where f2 < 400;
-- cleanup
--Testcase 720:
drop table foo cascade;
--Testcase 721:
drop table bar cascade;
-- Test pushing down UPDATE/DELETE joins to the remote server
--Testcase 722:
create table parent (a int, b text);
--Testcase 723:
create foreign table remt1 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct3');
--Testcase 724:
create foreign table remt2 (a int OPTIONS (key 'true'), b text)
server sqlite_svr options (table 'loct4');
--Testcase 849:
alter foreign table remt1 inherit parent;
--Testcase 468:
insert into remt1 values (1, 'foo');
--Testcase 469:
insert into remt1 values (2, 'bar');
--Testcase 470:
insert into remt2 values (1, 'foo');
--Testcase 471:
insert into remt2 values (2, 'bar');
--Testcase 472:
explain (verbose, costs off)
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 473:
update parent set b = parent.b || remt2.b from remt2 where parent.a = remt2.a;
--Testcase 474:
select * from parent inner join remt2 on (parent.a = remt2.a);
--Testcase 475:
explain (verbose, costs off)
delete from parent using remt2 where parent.a = remt2.a;
--Testcase 476:
delete from parent using remt2 where parent.a = remt2.a;
-- cleanup
--Testcase 725:
drop foreign table remt1;
--Testcase 726:
drop foreign table remt2;
--Testcase 727:
drop table parent;
/*
-- Skip these tests, sqlite fdw does not support partition table, check constraint, copy from
-- ===================================================================
-- test tuple routing for foreign-table partitions
-- ===================================================================
-- Test insert tuple routing
create table itrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table itrtest attach partition remp1 for values in (1);
alter table itrtest attach partition remp2 for values in (2);
insert into itrtest values (1, 'foo');
insert into itrtest values (1, 'bar') returning *;
insert into itrtest values (2, 'baz');
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
select tableoid::regclass, * FROM itrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
delete from itrtest;
-- MERGE ought to fail cleanly
merge into itrtest using (select 1, 'foo') as source on (true)
when matched then do nothing;
create unique index loct1_idx on loct1 (a);
-- DO NOTHING without an inference specification is supported
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
insert into itrtest values (1, 'foo') on conflict do nothing returning *;
-- But other cases are not supported
insert into itrtest values (1, 'bar') on conflict (a) do nothing;
insert into itrtest values (1, 'bar') on conflict (a) do update set b = excluded.b;
select tableoid::regclass, * FROM itrtest;
delete from itrtest;
drop index loct1_idx;
-- Test that remote triggers work with insert tuple routing
create function br_insert_trigfunc() returns trigger as $$
begin
new.b := new.b || ' triggered !';
return new;
end
$$ language plpgsql;
create trigger loct1_br_insert_trigger before insert on loct1
for each row execute procedure br_insert_trigfunc();
create trigger loct2_br_insert_trigger before insert on loct2
for each row execute procedure br_insert_trigfunc();
-- The new values are concatenated with ' triggered !'
insert into itrtest values (1, 'foo') returning *;
insert into itrtest values (2, 'qux') returning *;
insert into itrtest values (1, 'test1'), (2, 'test2') returning *;
with result as (insert into itrtest values (1, 'test1'), (2, 'test2') returning *) select * from result;
drop trigger loct1_br_insert_trigger on loct1;
drop trigger loct2_br_insert_trigger on loct2;
drop table itrtest;
drop table loct1;
drop table loct2;
-- Test update tuple routing
create table utrtest (a int, b text) partition by list (a);
create table loct (a int check (a in (1)), b text);
create foreign table remp (a int check (a in (1)), b text) server loopback options (table_name 'loct');
create table locp (a int check (a in (2)), b text);
alter table utrtest attach partition remp for values in (1);
alter table utrtest attach partition locp for values in (2);
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- It's not allowed to move a row from a partition that is foreign to another
update utrtest set a = 2 where b = 'foo' returning *;
-- But the reverse is allowed
update utrtest set a = 1 where b = 'qux' returning *;
select tableoid::regclass, * FROM utrtest;
select tableoid::regclass, * FROM remp;
select tableoid::regclass, * FROM locp;
-- The executor should not let unexercised FDWs shut down
update utrtest set a = 1 where b = 'foo';
-- Test that remote triggers work with update tuple routing
create trigger loct_br_insert_trigger before insert on loct
for each row execute procedure br_insert_trigfunc();
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition is a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 1 or a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 1 or a = 2 returning *;
delete from utrtest;
insert into utrtest values (2, 'qux');
-- Check case where the foreign partition isn't a subplan target rel
explain (verbose, costs off)
update utrtest set a = 1 where a = 2 returning *;
-- The new values are concatenated with ' triggered !'
update utrtest set a = 1 where a = 2 returning *;
drop trigger loct_br_insert_trigger on loct;
-- We can move rows to a foreign partition that has been updated already,
-- but can't move rows to a foreign partition that hasn't been updated yet
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- Test the former case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 returning *;
update utrtest set a = 1 returning *;
delete from utrtest;
insert into utrtest values (1, 'foo');
insert into utrtest values (2, 'qux');
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
update utrtest set a = 1 from (values (1), (2)) s(x) where a = s.x returning *;
-- Change the definition of utrtest so that the foreign partition get updated
-- after the local partition
delete from utrtest;
alter table utrtest detach partition remp;
drop foreign table remp;
alter table loct drop constraint loct_a_check;
alter table loct add check (a in (3));
create foreign table remp (a int check (a in (3)), b text) server loopback options (table_name 'loct');
alter table utrtest attach partition remp for values in (3);
insert into utrtest values (2, 'qux');
insert into utrtest values (3, 'xyzzy');
-- Test the latter case:
-- with a direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 returning *;
update utrtest set a = 3 returning *; -- ERROR
-- with a non-direct modification plan
explain (verbose, costs off)
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *;
update utrtest set a = 3 from (values (2), (3)) s(x) where a = s.x returning *; -- ERROR
drop table utrtest;
drop table loct;
-- Test copy tuple routing
create table ctrtest (a int, b text) partition by list (a);
create table loct1 (a int check (a in (1)), b text);
create foreign table remp1 (a int check (a in (1)), b text) server loopback options (table_name 'loct1');
create table loct2 (a int check (a in (2)), b text);
create foreign table remp2 (b text, a int check (a in (2))) server loopback options (table_name 'loct2');
alter table ctrtest attach partition remp1 for values in (1);
alter table ctrtest attach partition remp2 for values in (2);
copy ctrtest from stdin;
1 foo
2 qux
\.
select tableoid::regclass, * FROM ctrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
-- Copying into foreign partitions directly should work as well
copy remp1 from stdin;
1 bar
\.
select tableoid::regclass, * FROM remp1;
delete from ctrtest;
-- Test copy tuple routing with the batch_size option enabled
alter server loopback options (add batch_size '2');
copy ctrtest from stdin;
1 foo
1 bar
2 baz
2 qux
1 test1
2 test2
\.
select tableoid::regclass, * FROM ctrtest;
select tableoid::regclass, * FROM remp1;
select tableoid::regclass, * FROM remp2;
delete from ctrtest;
alter server loopback options (drop batch_size);
drop table ctrtest;
drop table loct1;
drop table loct2;
-- ===================================================================
-- test COPY FROM
-- ===================================================================
create table loc2 (f1 int, f2 text);
alter table loc2 set (autovacuum_enabled = 'false');
create foreign table rem2 (f1 int, f2 text) server loopback options(table_name 'loc2');
-- Test basic functionality
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
delete from rem2;
-- Test check constraints
alter table loc2 add constraint loc2_f1positive check (f1 >= 0);
alter foreign table rem2 add constraint rem2_f1positive check (f1 >= 0);
-- check constraint is enforced on the remote side, not locally
copy rem2 from stdin;
1 foo
2 bar
\.
copy rem2 from stdin; -- ERROR
-1 xyzzy
\.
select * from rem2;
alter foreign table rem2 drop constraint rem2_f1positive;
alter table loc2 drop constraint loc2_f1positive;
delete from rem2;
-- Test local triggers
create trigger trig_stmt_before before insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_stmt_after after insert on rem2
for each statement execute procedure trigger_func();
create trigger trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before on rem2;
drop trigger trig_row_after on rem2;
drop trigger trig_stmt_before on rem2;
drop trigger trig_stmt_after on rem2;
delete from rem2;
create trigger trig_row_before_insert before insert on rem2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on rem2;
delete from rem2;
create trigger trig_null before insert on rem2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on rem2;
delete from rem2;
-- Test remote triggers
create trigger trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
-- The new values are concatenated with ' triggered !'
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_row_before_insert on loc2;
delete from rem2;
create trigger trig_null before insert on loc2
for each row execute procedure trig_null();
-- Nothing happens
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger trig_null on loc2;
delete from rem2;
-- Test a combination of local and remote triggers
create trigger rem2_trig_row_before before insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger rem2_trig_row_after after insert on rem2
for each row execute procedure trigger_data(23,'skidoo');
create trigger loc2_trig_row_before_insert before insert on loc2
for each row execute procedure trig_row_before_insupdate();
copy rem2 from stdin;
1 foo
2 bar
\.
select * from rem2;
drop trigger rem2_trig_row_before on rem2;
drop trigger rem2_trig_row_after on rem2;
drop trigger loc2_trig_row_before_insert on loc2;
delete from rem2;
-- test COPY FROM with foreign table created in the same transaction
create table loc3 (f1 int, f2 text);
begin;
create foreign table rem3 (f1 int, f2 text)
server loopback options(table_name 'loc3');
copy rem3 from stdin;
1 foo
2 bar
\.
commit;
select * from rem3;
drop foreign table rem3;
drop table loc3;
*/
-- Test COPY FROM with the batch_size option enabled
-- alter server loopback options (add batch_size '2');
-- -- Test basic functionality
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- select * from rem2;
-- delete from rem2;
-- -- Test check constraints
-- alter table loc2 add constraint loc2_f1positive check (f1 >= 0);
-- alter foreign table rem2 add constraint rem2_f1positive check (f1 >= 0);
-- -- check constraint is enforced on the remote side, not locally
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- copy rem2 from stdin; -- ERROR
-- -1 xyzzy
-- \.
-- select * from rem2;
-- alter foreign table rem2 drop constraint rem2_f1positive;
-- alter table loc2 drop constraint loc2_f1positive;
-- delete from rem2;
-- -- Test remote triggers
-- create trigger trig_row_before_insert before insert on loc2
-- for each row execute procedure trig_row_before_insupdate();
-- -- The new values are concatenated with ' triggered !'
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- select * from rem2;
-- drop trigger trig_row_before_insert on loc2;
-- delete from rem2;
-- create trigger trig_null before insert on loc2
-- for each row execute procedure trig_null();
-- -- Nothing happens
-- copy rem2 from stdin;
-- 1 foo
-- 2 bar
-- 3 baz
-- \.
-- select * from rem2;
-- drop trigger trig_null on loc2;
-- delete from rem2;
-- -- Check with zero-column foreign table; batch insert will be disabled
-- alter table loc2 drop column f1;
-- alter table loc2 drop column f2;
-- alter table rem2 drop column f1;
-- alter table rem2 drop column f2;
-- copy rem2 from stdin;
-- select * from rem2;
-- delete from rem2;
-- alter server loopback options (drop batch_size);
-- ===================================================================
-- test for TRUNCATE
-- ===================================================================
--Testcase 850:
CREATE FOREIGN TABLE tru_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable0');
--Testcase 851:
INSERT INTO "S 1".tru_rtable0 (SELECT x FROM generate_series(1,10) x);
-- CREATE TABLE tru_ptable (id int) PARTITION BY HASH(id);
-- CREATE TABLE tru_ptable__p0 PARTITION OF tru_ptable
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0);
-- CREATE TABLE tru_rtable1 (id int primary key);
-- CREATE FOREIGN TABLE tru_ftable__p1 (id int)
-- SERVER sqlite_svr OPTIONS (table 'tru_ptable');
-- INSERT INTO tru_ptable (SELECT x FROM generate_series(11,20) x);
--Testcase 852:
INSERT INTO "S 1".tru_pk_table (SELECT x FROM generate_series(1,10) x);
--Testcase 853:
INSERT INTO "S 1".tru_fk_table(fkey) (SELECT x % 10 + 1 FROM generate_series(5,25) x);
--Testcase 854:
CREATE FOREIGN TABLE tru_pk_ftable (id int)
SERVER sqlite_svr OPTIONS (table 'tru_pk_table');
--Testcase 855:
CREATE FOREIGN TABLE tru_ftable_parent (id int)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_parent');
--Testcase 856:
CREATE FOREIGN TABLE tru_ftable_child () INHERITS (tru_ftable_parent)
SERVER sqlite_svr OPTIONS (table 'tru_rtable_child');
--Testcase 857:
INSERT INTO "S 1".tru_rtable_parent (SELECT x FROM generate_series(1,8) x);
--Testcase 858:
INSERT INTO "S 1".tru_rtable_child (SELECT x FROM generate_series(10, 18) x);
-- normal truncate
--Testcase 859:
SELECT sum(id) FROM tru_ftable; -- 55
TRUNCATE tru_ftable;
--Testcase 860:
SELECT count(*) FROM "S 1".tru_rtable0; -- 0
--Testcase 861:
SELECT count(*) FROM tru_ftable; -- 0
-- 'truncatable' option
--Testcase 862:
ALTER SERVER sqlite_svr OPTIONS (ADD truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 863:
ALTER FOREIGN TABLE tru_ftable OPTIONS (ADD truncatable 'true');
TRUNCATE tru_ftable; -- accepted
--Testcase 864:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 865:
ALTER SERVER sqlite_svr OPTIONS (DROP truncatable);
--Testcase 866:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'false');
TRUNCATE tru_ftable; -- error
--Testcase 867:
ALTER FOREIGN TABLE tru_ftable OPTIONS (SET truncatable 'true');
TRUNCATE tru_ftable; -- accepted
-- -- partitioned table with both local and foreign tables as partitions
-- SELECT sum(id) FROM tru_ptable; -- 155
-- TRUNCATE tru_ptable;
-- SELECT count(*) FROM tru_ptable; -- 0
-- SELECT count(*) FROM tru_ptable__p0; -- 0
-- SELECT count(*) FROM tru_ftable__p1; -- 0
-- SELECT count(*) FROM tru_rtable1; -- 0
-- 'CASCADE' option
--Testcase 868:
SELECT sum(id) FROM tru_pk_ftable; -- 55
-- SQLite FDW support TRUNCATE command by executing DELETE statement without WHERE clause.
-- In order to delete records in parent and child table subsequently,
-- SQLite FDW executes "PRAGMA foreign_keys = ON" before executing DELETE statement.
TRUNCATE tru_pk_ftable; -- success
TRUNCATE tru_pk_ftable CASCADE; -- success
--Testcase 869:
SELECT count(*) FROM tru_pk_ftable; -- 0
--Testcase 870:
SELECT count(*) FROM "S 1".tru_fk_table; -- also truncated,0
-- truncate two tables at a command
--Testcase 871:
INSERT INTO tru_ftable (SELECT x FROM generate_series(1,8) x);
--Testcase 872:
INSERT INTO tru_pk_ftable (SELECT x FROM generate_series(3,10) x);
--Testcase 873:
SELECT count(*) from tru_ftable; -- 8
--Testcase 874:
SELECT count(*) from tru_pk_ftable; -- 8
TRUNCATE tru_ftable, tru_pk_ftable;
--Testcase 875:
SELECT count(*) from tru_ftable; -- 0
--Testcase 876:
SELECT count(*) from tru_pk_ftable; -- 0
-- truncate with ONLY clause
-- Since ONLY is specified, the table tru_ftable_child that inherits
-- tru_ftable_parent locally is not truncated.
TRUNCATE ONLY tru_ftable_parent;
--Testcase 877:
SELECT sum(id) FROM tru_ftable_parent; -- 126
TRUNCATE tru_ftable_parent;
--Testcase 878:
SELECT count(*) FROM tru_ftable_parent; -- 0
-- -- in case when remote table has inherited children
-- CREATE TABLE tru_rtable0_child () INHERITS (tru_rtable0);
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(5,9) x);
-- INSERT INTO "S 1".tru_rtable0_child (SELECT x FROM generate_series(10,14) x);
-- SELECT sum(id) FROM tru_ftable; -- 95
-- -- Both parent and child tables in the foreign server are truncated
-- -- even though ONLY is specified because ONLY has no effect
-- -- when truncating a foreign table.
-- TRUNCATE ONLY tru_ftable;
-- SELECT count(*) FROM tru_ftable; -- 0
-- INSERT INTO tru_rtable0 (SELECT x FROM generate_series(21,25) x);
-- INSERT INTO tru_rtable0_child (SELECT x FROM generate_series(26,30) x);
-- SELECT sum(id) FROM tru_ftable; -- 255
-- TRUNCATE tru_ftable; -- truncate both of parent and child
-- SELECT count(*) FROM tru_ftable; -- 0
-- cleanup
--Testcase 879:
DROP FOREIGN TABLE tru_ftable_parent, tru_ftable_child, tru_pk_ftable,tru_ftable;
-- DROP TABLE tru_rtable0, tru_rtable1, tru_ptable, tru_ptable__p0, tru_pk_table, tru_fk_table,
-- tru_rtable_parent,tru_rtable_child, tru_rtable0_child;
-- ===================================================================
-- test IMPORT FOREIGN SCHEMA
-- ===================================================================
--Testcase 728:
CREATE SCHEMA import_dest1;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest1;
--Testcase 477:
\det+ import_dest1.*
--Testcase 478:
\d import_dest1.*
-- Options
--Testcase 729:
CREATE SCHEMA import_dest2;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest2
OPTIONS (import_default 'true');
--Testcase 479:
\det+ import_dest2.*
--Testcase 480:
\d import_dest2.*
-- Check LIMIT TO and EXCEPT
--Testcase 730:
CREATE SCHEMA import_dest3;
IMPORT FOREIGN SCHEMA public LIMIT TO ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 481:
\det+ import_dest3.*
IMPORT FOREIGN SCHEMA public EXCEPT ("T 1", loct6, nonesuch)
FROM SERVER sqlite_svr INTO import_dest3;
--Testcase 482:
\det+ import_dest3.*
-- Assorted error cases
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO import_dest3;
IMPORT FOREIGN SCHEMA public FROM SERVER sqlite_svr INTO notthere;
IMPORT FOREIGN SCHEMA public FROM SERVER nowhere INTO notthere;
/*
-- Skip these test, sqlite fdw does not support fetch_size option, partition table
-- Check case of a type present only on the remote server.
-- We can fake this by dropping the type locally in our transaction.
CREATE TYPE "Colors" AS ENUM ('red', 'green', 'blue');
CREATE TABLE import_source.t5 (c1 int, c2 text collate "C", "Col" "Colors");
CREATE SCHEMA import_dest5;
BEGIN;
DROP TYPE "Colors" CASCADE;
IMPORT FOREIGN SCHEMA import_source LIMIT TO (t5)
FROM SERVER loopback INTO import_dest5; -- ERROR
ROLLBACK;
BEGIN;
CREATE SERVER fetch101 FOREIGN DATA WRAPPER postgres_fdw OPTIONS( fetch_size '101' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
ALTER SERVER fetch101 OPTIONS( SET fetch_size '202' );
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=101'];
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'fetch101'
AND srvoptions @> array['fetch_size=202'];
CREATE FOREIGN TABLE table30000 ( x int ) SERVER fetch101 OPTIONS ( fetch_size '30000' );
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '60000');
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=30000'];
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30000'::regclass
AND ftoptions @> array['fetch_size=60000'];
ROLLBACK;
-- ===================================================================
-- test partitionwise joins
-- ===================================================================
SET enable_partitionwise_join=on;
CREATE TABLE fprt1 (a int, b int, c varchar) PARTITION BY RANGE(a);
CREATE TABLE fprt1_p1 (LIKE fprt1);
CREATE TABLE fprt1_p2 (LIKE fprt1);
ALTER TABLE fprt1_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt1_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt1_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 2) i;
INSERT INTO fprt1_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 2) i;
CREATE FOREIGN TABLE ftprt1_p1 PARTITION OF fprt1 FOR VALUES FROM (0) TO (250)
SERVER loopback OPTIONS (table_name 'fprt1_p1', use_remote_estimate 'true');
CREATE FOREIGN TABLE ftprt1_p2 PARTITION OF fprt1 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (TABLE_NAME 'fprt1_p2');
ANALYZE fprt1;
ANALYZE fprt1_p1;
ANALYZE fprt1_p2;
CREATE TABLE fprt2 (a int, b int, c varchar) PARTITION BY RANGE(b);
CREATE TABLE fprt2_p1 (LIKE fprt2);
CREATE TABLE fprt2_p2 (LIKE fprt2);
ALTER TABLE fprt2_p1 SET (autovacuum_enabled = 'false');
ALTER TABLE fprt2_p2 SET (autovacuum_enabled = 'false');
INSERT INTO fprt2_p1 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(0, 249, 3) i;
INSERT INTO fprt2_p2 SELECT i, i, to_char(i/50, 'FM0000') FROM generate_series(250, 499, 3) i;
CREATE FOREIGN TABLE ftprt2_p1 (b int, c varchar, a int)
SERVER loopback OPTIONS (table_name 'fprt2_p1', use_remote_estimate 'true');
ALTER TABLE fprt2 ATTACH PARTITION ftprt2_p1 FOR VALUES FROM (0) TO (250);
CREATE FOREIGN TABLE ftprt2_p2 PARTITION OF fprt2 FOR VALUES FROM (250) TO (500)
SERVER loopback OPTIONS (table_name 'fprt2_p2', use_remote_estimate 'true');
ANALYZE fprt2;
ANALYZE fprt2_p1;
ANALYZE fprt2_p2;
-- inner join three tables
EXPLAIN (COSTS OFF)
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t3.c FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) INNER JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a % 25 =0 ORDER BY 1,2,3;
-- left outer join + nullable clause
EXPLAIN (VERBOSE, COSTS OFF)
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
SELECT t1.a,t2.b,t2.c FROM fprt1 t1 LEFT JOIN (SELECT * FROM fprt2 WHERE a < 10) t2 ON (t1.a = t2.b and t1.b = t2.a) WHERE t1.a < 10 ORDER BY 1,2,3;
-- with whole-row reference; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
SELECT t1.wr, t2.wr FROM (SELECT t1 wr, a FROM fprt1 t1 WHERE t1.a % 25 = 0) t1 FULL JOIN (SELECT t2 wr, b FROM fprt2 t2 WHERE t2.b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY 1,2;
-- join with lateral reference
EXPLAIN (COSTS OFF)
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
SELECT t1.a,t1.b FROM fprt1 t1, LATERAL (SELECT t2.a, t2.b FROM fprt2 t2 WHERE t1.a = t2.b AND t1.b = t2.a) q WHERE t1.a%25 = 0 ORDER BY 1,2;
-- with PHVs, partitionwise join selected but no join pushdown
EXPLAIN (COSTS OFF)
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE a % 25 = 0) t1 FULL JOIN (SELECT 't2_phv' phv, * FROM fprt2 WHERE b % 25 = 0) t2 ON (t1.a = t2.b) ORDER BY t1.a, t2.b;
-- test FOR UPDATE; partitionwise join does not apply
EXPLAIN (COSTS OFF)
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
RESET enable_partitionwise_join;
-- ===================================================================
-- test partitionwise aggregates
-- ===================================================================
CREATE TABLE pagg_tab (a int, b int, c text) PARTITION BY RANGE(a);
CREATE TABLE pagg_tab_p1 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p2 (LIKE pagg_tab);
CREATE TABLE pagg_tab_p3 (LIKE pagg_tab);
INSERT INTO pagg_tab_p1 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 10;
INSERT INTO pagg_tab_p2 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 20 and (i % 30) >= 10;
INSERT INTO pagg_tab_p3 SELECT i % 30, i % 50, to_char(i/30, 'FM0000') FROM generate_series(1, 3000) i WHERE (i % 30) < 30 and (i % 30) >= 20;
-- Create foreign partitions
CREATE FOREIGN TABLE fpagg_tab_p1 PARTITION OF pagg_tab FOR VALUES FROM (0) TO (10) SERVER loopback OPTIONS (table_name 'pagg_tab_p1');
CREATE FOREIGN TABLE fpagg_tab_p2 PARTITION OF pagg_tab FOR VALUES FROM (10) TO (20) SERVER loopback OPTIONS (table_name 'pagg_tab_p2');
CREATE FOREIGN TABLE fpagg_tab_p3 PARTITION OF pagg_tab FOR VALUES FROM (20) TO (30) SERVER loopback OPTIONS (table_name 'pagg_tab_p3');
ANALYZE pagg_tab;
ANALYZE fpagg_tab_p1;
ANALYZE fpagg_tab_p2;
ANALYZE fpagg_tab_p3;
-- When GROUP BY clause matches with PARTITION KEY.
-- Plan with partitionwise aggregates is disabled
SET enable_partitionwise_aggregate TO false;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Plan with partitionwise aggregates is enabled
SET enable_partitionwise_aggregate TO true;
EXPLAIN (COSTS OFF)
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- Check with whole-row reference
-- Should have all the columns in the target list for the given relation
EXPLAIN (VERBOSE, COSTS OFF)
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
-- When GROUP BY clause does not match with PARTITION KEY.
EXPLAIN (COSTS OFF)
SELECT b, avg(a), max(a), count(*) FROM pagg_tab GROUP BY b HAVING sum(a) < 700 ORDER BY 1;
*/
/*
-- Skip these tests, sqlite fdw does not support nosuper user.
-- ===================================================================
-- access rights and superuser
-- ===================================================================
-- Non-superuser cannot create a FDW without a password in the connstr
CREATE ROLE regress_nosuper NOSUPERUSER;
GRANT USAGE ON FOREIGN DATA WRAPPER sqlite_fdw TO regress_nosuper;
SET ROLE regress_nosuper;
SHOW is_superuser;
-- This will be OK, we can create the FDW
DO $d$
BEGIN
EXECUTE $$CREATE SERVER sqlite_nopw FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/post.db')$$;
END;
$d$;
-- But creation of user mappings for non-superusers should fail
CREATE USER MAPPING FOR public SERVER sqlite_nopw;
CREATE USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
CREATE FOREIGN TABLE ft1_nopw (
c1 int OPTIONS (key 'true'),
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10) default 'ft1',
c8 text
) SERVER sqlite_nopw;
ALTER FOREIGN TABLE ft1_nopw OPTIONS (table 'T 1');
ALTER FOREIGN TABLE ft1_nopw ALTER COLUMN c1 OPTIONS (column_name 'C 1');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- If we add a password to the connstr it'll fail, because we don't allow passwords
-- in connstrs only in user mappings.
ALTER SERVER loopback_nopw OPTIONS (ADD password 'dummypw');
-- If we add a password for our user mapping instead, we should get a different
-- error because the password wasn't actually *used* when we run with trust auth.
--
-- This won't work with installcheck, but neither will most of the FDW checks.
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password 'dummypw');
SELECT 1 FROM ft1_nopw LIMIT 1;
-- Unpriv user cannot make the mapping passwordless
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- But the superuser can
ALTER USER MAPPING FOR regress_nosuper SERVER sqlite_nopw OPTIONS (ADD password_required 'false');
SET ROLE regress_nosuper;
-- Should finally work now
SELECT 1 FROM ft1_nopw LIMIT 1;
-- unpriv user also cannot set sslcert / sslkey on the user mapping
-- first set password_required so we see the right error messages
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (SET password_required 'true');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslcert 'foo.crt');
ALTER USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw OPTIONS (ADD sslkey 'foo.key');
-- We're done with the role named after a specific user and need to check the
-- changes to the public mapping.
DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_nopw;
-- This will fail again as it'll resolve the user mapping for public, which
-- lacks password_required=false
SELECT 1 FROM ft1_nopw LIMIT 1;
RESET ROLE;
-- The user mapping for public is passwordless and lacks the password_required=false
-- mapping option, but will work because the current user is a superuser.
SELECT 1 FROM ft1_nopw LIMIT 1;
-- cleanup
DROP USER MAPPING FOR public SERVER sqlite_nopw;
DROP OWNED BY regress_nosuper;
DROP ROLE regress_nosuper;
-- Clean-up
RESET enable_partitionwise_aggregate;
*/
-- Two-phase transactions are not supported.
BEGIN;
--Testcase 731:
SELECT count(*) FROM ft1;
-- error here
--Testcase 732:
PREPARE TRANSACTION 'fdw_tpc';
ROLLBACK;
-- ===================================================================
-- reestablish new connection
-- ===================================================================
-- -- Test case relative with option application_name is not suitable for SQLite FDW.
-- -- Because this option is in libpq of postgres.
-- -- Change application_name of remote connection to special one
-- -- so that we can easily terminate the connection later.
-- ALTER SERVER sqlite_svr OPTIONS (application_name 'fdw_retry_check');
-- -- Make sure we have a remote connection.
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- Terminate the remote connection and wait for the termination to complete.
-- (If a cache flush happens, the remote connection might have already been
-- dropped; so code this step in a way that doesn't fail if no connection.)
-- DO $$ BEGIN
-- PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- END $$;
-- -- This query should detect the broken connection when starting new remote
-- -- transaction, reestablish new connection, and then succeed.
-- BEGIN;
-- SELECT 1 FROM ft1 LIMIT 1;
-- -- If we detect the broken connection when starting a new remote
-- -- subtransaction, we should fail instead of establishing a new connection.
-- -- Terminate the remote connection and wait for the termination to complete.
-- DO $$ BEGIN
-- PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity
-- WHERE application_name = 'fdw_retry_check';
-- END $$;
-- SAVEPOINT s;
-- -- The text of the error might vary across platforms, so only show SQLSTATE.
-- \set VERBOSITY sqlstate
-- SELECT 1 FROM ft1 LIMIT 1; -- should fail
-- \set VERBOSITY default
-- COMMIT;
-- =============================================================================
-- test connection invalidation cases and sqlite_fdw_get_connections function
-- =============================================================================
-- Let's ensure to close all the existing cached connections.
--Testcase 880:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 881:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- This test case is for closing the connection in sqlitefdw_xact_callback
BEGIN;
-- Connection xact depth becomes 1 i.e. the connection is in midst of the xact.
--Testcase 882:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 883:
SELECT 1 FROM ft7 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3 should be
-- output.
--Testcase 884:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Connections are not closed at the end of the alter and drop statements.
-- That's because the connections are in midst of this xact,
-- they are just marked as invalid in sqlitefdw_inval_callback.
--Testcase 885:
ALTER SERVER sqlite_svr OPTIONS (ADD keep_connections 'off');
--Testcase 886:
DROP SERVER sqlite_svr3 CASCADE;
-- List all the existing cached connections. sqlite_svr and sqlite_svr3
-- should be output as invalid connections. Also the server name for
-- sqlite_svr3 should be NULL because the server was dropped.
--Testcase 887:
SELECT * FROM sqlite_fdw_get_connections() ORDER BY 1;
-- The invalid connections get closed in sqlitefdw_xact_callback during commit.
COMMIT;
--Testcase 888:
ALTER SERVER sqlite_svr OPTIONS (DROP keep_connections);
-- All cached connections were closed while committing above xact, so no
-- records should be output.
--Testcase 889:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =======================================================================
-- test sqlite_fdw_disconnect and sqlite_fdw_disconnect_all functions
-- =======================================================================
BEGIN;
-- Ensure to cache loopback connection.
--Testcase 890:
SELECT 1 FROM ft1 LIMIT 1;
-- Ensure to cache loopback2 connection.
--Testcase 891:
SELECT 1 FROM ft6 LIMIT 1;
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 892:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Issue a warning and return false as sqlite_svr connection is still in use and
-- can not be closed.
--Testcase 893:
SELECT sqlite_fdw_disconnect('sqlite_svr');
-- List all the existing cached connections. sqlite_svr and sqlite_svr2 should be
-- output.
--Testcase 894:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Return false as connections are still in use, warnings are issued.
-- But disable warnings temporarily because the order of them is not stable.
--Testcase 895:
SET client_min_messages = 'ERROR';
--Testcase 896:
SELECT sqlite_fdw_disconnect_all();
--Testcase 897:
RESET client_min_messages;
COMMIT;
-- Ensure that sqlite_svr2 connection is closed.
--Testcase 898:
SELECT 1 FROM sqlite_fdw_disconnect('sqlite_svr2');
--Testcase 899:
SELECT server_name FROM sqlite_fdw_get_connections() WHERE server_name = 'sqlite_svr2';
-- Return false as sqlite_svr2 connection is closed already.
--Testcase 900:
SELECT sqlite_fdw_disconnect('sqlite_svr2');
-- Return an error as there is no foreign server with given name.
--Testcase 901:
SELECT sqlite_fdw_disconnect('unknownserver');
-- Let's ensure to close all the existing cached connections.
--Testcase 902:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 903:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- =============================================================================
-- test case for having multiple cached connections for a foreign server
-- SQLite FDW does not support User Mapping, so cached connection is identified
-- by only serverid (not like other FDWs use key including serverid and userid),
-- and there is only one server for all users, so there is only one cached connection.
-- In case of using key including serverid and userid, if many users are used,
-- there will be many cached connections.
-- =============================================================================
--Testcase 904:
CREATE ROLE regress_multi_conn_user1 SUPERUSER;
--Testcase 905:
CREATE ROLE regress_multi_conn_user2 SUPERUSER;
--Testcase 906:
-- CREATE USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 907:
-- CREATE USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
BEGIN;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user1
--Testcase 908:
SET ROLE regress_multi_conn_user1;
--Testcase 909:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 910:
RESET ROLE;
-- Will cache sqlite_svr connection with user mapping for regress_multi_conn_user2
--Testcase 911:
SET ROLE regress_multi_conn_user2;
--Testcase 912:
SELECT 1 FROM ft1 LIMIT 1;
--Testcase 913:
RESET ROLE;
-- Should output one cached connection for sqlite_svr server
--Testcase 914:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
COMMIT;
-- Let's ensure to close all the existing cached connections.
--Testcase 915:
SELECT 1 FROM sqlite_fdw_disconnect_all();
-- No cached connections, so no records should be output.
--Testcase 916:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
-- Clean up
--Testcase 917:
-- DROP USER MAPPING FOR regress_multi_conn_user1 SERVER sqlite_svr;
--Testcase 918:
-- DROP USER MAPPING FOR regress_multi_conn_user2 SERVER sqlite_svr;
--Testcase 919:
DROP ROLE regress_multi_conn_user1;
--Testcase 920:
DROP ROLE regress_multi_conn_user2;
-- ===================================================================
-- Test foreign server level option keep_connections
-- ===================================================================
-- By default, the connections associated with foreign server are cached i.e.
-- keep_connections option is on. Set it to off.
--Testcase 921:
ALTER SERVER sqlite_svr OPTIONS (keep_connections 'off');
-- connection to sqlite_svr server is closed at the end of xact
-- as keep_connections was set to off.
--Testcase 922:
SELECT 1 FROM ft1 LIMIT 1;
-- No cached connections, so no records should be output.
--Testcase 923:
SELECT server_name FROM sqlite_fdw_get_connections() ORDER BY 1;
--Testcase 924:
ALTER SERVER sqlite_svr OPTIONS (SET keep_connections 'on');
-- ===================================================================
-- batch insert
-- ===================================================================
BEGIN;
--Testcase 925:
CREATE SERVER batch10 FOREIGN DATA WRAPPER sqlite_fdw OPTIONS( batch_size '10' );
--Testcase 926:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 927:
ALTER SERVER batch10 OPTIONS( SET batch_size '20' );
--Testcase 928:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=10'];
--Testcase 929:
SELECT count(*)
FROM pg_foreign_server
WHERE srvname = 'batch10'
AND srvoptions @> array['batch_size=20'];
--Testcase 930:
CREATE FOREIGN TABLE table30 ( x int ) SERVER batch10 OPTIONS ( batch_size '30' );
--Testcase 931:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 932:
ALTER FOREIGN TABLE table30 OPTIONS ( SET batch_size '40');
--Testcase 933:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=30'];
--Testcase 934:
SELECT COUNT(*)
FROM pg_foreign_table
WHERE ftrelid = 'table30'::regclass
AND ftoptions @> array['batch_size=40'];
ROLLBACK;
--Testcase 935:
CREATE FOREIGN TABLE ftable ( x int OPTIONS (key 'true') ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '10' );
--Testcase 936:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 937:
INSERT INTO ftable SELECT * FROM generate_series(1, 10) i;
--Testcase 938:
INSERT INTO ftable SELECT * FROM generate_series(11, 31) i;
--Testcase 939:
INSERT INTO ftable VALUES (32);
--Testcase 940:
INSERT INTO ftable VALUES (33), (34);
--Testcase 946:
SELECT COUNT(*) FROM ftable;
--Testcase 947:
DELETE FROM ftable;
--Testcase 948:
DROP FOREIGN TABLE ftable;
-- Disable batch insert
--Testcase 949:
CREATE FOREIGN TABLE ftable ( x int ) SERVER sqlite_svr OPTIONS ( table 'batch_table', batch_size '1' );
--Testcase 950:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (1), (2);
--Testcase 951:
INSERT INTO ftable VALUES (1), (2);
--Testcase 952:
SELECT COUNT(*) FROM ftable;
-- Disable batch inserting into foreign tables with BEFORE ROW INSERT triggers
-- even if the batch_size option is enabled.
--Testcase 977:
ALTER FOREIGN TABLE ftable OPTIONS ( SET batch_size '10' );
--Testcase 978:
CREATE TRIGGER trig_row_before BEFORE INSERT ON ftable
FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
--Testcase 980:
EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (3), (4);
--Testcase 981:
INSERT INTO ftable VALUES (3), (4);
--Testcase 982:
SELECT COUNT(*) FROM ftable;
-- Clean up
--Testcase 983:
DROP TRIGGER trig_row_before ON ftable;
--Testcase 953:
DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- -- Use partitioning
-- CREATE TABLE batch_table ( x int ) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 0)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p0', batch_size '10');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 1)
-- SERVER sqlite_svr
-- OPTIONS (table 'batch_table_p1', batch_size '1');
-- CREATE TABLE batch_table_p2
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 3, REMAINDER 2);
-- INSERT INTO "S 1".batch_table SELECT * FROM generate_series(1, 66) i;
-- SELECT COUNT(*) FROM "S 1".batch_table;
-- -- Clean up
-- DROP TABLE batch_table;
-- DROP TABLE batch_table_p0;
-- DROP TABLE batch_table_p1;
-- Check that batched mode also works for some inserts made during
-- cross-partition updates
-- CREATE TABLE batch_cp_upd_test (a int) PARTITION BY LIST (a);
-- CREATE TABLE batch_cp_upd_test1 (LIKE batch_cp_upd_test);
-- CREATE FOREIGN TABLE batch_cp_upd_test1_f
-- PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (1)
-- SERVER sqlite_svr
-- OPTIONS (table_name 'batch_cp_upd_test1', batch_size '10');
-- CREATE TABLE batch_cp_upd_test2 PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (2);
-- CREATE TABLE batch_cp_upd_test3 (LIKE batch_cp_upd_test);
-- CREATE FOREIGN TABLE batch_cp_upd_test3_f
-- PARTITION OF batch_cp_upd_test
-- FOR VALUES IN (3)
-- SERVER loopback
-- OPTIONS (table_name 'batch_cp_upd_test3', batch_size '1');
-- -- Create statement triggers on remote tables that "log" any INSERTs
-- -- performed on them.
-- CREATE TABLE cmdlog (cmd text);
-- CREATE FUNCTION log_stmt() RETURNS TRIGGER LANGUAGE plpgsql AS $$
-- BEGIN INSERT INTO public.cmdlog VALUES (TG_OP || ' on ' || TG_RELNAME); RETURN NULL; END;
-- $$;
-- CREATE TRIGGER stmt_trig AFTER INSERT ON batch_cp_upd_test1
-- FOR EACH STATEMENT EXECUTE FUNCTION log_stmt();
-- CREATE TRIGGER stmt_trig AFTER INSERT ON batch_cp_upd_test3
-- FOR EACH STATEMENT EXECUTE FUNCTION log_stmt();
-- -- This update moves rows from the local partition 'batch_cp_upd_test2' to the
-- -- foreign partition 'batch_cp_upd_test1', one that has insert batching
-- -- enabled, so a single INSERT for both rows.
-- INSERT INTO batch_cp_upd_test VALUES (2), (2);
-- UPDATE batch_cp_upd_test t SET a = 1 FROM (VALUES (1), (2)) s(a) WHERE t.a = s.a AND s.a = 2;
-- -- This one moves rows from the local partition 'batch_cp_upd_test2' to the
-- -- foreign partition 'batch_cp_upd_test2', one that has insert batching
-- -- disabled, so separate INSERTs for the two rows.
-- INSERT INTO batch_cp_upd_test VALUES (2), (2);
-- UPDATE batch_cp_upd_test t SET a = 3 FROM (VALUES (1), (2)) s(a) WHERE t.a = s.a AND s.a = 2;
-- SELECT tableoid::regclass, * FROM batch_cp_upd_test ORDER BY 1;
-- -- Should see 1 INSERT on batch_cp_upd_test1 and 2 on batch_cp_upd_test3 as
-- -- described above.
-- SELECT * FROM cmdlog ORDER BY 1;
-- -- Clean up
-- DROP TABLE batch_cp_upd_test;
-- DROP TABLE batch_cp_upd_test1;
-- DROP TABLE batch_cp_upd_test3;
-- DROP TABLE cmdlog;
-- DROP FUNCTION log_stmt();
-- -- Use partitioning
-- ALTER SERVER loopback OPTIONS (ADD batch_size '10');
-- CREATE TABLE batch_table ( x int, field1 text, field2 text) PARTITION BY HASH (x);
-- CREATE TABLE batch_table_p0 (LIKE batch_table);
-- ALTER TABLE batch_table_p0 ADD CONSTRAINT p0_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p0f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 0)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p0');
-- CREATE TABLE batch_table_p1 (LIKE batch_table);
-- ALTER TABLE batch_table_p1 ADD CONSTRAINT p1_pkey PRIMARY KEY (x);
-- CREATE FOREIGN TABLE batch_table_p1f
-- PARTITION OF batch_table
-- FOR VALUES WITH (MODULUS 2, REMAINDER 1)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table_p1');
-- INSERT INTO batch_table SELECT i, 'test'||i, 'test'|| i FROM generate_series(1, 50) i;
-- SELECT COUNT(*) FROM batch_table;
-- SELECT * FROM batch_table ORDER BY x;
-- -- Clean up
-- DROP TABLE batch_table;
-- DROP TABLE batch_table_p0;
-- DROP TABLE batch_table_p1;
-- ALTER SERVER loopback OPTIONS (DROP batch_size);
-- Test that pending inserts are handled properly when needed
-- CREATE TABLE batch_table (a text, b int);
-- CREATE FOREIGN TABLE ftable (a text, b int)
-- SERVER loopback
-- OPTIONS (table_name 'batch_table', batch_size '2');
-- CREATE TABLE ltable (a text, b int);
-- CREATE FUNCTION ftable_rowcount_trigf() RETURNS trigger LANGUAGE plpgsql AS
-- $$
-- begin
-- raise notice '%: there are % rows in ftable',
-- TG_NAME, (SELECT count(*) FROM ftable);
-- if TG_OP = 'DELETE' then
-- return OLD;
-- else
-- return NEW;
-- end if;
-- end;
-- $$;
-- CREATE TRIGGER ftable_rowcount_trigger
-- BEFORE INSERT OR UPDATE OR DELETE ON ltable
-- FOR EACH ROW EXECUTE PROCEDURE ftable_rowcount_trigf();
-- WITH t AS (
-- INSERT INTO ltable VALUES ('AAA', 42), ('BBB', 42) RETURNING *
-- )
-- INSERT INTO ftable SELECT * FROM t;
-- SELECT * FROM ltable;
-- SELECT * FROM ftable;
-- DELETE FROM ftable;
-- WITH t AS (
-- UPDATE ltable SET b = b + 100 RETURNING *
-- )
-- INSERT INTO ftable SELECT * FROM t;
-- SELECT * FROM ltable;
-- SELECT * FROM ftable;
-- DELETE FROM ftable;
-- WITH t AS (
-- DELETE FROM ltable RETURNING *
-- )
-- INSERT INTO ftable SELECT * FROM t;
-- SELECT * FROM ltable;
-- SELECT * FROM ftable;
-- DELETE FROM ftable;
-- -- Clean up
-- DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- DROP TRIGGER ftable_rowcount_trigger ON ltable;
-- DROP TABLE ltable;
-- CREATE TABLE parent (a text, b int) PARTITION BY LIST (a);
-- CREATE TABLE batch_table (a text, b int);
-- CREATE FOREIGN TABLE ftable
-- PARTITION OF parent
-- FOR VALUES IN ('AAA')
-- SERVER loopback
-- OPTIONS (table_name 'batch_table', batch_size '2');
-- CREATE TABLE ltable
-- PARTITION OF parent
-- FOR VALUES IN ('BBB');
-- CREATE TRIGGER ftable_rowcount_trigger
-- BEFORE INSERT ON ltable
-- FOR EACH ROW EXECUTE PROCEDURE ftable_rowcount_trigf();
-- INSERT INTO parent VALUES ('AAA', 42), ('BBB', 42), ('AAA', 42), ('BBB', 42);
-- SELECT tableoid::regclass, * FROM parent;
-- -- Clean up
-- DROP FOREIGN TABLE ftable;
-- DROP TABLE batch_table;
-- DROP TRIGGER ftable_rowcount_trigger ON ltable;
-- DROP TABLE ltable;
-- DROP TABLE parent;
-- DROP FUNCTION ftable_rowcount_trigf;
-- ===================================================================
-- test asynchronous execution
-- ===================================================================
-- ALTER SERVER loopback OPTIONS (DROP extensions);
-- ALTER SERVER loopback OPTIONS (ADD async_capable 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD async_capable 'true');
-- CREATE TABLE async_pt (a int, b int, c text) PARTITION BY RANGE (a);
-- CREATE TABLE base_tbl1 (a int, b int, c text);
-- CREATE TABLE base_tbl2 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p1 PARTITION OF async_pt FOR VALUES FROM (1000) TO (2000)
-- SERVER loopback OPTIONS (table_name 'base_tbl1');
-- CREATE FOREIGN TABLE async_p2 PARTITION OF async_pt FOR VALUES FROM (2000) TO (3000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl2');
-- INSERT INTO async_p1 SELECT 1000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- INSERT INTO async_p2 SELECT 2000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- -- simple queries
-- CREATE TABLE result_tbl (a int, b int, c text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b % 100 = 0;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- Test error handling, if accessing one of the foreign partitions errors out
-- CREATE FOREIGN TABLE async_p_broken PARTITION OF async_pt FOR VALUES FROM (10000) TO (10001)
-- SERVER loopback OPTIONS (table_name 'non_existent_table');
-- SELECT * FROM async_pt;
-- DROP FOREIGN TABLE async_p_broken;
-- -- Check case where multiple partitions use the same connection
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000)
-- SERVER loopback2 OPTIONS (table_name 'base_tbl3');
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- DROP FOREIGN TABLE async_p3;
-- DROP TABLE base_tbl3;
-- -- Check case where the partitioned table has local/remote partitions
-- CREATE TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000);
-- INSERT INTO async_p3 SELECT 3000 + i, i, to_char(i, 'FM0000') FROM generate_series(0, 999, 5) i;
-- ANALYZE async_pt;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505;
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- -- partitionwise joins
-- SET enable_partitionwise_join TO true;
-- CREATE TABLE join_tbl (a1 int, b1 int, c1 text, a2 int, b2 int, c2 text);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT t1.a, t1.b, 'AAA' || t1.c, t2.a, t2.b, 'AAA' || t2.c FROM async_pt t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_partitionwise_join;
-- -- Test rescan of an async Append node with do_exec_prune=false
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- RESET enable_hashjoin;
-- -- Test interaction of async execution with plan-time partition pruning
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 3000;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE a < 2000;
-- -- Test interaction of async execution with run-time partition pruning
-- SET plan_cache_mode TO force_generic_plan;
-- PREPARE async_pt_query (int, int) AS
-- INSERT INTO result_tbl SELECT * FROM async_pt WHERE a < $1 AND b === $2;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (3000, 505);
-- EXECUTE async_pt_query (3000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- EXECUTE async_pt_query (2000, 505);
-- EXECUTE async_pt_query (2000, 505);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- RESET plan_cache_mode;
-- CREATE TABLE local_tbl(a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo'), (2505, 505, 'bar');
-- ANALYZE local_tbl;
-- CREATE INDEX base_tbl1_idx ON base_tbl1 (a);
-- CREATE INDEX base_tbl2_idx ON base_tbl2 (a);
-- CREATE INDEX async_p3_idx ON async_p3 (a);
-- ANALYZE base_tbl1;
-- ANALYZE base_tbl2;
-- ANALYZE async_p3;
-- ALTER FOREIGN TABLE async_p1 OPTIONS (use_remote_estimate 'true');
-- ALTER FOREIGN TABLE async_p2 OPTIONS (use_remote_estimate 'true');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
-- ALTER FOREIGN TABLE async_p1 OPTIONS (DROP use_remote_estimate);
-- ALTER FOREIGN TABLE async_p2 OPTIONS (DROP use_remote_estimate);
-- DROP TABLE local_tbl;
-- DROP INDEX base_tbl1_idx;
-- DROP INDEX base_tbl2_idx;
-- DROP INDEX async_p3_idx;
-- -- UNION queries
-- SET enable_sort TO off;
-- SET enable_incremental_sort TO off;
-- -- Adjust fdw_startup_cost so that we get an unordered path in the Append.
-- ALTER SERVER loopback2 OPTIONS (ADD fdw_startup_cost '0.00');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION ALL
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- INSERT INTO result_tbl
-- (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10)
-- UNION ALL
-- (SELECT a, b, 'AAA' || c FROM async_p2 WHERE b < 10);
-- SELECT * FROM result_tbl ORDER BY a;
-- DELETE FROM result_tbl;
-- RESET enable_incremental_sort;
-- RESET enable_sort;
-- ALTER SERVER loopback2 OPTIONS (DROP fdw_startup_cost);
-- -- Disable async execution if we use gating Result nodes for pseudoconstant
-- -- quals
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt WHERE CURRENT_USER = SESSION_USER;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- (SELECT * FROM async_p1 WHERE CURRENT_USER = SESSION_USER)
-- UNION ALL
-- (SELECT * FROM async_p2 WHERE CURRENT_USER = SESSION_USER);
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM ((SELECT * FROM async_p1 WHERE b < 10) UNION ALL (SELECT * FROM async_p2 WHERE b < 10)) s WHERE CURRENT_USER = SESSION_USER;
-- -- Test that pending requests are processed properly
-- SET enable_mergejoin TO false;
-- SET enable_hashjoin TO false;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
-- CREATE TABLE local_tbl (a int, b int, c text);
-- INSERT INTO local_tbl VALUES (1505, 505, 'foo');
-- ANALYZE local_tbl;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt WHERE a < 3000) FROM async_pt WHERE a < 3000) t2 ON t1.a = t2.a;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- SELECT * FROM async_pt t1 WHERE t1.b === 505 LIMIT 1;
-- -- Check with foreign modify
-- CREATE TABLE base_tbl3 (a int, b int, c text);
-- CREATE FOREIGN TABLE remote_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl3');
-- INSERT INTO remote_tbl VALUES (2505, 505, 'bar');
-- CREATE TABLE base_tbl4 (a int, b int, c text);
-- CREATE FOREIGN TABLE insert_tbl (a int, b int, c text)
-- SERVER loopback OPTIONS (table_name 'base_tbl4');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- INSERT INTO insert_tbl (SELECT * FROM local_tbl UNION ALL SELECT * FROM remote_tbl);
-- SELECT * FROM insert_tbl ORDER BY a;
-- -- Check with direct modify
-- EXPLAIN (VERBOSE, COSTS OFF)
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- WITH t AS (UPDATE remote_tbl SET c = c || c RETURNING *)
-- INSERT INTO join_tbl SELECT * FROM async_pt LEFT JOIN t ON (async_pt.a = t.a AND async_pt.b = t.b) WHERE async_pt.b === 505;
-- SELECT * FROM join_tbl ORDER BY a1;
-- DELETE FROM join_tbl;
-- DROP TABLE local_tbl;
-- DROP FOREIGN TABLE remote_tbl;
-- DROP FOREIGN TABLE insert_tbl;
-- DROP TABLE base_tbl3;
-- DROP TABLE base_tbl4;
-- RESET enable_mergejoin;
-- RESET enable_hashjoin;
-- -- Test that UPDATE/DELETE with inherited target works with async_capable enabled
-- EXPLAIN (VERBOSE, COSTS OFF)
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- UPDATE async_pt SET c = c || c WHERE b = 0 RETURNING *;
-- EXPLAIN (VERBOSE, COSTS OFF)
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- DELETE FROM async_pt WHERE b = 0 RETURNING *;
-- -- Check EXPLAIN ANALYZE for a query that scans empty partitions asynchronously
-- DELETE FROM async_p1;
-- DELETE FROM async_p2;
-- DELETE FROM async_p3;
-- EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
-- SELECT * FROM async_pt;
-- -- Clean up
-- DROP TABLE async_pt;
-- DROP TABLE base_tbl1;
-- DROP TABLE base_tbl2;
-- DROP TABLE result_tbl;
-- DROP TABLE join_tbl;
-- -- Test that an asynchronous fetch is processed before restarting the scan in
-- -- ReScanForeignScan
-- CREATE TABLE base_tbl (a int, b int);
-- INSERT INTO base_tbl VALUES (1, 11), (2, 22), (3, 33);
-- CREATE FOREIGN TABLE foreign_tbl (b int)
-- SERVER loopback OPTIONS (table_name 'base_tbl');
-- CREATE FOREIGN TABLE foreign_tbl2 () INHERITS (foreign_tbl)
-- SERVER loopback OPTIONS (table_name 'base_tbl');
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT a FROM base_tbl WHERE (a, random() > 0) IN (SELECT a, random() > 0 FROM foreign_tbl);
-- SELECT a FROM base_tbl WHERE (a, random() > 0) IN (SELECT a, random() > 0 FROM foreign_tbl);
-- -- Clean up
-- DROP FOREIGN TABLE foreign_tbl CASCADE;
-- DROP TABLE base_tbl;
-- ALTER SERVER loopback OPTIONS (DROP async_capable);
-- ALTER SERVER loopback2 OPTIONS (DROP async_capable);
-- ===================================================================
-- test invalid server and foreign table options
-- ===================================================================
-- -- Invalid fdw_startup_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_startup_cost '100$%$#$#');
-- -- Invalid fdw_tuple_cost option
-- CREATE SERVER inv_scst FOREIGN DATA WRAPPER postgres_fdw
-- OPTIONS(fdw_tuple_cost '100$%$#$#');
-- -- Invalid fetch_size option
-- CREATE FOREIGN TABLE inv_fsz (c1 int )
-- SERVER loopback OPTIONS (fetch_size '100$%$#$#');
-- Invalid batch_size option
--Testcase 954:
CREATE FOREIGN TABLE inv_bsz (c1 int )
SERVER sqlite_svr OPTIONS (batch_size '100$%$#$#');
-- -- No option is allowed to be specified at foreign data wrapper level
-- ALTER FOREIGN DATA WRAPPER postgres_fdw OPTIONS (nonexistent 'fdw');
-- -- ===================================================================
-- -- test postgres_fdw.application_name GUC
-- -- ===================================================================
-- To avoid race conditions in checking the remote session's application_name,
-- use this view to make the remote session itself read its application_name.
-- CREATE VIEW my_application_name AS
-- SELECT application_name FROM pg_stat_activity WHERE pid = pg_backend_pid();
-- CREATE FOREIGN TABLE remote_application_name (application_name text)
-- SERVER loopback2
-- OPTIONS (schema_name 'public', table_name 'my_application_name');
-- SELECT count(*) FROM remote_application_name;
-- Specify escape sequences in application_name option of a server
-- object so as to test that they are replaced with status information
-- expectedly. Note that we are also relying on ALTER SERVER to force
-- the remote session to be restarted with its new application name.
-- -- Since pg_stat_activity.application_name may be truncated to less than
-- -- NAMEDATALEN characters, note that substring() needs to be used
-- -- at the condition of test query to make sure that the string consisting
-- -- of database name and process ID is also less than that.
-- ALTER SERVER loopback2 OPTIONS (application_name 'fdw_%d%p');
-- SELECT count(*) FROM remote_application_name
-- WHERE application_name =
-- substring('fdw_' || current_database() || pg_backend_pid() for
-- current_setting('max_identifier_length')::int);
-- -- postgres_fdw.application_name overrides application_name option
-- -- of a server object if both settings are present.
-- ALTER SERVER loopback2 OPTIONS (SET application_name 'fdw_wrong');
-- SET postgres_fdw.application_name TO 'fdw_%a%u%%';
-- SELECT count(*) FROM remote_application_name
-- WHERE application_name =
-- substring('fdw_' || current_setting('application_name') ||
-- CURRENT_USER || '%' for current_setting('max_identifier_length')::int);
-- RESET postgres_fdw.application_name;
-- -- Test %c (session ID) and %C (cluster name) escape sequences.
-- ALTER SERVER loopback2 OPTIONS (SET application_name 'fdw_%C%c');
-- SELECT count(*) FROM remote_application_name
-- WHERE application_name =
-- substring('fdw_' || current_setting('cluster_name') ||
-- to_hex(trunc(EXTRACT(EPOCH FROM (SELECT backend_start FROM
-- pg_stat_get_activity(pg_backend_pid()))))::integer) || '.' ||
-- to_hex(pg_backend_pid())
-- for current_setting('max_identifier_length')::int);
-- -- Clean up.
-- DROP FOREIGN TABLE remote_application_name;
-- DROP VIEW my_application_name;
-- -- ===================================================================
-- -- test parallel commit and parallel abort
-- -- ===================================================================
-- ALTER SERVER loopback OPTIONS (ADD parallel_commit 'true');
-- ALTER SERVER loopback OPTIONS (ADD parallel_abort 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD parallel_commit 'true');
-- ALTER SERVER loopback2 OPTIONS (ADD parallel_abort 'true');
-- CREATE TABLE ploc1 (f1 int, f2 text);
-- CREATE FOREIGN TABLE prem1 (f1 int, f2 text)
-- SERVER loopback OPTIONS (table_name 'ploc1');
-- CREATE TABLE ploc2 (f1 int, f2 text);
-- CREATE FOREIGN TABLE prem2 (f1 int, f2 text)
-- SERVER loopback2 OPTIONS (table_name 'ploc2');
-- BEGIN;
-- INSERT INTO prem1 VALUES (101, 'foo');
-- INSERT INTO prem2 VALUES (201, 'bar');
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (102, 'foofoo');
-- INSERT INTO prem2 VALUES (202, 'barbar');
-- RELEASE SAVEPOINT s;
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- -- This tests executing DEALLOCATE ALL against foreign servers in parallel
-- -- during pre-commit
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (103, 'baz');
-- INSERT INTO prem2 VALUES (203, 'qux');
-- ROLLBACK TO SAVEPOINT s;
-- RELEASE SAVEPOINT s;
-- INSERT INTO prem1 VALUES (104, 'bazbaz');
-- INSERT INTO prem2 VALUES (204, 'quxqux');
-- COMMIT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- BEGIN;
-- INSERT INTO prem1 VALUES (105, 'test1');
-- INSERT INTO prem2 VALUES (205, 'test2');
-- ABORT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- -- This tests executing DEALLOCATE ALL against foreign servers in parallel
-- -- during post-abort
-- BEGIN;
-- SAVEPOINT s;
-- INSERT INTO prem1 VALUES (105, 'test1');
-- INSERT INTO prem2 VALUES (205, 'test2');
-- ROLLBACK TO SAVEPOINT s;
-- RELEASE SAVEPOINT s;
-- INSERT INTO prem1 VALUES (105, 'test1');
-- INSERT INTO prem2 VALUES (205, 'test2');
-- ABORT;
-- SELECT * FROM prem1;
-- SELECT * FROM prem2;
-- ALTER SERVER loopback OPTIONS (DROP parallel_commit);
-- ALTER SERVER loopback OPTIONS (DROP parallel_abort);
-- ALTER SERVER loopback2 OPTIONS (DROP parallel_commit);
-- ALTER SERVER loopback2 OPTIONS (DROP parallel_abort);
-- -- ===================================================================
-- -- test for ANALYZE sampling
-- -- ===================================================================
-- CREATE TABLE analyze_table (id int, a text, b bigint);
-- CREATE FOREIGN TABLE analyze_ftable (id int, a text, b bigint)
-- SERVER loopback OPTIONS (table_name 'analyze_rtable1');
-- INSERT INTO analyze_table (SELECT x FROM generate_series(1,1000) x);
-- ANALYZE analyze_table;
-- SET default_statistics_target = 10;
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (analyze_sampling 'invalid');
-- ALTER SERVER loopback OPTIONS (analyze_sampling 'auto');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'system');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'bernoulli');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'random');
-- ANALYZE analyze_table;
-- ALTER SERVER loopback OPTIONS (SET analyze_sampling 'off');
-- ANALYZE analyze_table;
-- cleanup
-- DROP FOREIGN TABLE analyze_ftable;
-- DROP TABLE analyze_table;
-- SQLite FDW does not support query cancel feature
-- SELECT version() ~ 'cygwin' AS skip_test \gset
-- \if :skip_test
-- \quit
-- \endif
-- -- Let's test canceling a remote query. Use a table that does not have
-- -- remote_estimate enabled, else there will be multiple queries to the
-- -- remote and we might unluckily send the cancel in between two of them.
-- -- First let's confirm that the query is actually pushed down.
-- EXPLAIN (VERBOSE, COSTS OFF)
-- SELECT count(*) FROM ft1 a CROSS JOIN ft1 b CROSS JOIN ft1 c CROSS JOIN ft1 d;
-- BEGIN;
-- -- Make sure that connection is open and set up.
-- SELECT count(*) FROM ft1 a;
-- -- Timeout needs to be long enough to be sure that we've sent the slow query.
-- SET LOCAL statement_timeout = '100ms';
-- -- This would take very long if not canceled:
-- SELECT count(*) FROM ft1 a CROSS JOIN ft1 b CROSS JOIN ft1 c CROSS JOIN ft1 d;
-- COMMIT;
-- Clean-up
--Testcase 733:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr;
--Testcase 734:
-- DROP USER MAPPING FOR CURRENT_USER SERVER sqlite_svr2;
--Testcase 735:
DROP SERVER sqlite_svr CASCADE;
--Testcase 736:
DROP SERVER sqlite_svr2 CASCADE;
--Testcase 737:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/extra/update.sql
================================================
--
-- UPDATE syntax tests
--
--Testcase 32:
CREATE EXTENSION sqlite_fdw;
--Testcase 33:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 34:
CREATE FOREIGN TABLE update_test (
i INT OPTIONS (key 'true'),
a INT DEFAULT 10,
b INT,
c TEXT
) SERVER sqlite_svr;
--Testcase 35:
CREATE FOREIGN TABLE upsert_test (
a INT OPTIONS (key 'true'),
b TEXT
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO update_test VALUES (1, 5, 10, 'foo');
--Testcase 2:
INSERT INTO update_test(i, b, a) VALUES (2, 15, 10);
--Testcase 3:
SELECT * FROM update_test;
--Testcase 4:
UPDATE update_test SET a = DEFAULT, b = DEFAULT;
--Testcase 5:
SELECT * FROM update_test;
-- aliases for the UPDATE target table
--Testcase 6:
UPDATE update_test AS t SET b = 10 WHERE t.a = 10;
--Testcase 7:
SELECT * FROM update_test;
--Testcase 8:
UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10;
--Testcase 9:
SELECT * FROM update_test;
-- error, you're not supposed to qualify the target column
--Testcase 41:
UPDATE update_test t SET t.b = t.b + 10 WHERE t.a = 10;
--
-- Test VALUES in FROM
--
--Testcase 10:
UPDATE update_test SET a=v.i FROM (VALUES(100, 20)) AS v(i, j)
WHERE update_test.b = v.j;
--Testcase 11:
SELECT * FROM update_test;
-- fail, wrong data type:
--Testcase 12:
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
--
--Testcase 13:
INSERT INTO update_test SELECT i+2,a,b+1,c FROM update_test;
--Testcase 14:
SELECT * FROM update_test;
--Testcase 15:
UPDATE update_test SET (c,b,a) = ('bugle', b+11, DEFAULT) WHERE c = 'foo';
--Testcase 16:
SELECT * FROM update_test;
--Testcase 17:
UPDATE update_test SET (c,b) = ('car', a+b), a = a + 1 WHERE a = 10;
--Testcase 18:
SELECT * FROM update_test;
-- fail, multi assignment to same column:
--Testcase 19:
UPDATE update_test SET (c,b) = ('car', a+b), b = a + 1 WHERE a = 10;
-- uncorrelated sub-select:
--Testcase 20:
UPDATE update_test
SET (b,a) = (select a,b from update_test where b = 41 and c = 'car')
WHERE a = 100 AND b = 20;
--Testcase 21:
SELECT * FROM update_test;
-- correlated sub-select:
--Testcase 22:
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);
--Testcase 23:
SELECT * FROM update_test;
-- fail, multiple rows supplied:
--Testcase 24:
UPDATE update_test SET (b,a) = (select a+1,b from update_test);
-- set to null if no rows supplied:
--Testcase 25:
UPDATE update_test SET (b,a) = (select a+1,b from update_test where a = 1000)
WHERE a = 11;
--Testcase 26:
SELECT * FROM update_test;
-- *-expansion should work in this context:
--Testcase 27:
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:
--Testcase 28:
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
--Testcase 29:
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.
--Testcase 30:
UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car';
--Testcase 31:
SELECT a, b, char_length(c) FROM update_test;
-- Check multi-assignment with a Result node to handle a one-time filter.
--Testcase 36:
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;
--Testcase 37:
UPDATE update_test t
SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a)
WHERE CURRENT_USER = SESSION_USER;
--Testcase 38:
SELECT a, b, char_length(c) FROM update_test;
/* Skip, sqlite fdw does not support ON CONFLICT DO UPDATE
-- 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 FOREIGN TABLE update_test;
DROP FOREIGN TABLE upsert_test;
*/
/*Skip, sqlite fdw does not support create partition table
-- 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);
*/
--drop all foreign tables
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 39:
DROP SERVER sqlite_svr;
--Testcase 40:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/libsqlite.sql
================================================
-- Test for SQLite library code source and defaults
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
SELECT sqlite_fdw_sqlite_version();
--Testcase 3:
SELECT length(sqlite_fdw_sqlite_code_source());
--Testcase 4:
SELECT sqlite_fdw_sqlite_code_source();
--Testcase 7:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/selectfunc.sql
================================================
SET datestyle=ISO;
SET timezone='Japan';
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER server1 FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/selectfunc.db');
--CREATE USER MAPPING FOR CURRENT_USER SERVER server1 OPTIONS(user 'user', password 'pass');
--IMPORT FOREIGN SCHEMA public FROM SERVER server1 INTO public OPTIONS(import_time_text 'false');
--Testcase 3:
CREATE FOREIGN TABLE s3(id text OPTIONS (key 'true'), time timestamp, tag1 text, value1 float, value2 int, value3 float, value4 int, str1 text, str2 text) SERVER server1;
-- s3 (value1 as float8, value2 as bigint)
--Testcase 4:
\d s3;
--Testcase 5:
SELECT * FROM s3;
-- select float8() (not pushdown, remove float8, explain)
-- EXPLAIN VERBOSE
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select float8() (not pushdown, remove float8, result)
-- SELECT float8(value1), float8(value2), float8(value3), float8(value4) FROM s3;
-- sqlite fdw does not support
-- select sqrt (builtin function, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (buitin function, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function,, not pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, not pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE to_hex(value2) != '64';
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select sqrt (builtin function, pushdown constraints, result)
-- SELECT sqrt(value1), sqrt(value2) FROM s3 WHERE value2 != 200;
-- sqlite fdw does not have sqrt()
-- select abs (builtin function, explain)
--Testcase 6:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (buitin function, result)
--Testcase 7:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3;
-- select abs (builtin function, not pushdown constraints, explain)
--Testcase 8:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, not pushdown constraints, result)
--Testcase 9:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE to_hex(value2) != '64';
-- select abs (builtin function, pushdown constraints, explain)
--Testcase 10:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select abs (builtin function, pushdown constraints, result)
--Testcase 11:
SELECT abs(value1), abs(value2), abs(value3), abs(value4) FROM s3 WHERE value2 != 200;
-- select log (builtin function, need to swap arguments, numeric cast, explain)
-- log_(v) : postgresql (base, v), sqlite (v, base)
-- EXPLAIN VERBOSE
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (builtin function, need to swap arguments, numeric cast, result)
-- SELECT log(value1::numeric, value2::numeric) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, float8, result)
-- SELECT log(value1, 0.1) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, bigint, result)
-- SELECT log(value2, 3) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, explain)
-- EXPLAIN VERBOSE
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log (stub function, need to swap arguments, mix type, result)
-- SELECT log(value1, value2) FROM s3 WHERE value1 != 1;
-- sqlite fdw does not have log()
-- select log2 (stub function, explain)
-- EXPLAIN VERBOSE
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select log2 (stub function, result)
-- SELECT log2(value1),log2(value2) FROM s3;
-- sqlite fdw does not have log2()
-- select spread (stub agg function, explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, result)
-- SELECT spread(value1),spread(value2),spread(value3),spread(value4) FROM s3;
-- sqlite fdw does not have spread()
-- select spread (stub agg function, raise exception if not expected type)
-- SELECT spread(value1::numeric),spread(value2::numeric),spread(value3::numeric),spread(value4::numeric) FROM s3;
-- sqlite fdw does not have spread()
-- select abs as nest function with agg (pushdown, explain)
--Testcase 12:
EXPLAIN VERBOSE
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest function with agg (pushdown, result)
--Testcase 13:
SELECT sum(value3),abs(sum(value3)) FROM s3;
-- select abs as nest with log2 (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs as nest with log2 (pushdown, result)
-- SELECT abs(log2(value1)),abs(log2(1/value1)) FROM s3;
-- sqlite fdw does not have log2()
-- select abs with non pushdown func and explicit constant (explain)
--Testcase 14:
EXPLAIN VERBOSE
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select abs with non pushdown func and explicit constant (result)
--Testcase 15:
SELECT abs(value3), pi(), 4.1 FROM s3;
-- select sqrt as nest function with agg and explicit constant (pushdown, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant (pushdown, result)
-- SELECT sqrt(count(value1)), pi(), 4.1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select sqrt as nest function with agg and explicit constant and tag (error, explain)
-- EXPLAIN VERBOSE
-- SELECT sqrt(count(value1)), pi(), 4.1, tag1 FROM s3;
-- sqlite fdw does not have sqrt()
-- select spread (stub agg function and group by influx_time() and tag) (explain)
-- EXPLAIN VERBOSE
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by influx_time() and tag) (result)
-- SELECT spread("value1"),influx_time(time, interval '1s'),tag1 FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY influx_time(time, interval '1s'), tag1;
-- sqlite fdw does not have spread() and influx_time()
-- select spread (stub agg function and group by tag only) (result)
-- SELECT tag1,spread("value1") FROM s3 WHERE time >= to_timestamp(0) and time <= to_timestamp(4) GROUP BY tag1;
-- sqlite fdw does not have spread()
-- select spread (stub agg function and other aggs) (result)
-- SELECT sum("value1"),spread("value1"),count("value1") FROM s3;
-- sqlite fdw does not have spread()
-- select abs with order by (explain)
--Testcase 16:
EXPLAIN VERBOSE
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by (result)
--Testcase 17:
SELECT value1, abs(1-value1) FROM s3 order by abs(1-value1);
-- select abs with order by index (result)
--Testcase 18:
SELECT value1, abs(1-value1) FROM s3 order by 2,1;
-- select abs with order by index (result)
--Testcase 19:
SELECT value1, abs(1-value1) FROM s3 order by 1,2;
-- select abs and as
--Testcase 20:
SELECT abs(value3) as abs1 FROM s3;
-- select spread over join query (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread over join query (result, stub call error)
-- SELECT spread(t1.value1), spread(t2.value1) FROM s3 t1 INNER JOIN s3 t2 ON (t1.value1 = t2.value1) where t1.value1 = 0.1;
-- sqlite fdw does not have spread()
-- select spread with having (explain)
-- EXPLAIN VERBOSE
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select spread with having (explain, cannot pushdown, stub call error)
-- SELECT spread(value1) FROM s3 HAVING spread(value1) > 100;
-- sqlite fdw does not have spread()
-- select abs with arithmetic and tag in the middle (explain)
--Testcase 21:
EXPLAIN VERBOSE
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select abs with arithmetic and tag in the middle (result)
--Testcase 22:
SELECT abs(value1) + 1, value2, tag1, sqrt(value2) FROM s3;
-- select with order by limit (explain)
--Testcase 23:
EXPLAIN VERBOSE
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select with order by limit (explain)
--Testcase 24:
SELECT abs(value1), abs(value3), sqrt(value2) FROM s3 ORDER BY abs(value3) LIMIT 1;
-- select mixing with non pushdown func (all not pushdown, explain)
--Testcase 25:
EXPLAIN VERBOSE
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- select mixing with non pushdown func (result)
--Testcase 26:
SELECT abs(value1), sqrt(value2), upper(tag1) FROM s3;
-- sqlite data prep
-- sqlite pushdown supported functions (explain)
--Testcase 27:
EXPLAIN VERBOSE
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown supported functions (result)
--Testcase 28:
SELECT abs(value3), length(tag1), lower(str1), ltrim(str2), ltrim(str1, '-'), replace(str1, 'XYZ', 'ABC'), round(value3), rtrim(str1, '-'), rtrim(str2), substr(str1, 4), substr(str1, 4, 3) FROM s3;
-- sqlite pushdown nest functions (explain)
--Testcase 32:
EXPLAIN VERBOSE
SELECT round(abs(value2), 0) FROM s3;
-- sqlite pushdown nest functions (result)
--Testcase 33:
SELECT round(abs(value2), 0) FROM s3;
-- select mod (builtin function, explain)
--Testcase 34:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, result)
--Testcase 35:
SELECT value1, mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3;
-- select mod (builtin function, not pushdown constraints, explain)
--Testcase 36:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, not pushdown constraints, result)
--Testcase 37:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE to_hex(value2) = '64';
-- select mod (builtin function, pushdown constraints, explain)
--Testcase 38:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, pushdown constraints, result)
--Testcase 39:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE value2 != 200;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 40:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 41:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(value2, 2) != 1;
-- select mod (builtin function, mod in constraints, explain)
--Testcase 42:
EXPLAIN VERBOSE
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod (builtin function, mod in constraints, result)
--Testcase 43:
SELECT mod(value2, 2), mod(value4, 2), mod(5, 2) FROM s3 WHERE mod(5, 2) > value1;
-- select mod as nest function with agg (pushdown, explain)
--Testcase 44:
EXPLAIN VERBOSE
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest function with agg (pushdown, result)
--Testcase 45:
SELECT sum(value3),mod(sum(value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, explain)
--Testcase 46:
EXPLAIN VERBOSE
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod as nest with abs (pushdown, result)
--Testcase 47:
SELECT value1, mod(abs(value2), 2),mod(abs(1/value2), 2) FROM s3;
-- select mod with non pushdown func and explicit constant (explain)
--Testcase 48:
EXPLAIN VERBOSE
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with non pushdown func and explicit constant (result)
--Testcase 49:
SELECT value1, mod(value2, 2), pi(), 4.1 FROM s3;
-- select mod with order by (explain)
--Testcase 50:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by (result)
--Testcase 51:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY mod((1-value2), 2);
-- select mod with order by index (result)
--Testcase 52:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 2,1;
-- select mod with order by index (result)
--Testcase 53:
SELECT value1, mod((1-value2), 2) FROM s3 ORDER BY 1,2;
-- select mod with group by (explain)
--Testcase 54:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by (result)
--Testcase 55:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2);
-- select mod with group by index (result)
--Testcase 56:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 2,1;
-- select mod with group by index (result)
--Testcase 57:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2;
-- select mod with group by having (explain)
--Testcase 58:
EXPLAIN VERBOSE
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by having (result)
--Testcase 59:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY value1, mod((1-value2), 2) HAVING avg(value1) > 0;
-- select mod with group by index having (result)
--Testcase 60:
SELECT value1, mod((1-value2), 2) FROM s3 GROUP BY 1,2 HAVING value1 > 1;
-- select mod and as
--Testcase 61:
SELECT value1, mod(value2, 2) as mod1 FROM s3;
--Testcase 29:
DROP FOREIGN TABLE s3;
--Testcase 30:
DROP SERVER server1;
--Testcase 31:
DROP EXTENSION sqlite_fdw;
================================================
FILE: sql/17.0/sqlite_fdw.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 129:
CREATE EXTENSION sqlite_fdw;
--Testcase 130:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 131:
CREATE FOREIGN TABLE department(department_id int OPTIONS (key 'true'), department_name text) SERVER sqlite_svr;
--Testcase 132:
CREATE FOREIGN TABLE employee(emp_id int OPTIONS (key 'true'), emp_name text, emp_dept_id int) SERVER sqlite_svr;
--Testcase 133:
CREATE FOREIGN TABLE empdata(emp_id int OPTIONS (key 'true'), emp_dat bytea) SERVER sqlite_svr;
--Testcase 134:
CREATE FOREIGN TABLE numbers(a int OPTIONS (key 'true'), b varchar(255)) SERVER sqlite_svr;
--Testcase 135:
CREATE FOREIGN TABLE multiprimary(a int, b int OPTIONS (key 'true'), c int OPTIONS(key 'true')) SERVER sqlite_svr;
--Testcase 136:
CREATE FOREIGN TABLE noprimary(a int, b text) SERVER sqlite_svr;
--Testcase 137:
CREATE FOREIGN TABLE RO_RW_test(i int OPTIONS (key 'true'), a text, b float, c int) SERVER sqlite_svr;
--Testcase 1:
SELECT * FROM department LIMIT 10;
--Testcase 2:
SELECT * FROM employee LIMIT 10;
--Testcase 3:
SELECT * FROM empdata LIMIT 10;
--Testcase 4:
INSERT INTO department VALUES(generate_series(1,100), 'dept - ' || generate_series(1,100));
--Testcase 5:
INSERT INTO employee VALUES(generate_series(1,100), 'emp - ' || generate_series(1,100), generate_series(1,100));
--Testcase 6:
INSERT INTO empdata VALUES(1, decode ('01234567', 'hex'));
--Testcase 7:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 8:
INSERT INTO numbers VALUES(2, 'Two');
--Testcase 9:
INSERT INTO numbers VALUES(3, 'Three');
--Testcase 10:
INSERT INTO numbers VALUES(4, 'Four');
--Testcase 11:
INSERT INTO numbers VALUES(5, 'Five');
--Testcase 12:
INSERT INTO numbers VALUES(6, 'Six');
--Testcase 13:
INSERT INTO numbers VALUES(7, 'Seven');
--Testcase 14:
INSERT INTO numbers VALUES(8, 'Eight');
--Testcase 15:
INSERT INTO numbers VALUES(9, 'Nine');
--Testcase 16:
SELECT count(*) FROM department;
--Testcase 17:
SELECT count(*) FROM employee;
--Testcase 18:
SELECT count(*) FROM empdata;
--Testcase 19:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 20:
EXPLAIN (COSTS FALSE) SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) LIMIT 10;
--Testcase 21:
SELECT * FROM department d, employee e WHERE d.department_id = e.emp_dept_id LIMIT 10;
--Testcase 22:
SELECT * FROM department d, employee e WHERE d.department_id IN (SELECT department_id FROM department) ORDER BY d.department_id LIMIT 10;
--Testcase 23:
SELECT * FROM empdata;
--Testcase 24:
DELETE FROM employee WHERE emp_id = 10;
--Testcase 25:
SELECT COUNT(*) FROM department LIMIT 10;
--Testcase 26:
SELECT COUNT(*) FROM employee WHERE emp_id = 10;
--Testcase 27:
UPDATE employee SET emp_name = 'UPDATEd emp' WHERE emp_id = 20;
--Testcase 28:
SELECT emp_id, emp_name FROM employee WHERE emp_name like 'UPDATEd emp';
--Testcase 29:
UPDATE empdata SET emp_dat = decode ('0123', 'hex');
--Testcase 30:
SELECT * FROM empdata;
--Testcase 31:
SELECT * FROM employee LIMIT 10;
--Testcase 32:
SELECT * FROM employee WHERE emp_id IN (1);
--Testcase 33:
SELECT * FROM employee WHERE emp_id IN (1,3,4,5);
--Testcase 34:
SELECT * FROM employee WHERE emp_id IN (10000,1000);
--Testcase 35:
SELECT * FROM employee WHERE emp_id NOT IN (1) LIMIT 5;
--Testcase 36:
SELECT * FROM employee WHERE emp_id NOT IN (1,3,4,5) LIMIT 5;
--Testcase 37:
SELECT * FROM employee WHERE emp_id NOT IN (10000,1000) LIMIT 5;
--Testcase 38:
SELECT * FROM employee WHERE emp_id NOT IN (SELECT emp_id FROM employee WHERE emp_id IN (1,10));
--Testcase 39:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 1', 'emp - 2') LIMIT 5;
--Testcase 40:
SELECT * FROM employee WHERE emp_name NOT IN ('emp - 10') LIMIT 5;
--Testcase 41:
SELECT * FROM numbers WHERE (CASE WHEN a % 2 = 0 THEN 1 WHEN a % 5 = 0 THEN 1 ELSE 0 END) = 1;
--Testcase 42:
SELECT * FROM numbers WHERE (CASE b WHEN 'Two' THEN 1 WHEN 'Six' THEN 1 ELSE 0 END) = 1;
--Testcase 152:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 153:
SELECT * FROM numbers WHERE (round(abs(a)) = 1);
--Testcase 137:
create or replace function test_param_WHERE() returns void as $$
DECLARE
n varchar;
BEGIN
FOR x IN 1..9 LOOP
--Testcase 138:
SELECT b INTO n from numbers WHERE a=x;
raise notice 'Found number %', n;
end loop;
return;
END
$$ LANGUAGE plpgsql;
--Testcase 43:
SELECT test_param_WHERE();
--Testcase 44:
SELECT b from numbers WHERE a=1;
--Testcase 45:
EXPLAIN(COSTS OFF) SELECT b from numbers WHERE a=1;
--Testcase 46:
SELECT a FROM numbers WHERE b = (SELECT NULL::text);
--Testcase 47:
PREPARE stmt1 (int, int) AS
SELECT * FROM numbers WHERE a=$1 or a=$2;
--Testcase 48:
EXECUTE stmt1(1,2);
--Testcase 49:
EXECUTE stmt1(2,2);
--Testcase 50:
EXECUTE stmt1(3,2);
--Testcase 51:
EXECUTE stmt1(4,2);
-- generic plan
--Testcase 52:
EXECUTE stmt1(5,2);
--Testcase 53:
EXECUTE stmt1(6,2);
--Testcase 54:
EXECUTE stmt1(7,2);
--Testcase 55:
DELETE FROM employee;
--Testcase 56:
DELETE FROM department;
--Testcase 57:
DELETE FROM empdata;
--Testcase 58:
DELETE FROM numbers;
BEGIN;
--Testcase 59:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 60:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
--Testcase 61:
SELECT * from numbers;
BEGIN;
--Testcase 62:
INSERT INTO numbers VALUES(3, 'Three');
ROLLBACK;
--Testcase 63:
SELECT * from numbers;
BEGIN;
--Testcase 64:
INSERT INTO numbers VALUES(4, 'Four');
SAVEPOINT my_savepoint;
--Testcase 65:
INSERT INTO numbers VALUES(5, 'Five');
ROLLBACK TO SAVEPOINT my_savepoint;
--Testcase 66:
INSERT INTO numbers VALUES(6, 'Six');
COMMIT;
--Testcase 67:
SELECT * from numbers;
-- duplicate key
--Testcase 68:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 69:
DELETE from numbers;
BEGIN;
--Testcase 70:
INSERT INTO numbers VALUES(1, 'One');
--Testcase 71:
INSERT INTO numbers VALUES(2, 'Two');
COMMIT;
-- violate unique constraint
--Testcase 72:
UPDATE numbers SET b='Two' WHERE a = 1;
--Testcase 73:
SELECT * from numbers;
-- push down
--Testcase 74:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
-- (1,2,3) is pushed down
--Testcase 75:
explain (verbose, costs off) SELECT * from numbers WHERE a in (1,2,3) AND (1,2) < (a,5);
--Testcase 76:
explain (verbose, costs off) SELECT * from numbers WHERE a in (a+2*a,5);
--Testcase 77:
explain (verbose, costs off) SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
--Testcase 78:
SELECT * from numbers WHERE a = any(ARRAY[2,3,4,5]::int[]);
--Testcase 79:
SELECT * from numbers WHERE a = any(ARRAY[1,2,a]::int[]);
-- ANY with ARRAY expression
--Testcase 154:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 155:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, a + 1]);
--Testcase 156:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 157:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, a + 1]);
--Testcase 158:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 159:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, a + 1]);
--Testcase 160:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 161:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, a + 1]);
--Testcase 162:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 163:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, a + 1]);
--Testcase 164:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
--Testcase 165:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, a + 1]);
-- ANY with ARRAY const
--Testcase 166:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 167:
SELECT * FROM numbers WHERE a = ANY(ARRAY[1, 2]);
--Testcase 168:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 169:
SELECT * FROM numbers WHERE a <> ANY(ARRAY[1, 2]);
--Testcase 170:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 171:
SELECT * FROM numbers WHERE a >= ANY(ARRAY[1, 2]);
--Testcase 172:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 173:
SELECT * FROM numbers WHERE a <= ANY(ARRAY[1, 2]);
--Testcase 174:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 175:
SELECT * FROM numbers WHERE a > ANY(ARRAY[1, 2]);
--Testcase 176:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 177:
SELECT * FROM numbers WHERE a < ANY(ARRAY[1, 2]);
--Testcase 210:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 211:
SELECT * FROM numbers WHERE a = ANY('{1, 2, 3}');
--Testcase 212:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
--Testcase 213:
SELECT * FROM numbers WHERE a <> ANY('{1, 2, 3}');
-- ALL with ARRAY expression
--Testcase 178:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 179:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, a * 1]);
--Testcase 180:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 181:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, a + 1]);
--Testcase 182:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 183:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, a / 1]);
--Testcase 184:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 185:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, a + 1]);
--Testcase 186:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 187:
SELECT * FROM numbers WHERE a > ALL(ARRAY[1, a - 1]);
--Testcase 188:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
--Testcase 189:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, a + 1]);
-- ALL with ARRAY const
--Testcase 190:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 191:
SELECT * FROM numbers WHERE a = ALL(ARRAY[1, 1]);
--Testcase 192:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 193:
SELECT * FROM numbers WHERE a <> ALL(ARRAY[1, 3]);
--Testcase 194:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 195:
SELECT * FROM numbers WHERE a >= ALL(ARRAY[1, 2]);
--Testcase 196:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 197:
SELECT * FROM numbers WHERE a <= ALL(ARRAY[1, 2]);
--Testcase 198:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 199:
SELECT * FROM numbers WHERE a > ALL(ARRAY[0, 1]);
--Testcase 200:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
--Testcase 201:
SELECT * FROM numbers WHERE a < ALL(ARRAY[2, 3]);
-- ANY/ALL with TEXT ARRAY const
--Testcase 202:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 203:
SELECT * FROM numbers WHERE b = ANY(ARRAY['One', 'Two']);
--Testcase 204:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 205:
SELECT * FROM numbers WHERE b <> ALL(ARRAY['One', 'Four']);
--Testcase 206:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 207:
SELECT * FROM numbers WHERE b > ANY(ARRAY['One', 'Two']);
--Testcase 208:
EXPLAIN VERBOSE SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 209:
SELECT * FROM numbers WHERE b > ALL(ARRAY['Four', 'Five']);
--Testcase 80:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 81:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 82:
UPDATE multiprimary SET b = 10 WHERE c = 3;
--Testcase 83:
SELECT * from multiprimary;
--Testcase 84:
UPDATE multiprimary SET a = 10 WHERE a = 1;
--Testcase 85:
SELECT * from multiprimary;
--Testcase 86:
UPDATE multiprimary SET a = 100, b=200, c=300 WHERE a=10 AND b=10;
--Testcase 87:
SELECT * from multiprimary;
--Testcase 88:
UPDATE multiprimary SET a = 1234;
--Testcase 89:
SELECT * from multiprimary;
--Testcase 90:
UPDATE multiprimary SET a = a+1, b=b+1 WHERE b=200 AND c=300;
--Testcase 91:
SELECT * from multiprimary;
--Testcase 92:
DELETE from multiprimary WHERE a = 1235;
--Testcase 93:
SELECT * from multiprimary;
--Testcase 94:
DELETE from multiprimary WHERE b = 2;
--Testcase 95:
SELECT * from multiprimary;
--Testcase 96:
INSERT INTO multiprimary VALUES(1,2,3);
--Testcase 97:
INSERT INTO multiprimary VALUES(1,2,4);
--Testcase 98:
INSERT INTO multiprimary VALUES(1,10,20);
--Testcase 99:
INSERT INTO multiprimary VALUES(2,20,40);
--Testcase 100:
SELECT count(distinct a) from multiprimary;
--Testcase 101:
SELECT sum(b),max(b), min(b) from multiprimary;
--Testcase 102:
SELECT sum(b+5)+2 from multiprimary group by b/2 order by b/2;
--Testcase 103:
SELECT sum(a) from multiprimary group by b having sum(a) > 0 order by sum(a);
--Testcase 104:
SELECT sum(a) A from multiprimary group by b having avg(abs(a)) > 0 AND sum(a) > 0 order by A;
--Testcase 105:
SELECT count(nullif(a, 1)) FROM multiprimary;
--Testcase 106:
SELECT a,a FROM multiprimary group by 1,2;
--Testcase 107:
SELECT * from multiprimary, numbers WHERE multiprimary.a=numbers.a;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 109:
SELECT sum(a) FROM multiprimary HAVING sum(a) > 0;
--Testcase 110:
INSERT INTO numbers VALUES(4, 'Four');
-- All where clauses are pushed down
--Testcase 111:
SELECT * FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
--Testcase 112:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE abs(a) = 4 AND upper(b) = 'FOUR' AND lower(b) = 'four';
-- Only "length(b) = 4" are pushed down
--Testcase 113:
SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 114:
EXPLAIN (verbose, costs off) SELECT b, length(b) FROM numbers WHERE length(b) = 4 AND power(1, a) != 0 AND length(reverse(b)) = 4;
--Testcase 115:
INSERT INTO multiprimary (b,c) VALUES (99, 100);
--Testcase 116:
SELECT c FROM multiprimary WHERE COALESCE(a,b,c) = 99;
--Testcase 139:
CREATE FOREIGN TABLE multiprimary2(a int, b int, c int OPTIONS(column_name 'b')) SERVER sqlite_svr OPTIONS (table 'multiprimary');
--Testcase 117:
SELECT * FROM multiprimary2;
--Testcase 214:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN a OPTIONS(ADD column_name 'b');
--Testcase 118:
SELECT * FROM multiprimary2;
--Testcase 215:
ALTER FOREIGN TABLE multiprimary2 ALTER COLUMN b OPTIONS (column_name 'nosuch column');
--Testcase 119:
SELECT * FROM multiprimary2;
--Testcase 140:
EXPLAIN (VERBOSE) SELECT * FROM multiprimary2;
--Testcase 120:
SELECT a FROM multiprimary2 WHERE b = 1;
--Testcase 141:
CREATE FOREIGN TABLE columntest(a int OPTIONS(column_name 'a a', key 'true'), "b b" int OPTIONS(key 'true'), c int OPTIONS(column_name 'c c')) SERVER sqlite_svr;
--Testcase 121:
INSERT INTO columntest VALUES(1,2,3);
--Testcase 122:
UPDATE columntest SET c=10 WHERE a = 1;
--Testcase 123:
SELECT * FROM columntest;
--Testcase 124:
UPDATE columntest SET a=100 WHERE c = 10;
--Testcase 125:
SELECT * FROM columntest;
--Testcase 126:
INSERT INTO noprimary VALUES(1,'2');
--Testcase 127:
INSERT INTO noprimary SELECT * FROM noprimary;
--Testcase 128:
SELECT * FROM noprimary;
--get version
--Testcase 153:
\df sqlite*
--Testcase 154:
SELECT * FROM public.sqlite_fdw_version();
--Testcase 155:
SELECT sqlite_fdw_version();
-- issue #44 github
--Testcase 156:
CREATE FOREIGN TABLE fts_table (name text, description text) SERVER sqlite_svr;
--Testcase 157:
INSERT INTO fts_table VALUES ('this is name', 'this is description');
--Testcase 158:
SELECT * FROM fts_table; -- should work
--Testcase 159:
ALTER TABLE fts_table ALTER COLUMN name TYPE int;
--Testcase 160:
SELECT * FROM fts_table; -- should fail
-- issue #62 github
--Testcase 236:
INSERT INTO noprimary VALUES (4, 'Test''s');
--Testcase 237:
INSERT INTO noprimary VALUES (5, 'Test');
--Testcase 238:
SELECT * FROM noprimary;
--Testcase 239:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 240:
SELECT * FROM noprimary where b = 'Test''s';
--Testcase 241:
EXPLAIN VERBOSE
SELECT * FROM noprimary where b in ('Test''s', 'Test');
--Testcase 242:
SELECT * FROM noprimary where b in ('Test''s', 'Test');
-- INSERT/UPDATE whole row with generated column
--Testcase 216:
CREATE FOREIGN TABLE grem1_1 (
a int generated always as (0) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_1');
--Testcase 217:
INSERT INTO grem1_1 DEFAULT VALUES;
--Testcase 218:
SELECT * FROM grem1_1;
--Testcase 219:
CREATE FOREIGN TABLE grem1_2 (
a int generated always as (0) stored,
b int generated always as (1) stored,
c int generated always as (2) stored,
d int generated always as (3) stored)
SERVER sqlite_svr OPTIONS(table 'grem1_2');
--Testcase 220:
INSERT INTO grem1_2 DEFAULT VALUES;
--Testcase 221:
SELECT * FROM grem1_2;
-- Executable test case for pushdown CASE expressions (results)
--Testcase 224:
CREATE FOREIGN TABLE case_exp(c1 int OPTIONS (key 'true'), c3 text, c6 varchar(10)) SERVER sqlite_svr;
--Testcase 225:
INSERT INTO case_exp
SELECT id,
to_char(id, 'FM00000'),
id % 10
FROM generate_series(1, 10) id;
--Testcase 226:
SELECT * FROM case_exp;
-- CASE arg WHEN
--Testcase 227:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
--Testcase 228:
SELECT * FROM case_exp WHERE c1 > (CASE mod(c1, 4) WHEN 0 THEN 1 WHEN 2 THEN 50 ELSE 100 END);
-- these are shippable
--Testcase 229:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 230:
SELECT * FROM case_exp WHERE CASE c6 WHEN 'foo' THEN true ELSE c3 < 'bar' END;
--Testcase 231:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 232:
SELECT * FROM case_exp WHERE CASE c3 WHEN c6 THEN true ELSE c3 < 'bar' END;
-- but this is not because of collation
--Testcase 233:
SELECT * FROM case_exp WHERE CASE c3 COLLATE "C" WHEN c6 THEN true ELSE c3 < 'bar' END;
--Testcase 234:
DELETE FROM case_exp;
-- readonly/readwrite tests
-- Full combinations
-- force_RO default SERVER default TABLE default
-- force_RO default SERVER true TABLE default
-- force_RO default SERVER false TABLE default
-- force_RO default SERVER default TABLE true
-- force_RO default SERVER default TABLE false
-- force_RO default SERVER true TABLE true
-- force_RO default SERVER false TABLE true
-- force_RO default SERVER false TABLE false
-- force_RO default SERVER true TABLE false
-- force_RO false SERVER default TABLE default
-- force_RO false SERVER true TABLE default
-- force_RO false SERVER false TABLE default
-- force_RO false SERVER default TABLE true
-- force_RO false SERVER default TABLE false
-- force_RO false SERVER true TABLE true
-- force_RO false SERVER false TABLE true
-- force_RO false SERVER false TABLE false
-- force_RO false SERVER true TABLE false
-- force_RO true SERVER default TABLE default
-- force_RO true SERVER true TABLE default
-- force_RO true SERVER false TABLE default
-- force_RO true SERVER default TABLE true
-- force_RO true SERVER default TABLE false
-- force_RO true SERVER true TABLE true
-- force_RO true SERVER false TABLE true
-- force_RO true SERVER false TABLE false
-- force_RO true SERVER true TABLE false
-- force_RO default SERVER default TABLE default
--Testcase 235:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 236:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 237:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO default SERVER true TABLE default
--Testcase 238:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 239:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 240:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 241:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 242:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO default SERVER false TABLE default
--Testcase 243:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 244:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 245:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 246:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER default TABLE true
--Testcase 247:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 248:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 249:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 250:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 251:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO default SERVER default TABLE false
--Testcase 252:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 253:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 254:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 255:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO default SERVER true TABLE true
--Testcase 256:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 257:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 258:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 258:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 260:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 261:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO default SERVER false TABLE true
--Testcase 262:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 263:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 264:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 265:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO default SERVER false TABLE false
--Testcase 266:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 267:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 268:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 269:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO default SERVER true TABLE false
--Testcase 270:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 271:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 272:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 273:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 274:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 275:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 276:
SELECT * FROM RO_RW_test ORDER BY i;
--Bind error message test for some unsupported data type
--Testcase 277:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 278:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 279:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 277:
DELETE FROM RO_RW_test;
--Testcase 278:
ALTER SERVER sqlite_svr OPTIONS (ADD force_readonly 'false');
-- force_RO false SERVER default TABLE default
--Testcase 279:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- OK
--Testcase 280:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- OK
--Testcase 281:
DELETE FROM RO_RW_test WHERE i=2; -- OK
-- force_RO false SERVER true TABLE default
--Testcase 282:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 283:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- OK
--Testcase 284:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- OK
--Testcase 285:
DELETE FROM RO_RW_test WHERE i=3; -- OK
--Testcase 286:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- OK
-- force_RO false SERVER false TABLE default
--Testcase 287:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 288:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 289:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 290:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER default TABLE true
--Testcase 291:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 292:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 293:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- OK
--Testcase 294:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- OK
--Testcase 295:
DELETE FROM RO_RW_test WHERE i=6; -- OK
-- force_RO false SERVER default TABLE false
--Testcase 296:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 297:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 298:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 299:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO false SERVER true TABLE true
--Testcase 300:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 301:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true');
--Testcase 302:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- OK
--Testcase 303:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 304:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 305:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- OK
-- force_RO false SERVER false TABLE true
--Testcase 306:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 307:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- OK
--Testcase 308:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- OK
--Testcase 309:
DELETE FROM RO_RW_test WHERE i=9; -- OK
-- force_RO false SERVER false TABLE false
--Testcase 310:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 311:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 312:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 313:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO false SERVER true TABLE false
--Testcase 314:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 315:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 316:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 317:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 318:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 319:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 320:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 321:
DELETE FROM RO_RW_test;
--Testcase 322:
ALTER SERVER sqlite_svr OPTIONS (SET force_readonly 'true');
-- force_RO true SERVER default TABLE default
--Testcase 323:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (2, 'B', 3.01, 1); -- ERR
--Testcase 324:
UPDATE RO_RW_test SET a='C' WHERE i=2; -- ERR
--Testcase 325:
DELETE FROM RO_RW_test WHERE i=2; -- ERR
-- force_RO true SERVER true TABLE default
--Testcase 326:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true');
--Testcase 327:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (3, 'D', 5.02, 8); -- ERR
--Testcase 328:
UPDATE RO_RW_test SET a='E' WHERE i=3; -- ERR
--Testcase 329:
DELETE FROM RO_RW_test WHERE i=3; -- ERR
--Testcase 330:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (4, 'F', 0.005, 5); -- ERR
-- force_RO true SERVER false TABLE default
--Testcase 331:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 332:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (5, 'H', 0.03, 7); -- ERR
--Testcase 333:
UPDATE RO_RW_test SET a='E' WHERE i=4; -- ERR
--Testcase 334:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER default TABLE true
--Testcase 335:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 336:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (ADD updatable 'true');
--Testcase 337:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (6, 'I', 1.403, 2); -- ERR
--Testcase 338:
UPDATE RO_RW_test SET a='J' WHERE i=6; -- ERR
--Testcase 339:
DELETE FROM RO_RW_test WHERE i=6; -- ERR
-- force_RO true SERVER default TABLE false
--Testcase 340:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 341:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (7, 'K', 2.01, 4); -- ERR
--Testcase 342:
UPDATE RO_RW_test SET a='L' WHERE i=4; -- ERR
--Testcase 343:
DELETE FROM RO_RW_test WHERE i=4; -- ERR
-- force_RO true SERVER true TABLE true
--Testcase 344:
ALTER SERVER sqlite_svr OPTIONS (ADD updatable 'true'); -- ERR
--Testcase 345:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'true'); -- ERR
--Testcase 346:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (8, 'M', 5.02, 8); -- ERR
--Testcase 347:
UPDATE RO_RW_test SET a='N' WHERE i=8; -- OK
--Testcase 348:
DELETE FROM RO_RW_test WHERE i=8; -- OK
--Testcase 349:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (9, 'O', 3.21, 9); -- ERR
-- force_RO true SERVER false TABLE true
--Testcase 350:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'false');
--Testcase 351:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (10, 'P', 4.15, 1); -- ERR
--Testcase 352:
UPDATE RO_RW_test SET a='Q' WHERE i=9; -- ERR
--Testcase 353:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER false TABLE false
--Testcase 354:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (SET updatable 'false');
--Testcase 355:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (11, 'Q', 2.27, 5); -- ERR
--Testcase 356:
UPDATE RO_RW_test SET a='S' WHERE i=9; -- ERR
--Testcase 357:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
-- force_RO true SERVER true TABLE false
--Testcase 358:
ALTER SERVER sqlite_svr OPTIONS (SET updatable 'true');
--Testcase 359:
INSERT INTO RO_RW_test (i, a, b, c) VALUES (12, 'R', 6.18, 11); -- ERR
--Testcase 360:
UPDATE RO_RW_test SET a='T' WHERE i=9; -- ERR
--Testcase 361:
DELETE FROM RO_RW_test WHERE i=9; -- ERR
--Testcase 362:
ALTER SERVER sqlite_svr OPTIONS (DROP updatable);
--Testcase 363:
ALTER FOREIGN TABLE RO_RW_test OPTIONS (DROP updatable);
--Testcase 364:
ALTER SERVER sqlite_svr OPTIONS (DROP force_readonly);
--Testcase 365:
SELECT * FROM RO_RW_test ORDER BY i;
--Testcase 366:
DROP FOREIGN TABLE RO_RW_test;
-- End of RO/RW test
--Bind error message test for some unsupported data type
--Testcase 366:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE tsquery;
--Testcase 367:
INSERT INTO numbers VALUES(8,'fat & (rat | cat)');
--Testcase 368:
ALTER FOREIGN TABLE numbers ALTER COLUMN b TYPE varchar(255);
--Testcase 142:
DROP FUNCTION test_param_WHERE();
--Testcase 143:
DROP FOREIGN TABLE numbers;
--Testcase 144:
DROP FOREIGN TABLE department;
--Testcase 145:
DROP FOREIGN TABLE employee;
--Testcase 146:
DROP FOREIGN TABLE empdata;
--Testcase 147:
DROP FOREIGN TABLE multiprimary;
--Testcase 148:
DROP FOREIGN TABLE multiprimary2;
--Testcase 149:
DROP FOREIGN TABLE columntest;
--Testcase 150:
DROP FOREIGN TABLE noprimary;
--Testcase 161:
DROP FOREIGN TABLE fts_table;
--Testcase 222:
DROP FOREIGN TABLE grem1_1;
--Testcase 223:
DROP FOREIGN TABLE grem1_2;
--Testcase 235:
DROP FOREIGN TABLE case_exp;
--Testcase 151:
DROP SERVER sqlite_svr;
--Testcase 152:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/bitstring.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 02:
CREATE FOREIGN TABLE "type_BIT"( "i" int OPTIONS (key 'true'), "b" bit(6)) SERVER sqlite_svr OPTIONS (table 'type_BIT');
--Testcase 03:
DROP FOREIGN TABLE IF EXISTS "type_BIT+";
--Testcase 04:
CREATE FOREIGN TABLE "type_BIT+"( "i" int OPTIONS (key 'true'), "b" bit(6), "t" text, "l" smallint, "bi" bigint OPTIONS (column_name 'b')) SERVER sqlite_svr OPTIONS (table 'type_BIT+');
--Testcase 05: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (1, 1);
--Testcase 06: type mismatch
INSERT INTO "type_BIT" ("i", "b") VALUES (2, 2);
--Testcase 07: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (3, '1');
--Testcase 08: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (4, '10');
--Testcase 09: improper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (5, '101');
--Testcase 10:
INSERT INTO "type_BIT" ("i", "b") VALUES (6, '110110');
--Testcase 11:
INSERT INTO "type_BIT" ("i", "b") VALUES (7, '111001');
--Testcase 12:
INSERT INTO "type_BIT" ("i", "b") VALUES (8, '110000');
--Testcase 13:
INSERT INTO "type_BIT" ("i", "b") VALUES (9, '100001');
--Testcase 14: type mismatch with proper data length
INSERT INTO "type_BIT" ("i", "b") VALUES (10, 53);
--Testcase 15:
SELECT * FROM "type_BIT+";
--Testcase 16:
SELECT * FROM "type_BIT" WHERE b < '110110';
--Testcase 17:
SELECT * FROM "type_BIT" WHERE b > '110110';
--Testcase 18:
SELECT * FROM "type_BIT" WHERE b = '110110';
--Testcase 20:
CREATE FOREIGN TABLE "type_VARBIT"( "i" int OPTIONS (key 'true'), "b" varbit(70)) SERVER sqlite_svr OPTIONS (table 'type_VARBIT');
--Testcase 21:
DROP FOREIGN TABLE IF EXISTS "type_VARBIT+";
--Testcase 22:
CREATE FOREIGN TABLE "type_VARBIT+"( "i" int OPTIONS (key 'true'), "b" varbit(70), "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_VARBIT+');
--Testcase 23:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (1, '1');
--Testcase 24:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (2, '10');
--Testcase 25:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (3, '11');
--Testcase 26:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (4, '100');
--Testcase 27:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (5, '101');
--Testcase 28:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (6, '110110');
--Testcase 29:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (7, '111001');
--Testcase 30:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (8, '110000');
--Testcase 31:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (9, '100001');
--Testcase 32:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (10, '0100100101011001010010101000111110110101101101111011000101010');
--Testcase 33:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (11, '01001001010110010100101010001111101101011011011110110001010101');
--Testcase 34:
SELECT * FROM "type_VARBIT+";
--Testcase 35:
SELECT * FROM "type_VARBIT+" WHERE b < '110110';
--Testcase 36:
SELECT * FROM "type_VARBIT+" WHERE b > '110110';
--Testcase 37:
SELECT * FROM "type_VARBIT+" WHERE b = '110110';
--Testcase 38:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (12, '010010010101100101001010100011111011010110110111101100010101010');
--Testcase 39:
INSERT INTO "type_VARBIT" ("i", "b") VALUES (13, '0100100101011001010010101000111110110101101101111011000101010101');
--Testcase 40: very long bit string, expected ERROR, 65 bits
INSERT INTO "type_VARBIT" ("i", "b") VALUES (14, '01001001010110010100101010001111101101011011011110110001010101010');
--Testcase 41:
SELECT * FROM "type_VARBIT+" WHERE "i" > 10;
--Testcase 42:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 43:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 44:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 45:
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 46:
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 47:
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 48:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 49:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 50:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_BIT" b1 INNER JOIN "type_BIT" b2 ON true;
--Testcase 51:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_BIT";
--Testcase 52:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_BIT";
--Testcase 53:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_BIT";
--Testcase 54:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 55:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 56:
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 57:
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 58:
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 59:
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 60:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" | b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 61:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" & b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 62:
EXPLAIN VERBOSE
SELECT b1."i" "i₁", b1."b" "b₁", b2."i" "i₂", b2."b" "b₂", b1."b" # b2."b" "res" FROM "type_VARBIT" b1 INNER JOIN "type_VARBIT" b2 ON true;
--Testcase 63:
EXPLAIN VERBOSE
SELECT "i", "b", "b" >> 2 "res" FROM "type_VARBIT";
--Testcase 64:
EXPLAIN VERBOSE
SELECT "i", "b", "b" << 3 "res" FROM "type_VARBIT";
--Testcase 65:
EXPLAIN VERBOSE
SELECT "i", "b", ~ "b" "res" FROM "type_VARBIT";
--Testcase 66:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 67:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 68:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 69:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 70:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 71:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 72:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 73:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 74:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 75:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 76:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 77:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 78:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 79:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 80:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 81:
SELECT "i", "b", "b" & B'101011' "res" FROM "type_BIT";
--Testcase 82:
SELECT "i", "b", "b" | B'101011' "res" FROM "type_BIT";
--Testcase 83:
SELECT "i", "b", "b" # B'101011' "res" FROM "type_BIT";
--Testcase 84:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 85:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 86:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 87:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 88:
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 89:
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 90:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" & B'101011') IS NOT NULL;
--Testcase 91:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" | B'101011') IS NOT NULL;
--Testcase 92:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" # B'101011') IS NOT NULL;
--Testcase 93:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" >> 1) IS NOT NULL;
--Testcase 94:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE ("b" << 2) IS NOT NULL;
--Testcase 95:
EXPLAIN VERBOSE
SELECT "i", "b" FROM "type_BIT" WHERE (~ "b") IS NOT NULL;
--Testcase 005:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/bool.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 000:
CREATE EXTENSION sqlite_fdw;
--Testcase 001:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 01:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int OPTIONS (key 'true'), b bool) SERVER sqlite_svr;
--Testcase 02:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (1, TRUE);
--Testcase 03:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (2, FALSE);
--Testcase 04:
CREATE FOREIGN TABLE "type_BOOLEAN+"( "i" int, "b" bool, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN+');
--Testcase 05:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE text;
--Testcase 06:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (3, TRUE);
--Testcase 07:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (4, FALSE);
--Testcase 08:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (5, true);
--Testcase 09:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (6, false);
--Testcase 10:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (7, 'Yes');
--Testcase 11:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (8, 'YeS');
--Testcase 12:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (9, 'yes');
--Testcase 13:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (10, 'no');
--Testcase 14:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (11, 'No');
--Testcase 15:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (12, 'nO');
--Testcase 16:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (13, 'off');
--Testcase 17:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (14, 'oFf');
--Testcase 18:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (15, 'on');
--Testcase 19:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (16, 'ON');
--Testcase 20:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (17, 't');
--Testcase 21:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (18, 'T');
--Testcase 22:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (19, 'Y');
--Testcase 23:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (20, 'y');
--Testcase 24:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (21, 'F');
--Testcase 25:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (22, 'f');
--Testcase 26:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (23, 'x');
--Testcase 27:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (24, '0');
--Testcase 28:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (25, '1');
--Testcase 29:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (26, NULL);
--Testcase 30:
SELECT * FROM "type_BOOLEAN";
--Testcase 31:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 32:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN";
--Testcase 33:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_BOOLEAN+";
--Testcase 34: ERR - invalid text affinity because not ISO:SQL text input
SELECT * FROM "type_BOOLEAN+";
--Testcase 35
DELETE FROM "type_BOOLEAN" WHERE i = 23;
--Testcase 36:
SELECT * FROM "type_BOOLEAN+";
--Testcase 37:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NULL;
--Testcase 38:
SELECT * FROM "type_BOOLEAN+" WHERE b IS NOT NULL;
--Testcase 39:
SELECT * FROM "type_BOOLEAN+" WHERE b;
--Testcase 40:
SELECT * FROM "type_BOOLEAN+" WHERE NOT b;
--Testcase 41:
CREATE FOREIGN TABLE "type_BOOLEANpk" (col bool OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 42:
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 43:
INSERT INTO "type_BOOLEANpk" VALUES (FALSE);
--Testcase 44: ERR - primary key
INSERT INTO "type_BOOLEANpk" VALUES (TRUE);
--Testcase 45:
DELETE FROM "type_BOOLEANpk";
--Testcase 46:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE float8;
--Testcase 47:
INSERT INTO "type_BOOLEAN"(i, b) VALUES (27, 3.14159265358979);
--Testcase 48:
ALTER FOREIGN TABLE "type_BOOLEAN" ALTER COLUMN "b" TYPE bool;
--Testcase 49: ERR - invalid float for bool column
SELECT * FROM "type_BOOLEAN+";
--Testcase 50
DELETE FROM "type_BOOLEAN" WHERE i = 27;
--Testcase 51:
SELECT * FROM "type_BOOLEAN+";
--Testcase 52:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE b;
--Testcase 53:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN" SET b = NULL WHERE NOT b;
--Testcase 54:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE b;
--Testcase 55:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN" WHERE NOT b;
--Testcase 56:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 57:
SELECT *, NOT b nb FROM "type_BOOLEAN+" b;
--Testcase 58:
CREATE FOREIGN TABLE "type_BOOLEAN_oper"( "i" int OPTIONS (key 'true'), i1 smallint, b1 boolean, i2 smallint, b2 boolean) SERVER sqlite_svr OPTIONS (table 'type_BOOLEAN_oper');
--Testcase 59: see INIT.SQL with mixed affinity boolean data
SELECT * FROM "type_BOOLEAN_oper";
--Testcase 60:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 61:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper";
--Testcase 62:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 63:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 AND b2;
--Testcase 64:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 65:
SELECT DISTINCT b1, b2, b1 AND b2 a, b1 OR b2 o FROM "type_BOOLEAN_oper" WHERE b1 OR b2;
--Testcase 66:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 67:
UPDATE "type_BOOLEAN_oper" SET b1 = NULL WHERE NOT b1;
--Testcase 68:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 69:
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 70:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_BOOLEAN_oper" SET b1 = false WHERE b1 OR b2;
--Testcase 71:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 72:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 73:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b1 AND b2;
--Testcase 74:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 75:
DELETE FROM "type_BOOLEAN_oper" WHERE NOT b2;
--Testcase 76:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 77:
DELETE FROM "type_BOOLEAN_oper" WHERE b2;
--Testcase 78:
SELECT DISTINCT b1, b2 FROM "type_BOOLEAN_oper";
--Testcase 79:
DELETE FROM "type_BOOLEAN";
--Testcase 003:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/float4.sql
================================================
--
-- FLOAT4
--
--Testcase 46:
CREATE EXTENSION sqlite_fdw;
--Testcase 47:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 48:
CREATE FOREIGN TABLE FLOAT4_TBL(f1 float4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 49:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT4_TBL(f1) VALUES (' 0.0');
--Testcase 2:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT4_TBL(f1) VALUES (' -34.84 ');
--Testcase 4:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e+20');
--Testcase 5:
INSERT INTO FLOAT4_TBL(f1) VALUES ('1.2345678901234e-20');
-- test for over and under flow
--Testcase 6:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70');
--Testcase 7:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70');
--Testcase 8:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70');
--Testcase 9:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70');
--Testcase 50:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e70'::float8);
--Testcase 51:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e70'::float8);
--Testcase 52:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-70'::float8);
--Testcase 53:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-70'::float8);
--Testcase 54:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e400');
--Testcase 55:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e400');
--Testcase 56:
INSERT INTO FLOAT4_TBL(f1) VALUES ('10e-400');
--Testcase 57:
INSERT INTO FLOAT4_TBL(f1) VALUES ('-10e-400');
-- bad input
--Testcase 10:
INSERT INTO FLOAT4_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT4_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT4_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT4_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT4_TBL(f1) VALUES (' - 3.0');
--Testcase 17:
INSERT INTO FLOAT4_TBL(f1) VALUES ('123 5');
-- Also try it with non-error-throwing API
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_FLOAT4(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
INSERT INTO NON_ERROR_THROWING_API_FLOAT4 VALUES ('34.5', 1), ('xyz', 2), ('1e400', 3);
SELECT pg_input_is_valid(f1, 'float4') FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 1;
SELECT pg_input_is_valid(f1, 'float4') FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 2;
SELECT pg_input_is_valid(f1, 'float4') FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 3;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_FLOAT4 WHERE id = 3), 'float4');
-- special inputs
--Testcase 18:
DELETE FROM FLOAT4_TMP;
--Testcase 58:
INSERT INTO FLOAT4_TMP VALUES ('NaN'::float4);
--Testcase 59:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 20:
DELETE FROM FLOAT4_TMP;
--Testcase 60:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4);
--Testcase 61:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 21:
DELETE FROM FLOAT4_TMP;
--Testcase 62:
INSERT INTO FLOAT4_TMP VALUES (' NAN '::float4);
--Testcase 63:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 22:
DELETE FROM FLOAT4_TMP;
--Testcase 64:
INSERT INTO FLOAT4_TMP VALUES ('infinity'::float4);
--Testcase 65:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 23:
DELETE FROM FLOAT4_TMP;
--Testcase 66:
INSERT INTO FLOAT4_TMP VALUES (' -INFINiTY '::float4);
--Testcase 67:
SELECT f1 FROM FLOAT4_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT4_TMP;
--Testcase 68:
INSERT INTO FLOAT4_TMP VALUES ('N A N'::float4);
--Testcase 69:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 26:
DELETE FROM FLOAT4_TMP;
--Testcase 70:
INSERT INTO FLOAT4_TMP VALUES ('NaN x'::float4);
--Testcase 71:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 27:
DELETE FROM FLOAT4_TMP;
--Testcase 72:
INSERT INTO FLOAT4_TMP VALUES (' INFINITY x'::float4);
--Testcase 73:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 28:
DELETE FROM FLOAT4_TMP;
--Testcase 74:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 + 100.0);
--Testcase 75:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 30:
DELETE FROM FLOAT4_TMP;
--Testcase 76:
INSERT INTO FLOAT4_TMP VALUES ('Infinity'::float4 / 'Infinity'::float4);
--Testcase 77:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 185:
DELETE FROM FLOAT4_TMP;
--Testcase 186:
INSERT INTO FLOAT4_TMP VALUES ('42'::float4 / 'Infinity'::float4);
--Testcase 187:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 31:
DELETE FROM FLOAT4_TMP;
--Testcase 78:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / 'nan'::float4);
--Testcase 79:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 188:
DELETE FROM FLOAT4_TMP;
--Testcase 189:
INSERT INTO FLOAT4_TMP VALUES ('nan'::float4 / '0'::float4);
--Testcase 190:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 32:
DELETE FROM FLOAT4_TMP;
--Testcase 80:
INSERT INTO FLOAT4_TMP VALUES ('nan'::numeric::float4);
--Testcase 81:
SELECT f1 FROM FLOAT4_TMP;
--Testcase 34:
SELECT * FROM FLOAT4_TBL;
--SELECT '' AS four, f.* FROM FLOAT4_TBL f WHERE f.f1 <> '1004.3';
--SELECT '' AS one, f.* FROM FLOAT4_TBL f WHERE f.f1 = '1004.3';
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE '1004.3' > f.f1;
--SELECT '' AS three, f.* FROM FLOAT4_TBL f WHERE f.f1 < '1004.3';
--Testcase 35:
SELECT f.* FROM FLOAT4_TBL f WHERE '1004.3' >= f.f1;
--Testcase 36:
SELECT f.* FROM FLOAT4_TBL f WHERE f.f1 <= '1004.3';
--Testcase 37:
SELECT f.f1, f.f1 * '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 38:
SELECT f.f1, f.f1 + '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 39:
SELECT f.f1, f.f1 / '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
--Testcase 40:
SELECT f.f1, f.f1 - '-10' AS x FROM FLOAT4_TBL f
WHERE f.f1 > '0.0';
-- test divide by zero
--Testcase 41:
SELECT f.f1 / '0.0' from FLOAT4_TBL f;
--Testcase 42:
SELECT * FROM FLOAT4_TBL;
-- test the unary float4abs operator
--Testcase 43:
SELECT f.f1, @f.f1 AS abs_f1 FROM FLOAT4_TBL f;
--Testcase 44:
UPDATE FLOAT4_TBL
SET f1 = FLOAT4_TBL.f1 * '-1'
WHERE FLOAT4_TBL.f1 > '0.0';
--Testcase 45:
SELECT * FROM FLOAT4_TBL;
-- test edge-case coercions to integer
--Testcase 82:
DELETE FROM FLOAT4_TMP;
--Testcase 83:
INSERT INTO FLOAT4_TMP VALUES ('32767.4'::float4);
--Testcase 84:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 85:
DELETE FROM FLOAT4_TMP;
--Testcase 86:
INSERT INTO FLOAT4_TMP VALUES ('32767.6'::float4);
--Testcase 87:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 88:
DELETE FROM FLOAT4_TMP;
--Testcase 89:
INSERT INTO FLOAT4_TMP VALUES ('-32768.4'::float4);
--Testcase 90:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 91:
DELETE FROM FLOAT4_TMP;
--Testcase 92:
INSERT INTO FLOAT4_TMP VALUES ('-32768.6'::float4);
--Testcase 93:
SELECT f1::int2 FROM FLOAT4_TMP;
--Testcase 94:
DELETE FROM FLOAT4_TMP;
--Testcase 95:
INSERT INTO FLOAT4_TMP VALUES ('2147483520'::float4);
--Testcase 96:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 97:
DELETE FROM FLOAT4_TMP;
--Testcase 98:
INSERT INTO FLOAT4_TMP VALUES ('2147483647'::float4);
--Testcase 99:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 100:
DELETE FROM FLOAT4_TMP;
--Testcase 101:
INSERT INTO FLOAT4_TMP VALUES ('-2147483648.5'::float4);
--Testcase 102:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 103:
DELETE FROM FLOAT4_TMP;
--Testcase 104:
INSERT INTO FLOAT4_TMP VALUES ('-2147483900'::float4);
--Testcase 105:
SELECT f1::int4 FROM FLOAT4_TMP;
--Testcase 106:
DELETE FROM FLOAT4_TMP;
--Testcase 107:
INSERT INTO FLOAT4_TMP VALUES ('9223369837831520256'::float4);
--Testcase 108:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 109:
DELETE FROM FLOAT4_TMP;
--Testcase 110:
INSERT INTO FLOAT4_TMP VALUES ('9223372036854775807'::float4);
--Testcase 111:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 112:
DELETE FROM FLOAT4_TMP;
--Testcase 113:
INSERT INTO FLOAT4_TMP VALUES ('-9223372036854775808.5'::float4);
--Testcase 114:
SELECT f1::int8 FROM FLOAT4_TMP;
--Testcase 115:
DELETE FROM FLOAT4_TMP;
--Testcase 116:
INSERT INTO FLOAT4_TMP VALUES ('-9223380000000000000'::float4);
--Testcase 117:
SELECT f1::int8 FROM FLOAT4_TMP;
-- Test for correct input rounding in edge cases.
-- These lists are from Paxson 1991, excluding subnormals and
-- inputs of over 9 sig. digits.
--Testcase 118:
DELETE FROM FLOAT4_TMP;
--Testcase 119:
INSERT INTO FLOAT4_TMP VALUES ('5e-20'::float4);
--Testcase 120:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 121:
DELETE FROM FLOAT4_TMP;
--Testcase 122:
INSERT INTO FLOAT4_TMP VALUES ('67e14'::float4);
--Testcase 123:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 124:
DELETE FROM FLOAT4_TMP;
--Testcase 125:
INSERT INTO FLOAT4_TMP VALUES ('985e15'::float4);
--Testcase 126:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 127:
DELETE FROM FLOAT4_TMP;
--Testcase 128:
INSERT INTO FLOAT4_TMP VALUES ('55895e-16'::float4);
--Testcase 129:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 130:
DELETE FROM FLOAT4_TMP;
--Testcase 131:
INSERT INTO FLOAT4_TMP VALUES ('7038531e-32'::float4);
--Testcase 132:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 133:
DELETE FROM FLOAT4_TMP;
--Testcase 134:
INSERT INTO FLOAT4_TMP VALUES ('702990899e-20'::float4);
--Testcase 135:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 136:
DELETE FROM FLOAT4_TMP;
--Testcase 137:
INSERT INTO FLOAT4_TMP VALUES ('3e-23'::float4);
--Testcase 138:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 139:
DELETE FROM FLOAT4_TMP;
--Testcase 140:
INSERT INTO FLOAT4_TMP VALUES ('57e18'::float4);
--Testcase 141:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 142:
DELETE FROM FLOAT4_TMP;
--Testcase 143:
INSERT INTO FLOAT4_TMP VALUES ('789e-35'::float4);
--Testcase 144:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 145:
DELETE FROM FLOAT4_TMP;
--Testcase 146:
INSERT INTO FLOAT4_TMP VALUES ('2539e-18'::float4);
--Testcase 147:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 148:
DELETE FROM FLOAT4_TMP;
--Testcase 149:
INSERT INTO FLOAT4_TMP VALUES ('76173e28'::float4);
--Testcase 150:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 151:
DELETE FROM FLOAT4_TMP;
--Testcase 152:
INSERT INTO FLOAT4_TMP VALUES ('887745e-11'::float4);
--Testcase 153:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 154:
DELETE FROM FLOAT4_TMP;
--Testcase 155:
INSERT INTO FLOAT4_TMP VALUES ('5382571e-37'::float4);
--Testcase 156:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 157:
DELETE FROM FLOAT4_TMP;
--Testcase 158:
INSERT INTO FLOAT4_TMP VALUES ('82381273e-35'::float4);
--Testcase 159:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 160:
DELETE FROM FLOAT4_TMP;
--Testcase 161:
INSERT INTO FLOAT4_TMP VALUES ('750486563e-38'::float4);
--Testcase 162:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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...
--Testcase 163:
DELETE FROM FLOAT4_TMP;
--Testcase 164:
INSERT INTO FLOAT4_TMP VALUES ('1.17549435e-38'::float4);
--Testcase 165:
SELECT float4send(f1) FROM FLOAT4_TMP;
--Testcase 166:
DELETE FROM FLOAT4_TMP;
--Testcase 167:
INSERT INTO FLOAT4_TMP VALUES('1.1754944e-38'::float4);
--Testcase 168:
SELECT float4send(f1) FROM FLOAT4_TMP;
-- 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).
--Testcase 169:
create type xfloat4;
--Testcase 170:
create function xfloat4in(cstring) returns xfloat4 immutable strict
language internal as 'int4in';
--Testcase 171:
create function xfloat4out(xfloat4) returns cstring immutable strict
language internal as 'int4out';
--Testcase 172:
create type xfloat4 (input = xfloat4in, output = xfloat4out, like = float4);
--Testcase 173:
create cast (xfloat4 as float4) without function;
--Testcase 174:
create cast (float4 as xfloat4) without function;
--Testcase 175:
create cast (xfloat4 as integer) without function;
--Testcase 176:
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.
--Testcase 177:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 178:
insert into testdata(bits) 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');
--Testcase 179:
select float4send(flt) as ibits,
flt
from (select bits::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
begin;
--Testcase 180:
insert into testdata(bits) 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');
--Testcase 181:
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::bit(32)::integer::xfloat4::float4 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 182:
drop type xfloat4 cascade;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/float8.sql
================================================
--
-- FLOAT8
--
--Testcase 113:
CREATE EXTENSION sqlite_fdw;
--Testcase 114:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 115:
CREATE FOREIGN TABLE FLOAT8_TBL(f1 float8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 116:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO FLOAT8_TBL(f1) VALUES (' 0.0 ');
--Testcase 2:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1004.30 ');
--Testcase 3:
INSERT INTO FLOAT8_TBL(f1) VALUES (' -34.84');
--Testcase 4:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e+200');
--Testcase 5:
INSERT INTO FLOAT8_TBL(f1) VALUES ('1.2345678901234e-200');
-- test for underflow and overflow handling
--Testcase 6:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e400'::float8);
--Testcase 7:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e400'::float8);
--Testcase 8:
INSERT INTO FLOAT8_TMP(f1) VALUES ('10e-400'::float8);
--Testcase 9:
INSERT INTO FLOAT8_TMP(f1) VALUES ('-10e-400'::float8);
-- test smallest normalized input
--Testcase 117:
INSERT INTO FLOAT8_TMP(f1) VALUES ('2.2250738585072014E-308'::float8);
--Testcase 118:
SELECT float8send(f1) FROM FLOAT8_TMP;
-- bad input
--Testcase 10:
INSERT INTO FLOAT8_TBL(f1) VALUES ('');
--Testcase 11:
INSERT INTO FLOAT8_TBL(f1) VALUES (' ');
--Testcase 12:
INSERT INTO FLOAT8_TBL(f1) VALUES ('xyz');
--Testcase 13:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5.0.0');
--Testcase 14:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5 . 0');
--Testcase 15:
INSERT INTO FLOAT8_TBL(f1) VALUES ('5. 0');
--Testcase 16:
INSERT INTO FLOAT8_TBL(f1) VALUES (' - 3');
--Testcase 17:
INSERT INTO FLOAT8_TBL(f1) VALUES ('123 5');
-- Also try it with non-error-throwing API
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_FLOAT8(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
INSERT INTO NON_ERROR_THROWING_API_FLOAT8 VALUES ('34.5', 1), ('xyz', 2), ('1e4000', 3);
SELECT pg_input_is_valid(f1, 'float8') FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 1;
SELECT pg_input_is_valid(f1, 'float8') FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 2;
SELECT pg_input_is_valid(f1, 'float8') FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 3;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_FLOAT8 WHERE id = 3), 'float8');
-- special inputs
--Testcase 19:
DELETE FROM FLOAT8_TMP;
--Testcase 119:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8);
--Testcase 120:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 20:
DELETE FROM FLOAT8_TMP;
--Testcase 121:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8);
--Testcase 122:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 21:
DELETE FROM FLOAT8_TMP;
--Testcase 123:
INSERT INTO FLOAT8_TMP VALUES (' NAN '::float8);
--Testcase 124:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 22:
DELETE FROM FLOAT8_TMP;
--Testcase 125:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8);
--Testcase 126:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 23:
DELETE FROM FLOAT8_TMP;
--Testcase 127:
INSERT INTO FLOAT8_TMP VALUES (' -INFINiTY '::float8);
--Testcase 128:
SELECT f1 FROM FLOAT8_TMP;
-- bad special inputs
--Testcase 25:
DELETE FROM FLOAT8_TMP;
--Testcase 129:
INSERT INTO FLOAT8_TMP VALUES ('N A N'::float8);
--Testcase 130:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 26:
DELETE FROM FLOAT8_TMP;
--Testcase 131:
INSERT INTO FLOAT8_TMP VALUES ('NaN x'::float8);
--Testcase 132:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 27:
DELETE FROM FLOAT8_TMP;
--Testcase 133:
INSERT INTO FLOAT8_TMP VALUES (' INFINITY x'::float8);
--Testcase 134:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 28:
DELETE FROM FLOAT8_TMP;
--Testcase 135:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 + 100.0);
--Testcase 136:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 30:
DELETE FROM FLOAT8_TMP;
--Testcase 137:
INSERT INTO FLOAT8_TMP VALUES ('Infinity'::float8 / 'Infinity'::float8);
--Testcase 138:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 272:
DELETE FROM FLOAT8_TMP;
--Testcase 273:
INSERT INTO FLOAT8_TMP VALUES ('42'::float8 / 'Infinity'::float8);
--Testcase 274:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 31:
DELETE FROM FLOAT8_TMP;
--Testcase 139:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / 'nan'::float8);
--Testcase 140:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 275:
DELETE FROM FLOAT8_TMP;
--Testcase 276:
INSERT INTO FLOAT8_TMP VALUES ('nan'::float8 / '0'::float8);
--Testcase 277:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 32:
DELETE FROM FLOAT8_TMP;
--Testcase 141:
INSERT INTO FLOAT8_TMP VALUES ('nan'::numeric::float8);
--Testcase 142:
SELECT f1 FROM FLOAT8_TMP;
--Testcase 34:
SELECT * FROM FLOAT8_TBL;
--Testcase 35:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <> '1004.3';
--Testcase 36:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 = '1004.3';
--Testcase 37:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' > f.f1;
--Testcase 38:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 < '1004.3';
--Testcase 39:
SELECT f.* FROM FLOAT8_TBL f WHERE '1004.3' >= f.f1;
--Testcase 40:
SELECT f.* FROM FLOAT8_TBL f WHERE f.f1 <= '1004.3';
--Testcase 41:
SELECT f.f1, f.f1 * '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 42:
SELECT f.f1, f.f1 + '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 43:
SELECT f.f1, f.f1 / '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 44:
SELECT f.f1, f.f1 - '-10' AS x
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
--Testcase 45:
SELECT f.f1 ^ '2.0' AS square_f1
FROM FLOAT8_TBL f where f.f1 = '1004.3';
-- absolute value
--Testcase 46:
SELECT f.f1, @f.f1 AS abs_f1
FROM FLOAT8_TBL f;
-- truncate
--Testcase 47:
SELECT f.f1, trunc(f.f1) AS trunc_f1
FROM FLOAT8_TBL f;
-- round
--Testcase 48:
SELECT f.f1, round(f.f1) AS round_f1
FROM FLOAT8_TBL f;
-- ceil / ceiling
--Testcase 49:
select ceil(f1) as ceil_f1 from float8_tbl f;
--Testcase 50:
select ceiling(f1) as ceiling_f1 from float8_tbl f;
-- floor
--Testcase 51:
select floor(f1) as floor_f1 from float8_tbl f;
-- sign
--Testcase 52:
select sign(f1) as sign_f1 from float8_tbl f;
-- avoid bit-exact output here because operations may not be bit-exact.
--Testcase 278:
SET extra_float_digits = 0;
-- square root
BEGIN;
--Testcase 53:
DELETE FROM FLOAT8_TBL;
--Testcase 54:
INSERT INTO FLOAT8_TBL VALUES ('64'::float8);
--Testcase 55:
SELECT sqrt(f1) as eight FROM FLOAT8_TBL;
--Testcase 56:
SELECT |/f1 as eight FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 57:
SELECT f.f1, |/f.f1 AS sqrt_f1
FROM FLOAT8_TBL f
WHERE f.f1 > '0.0';
-- power
--Testcase 58:
DELETE FROM FLOAT8_TMP;
--Testcase 143:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, '0.5'::float8);
--Testcase 144:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 60:
DELETE FROM FLOAT8_TMP;
--Testcase 145:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, '0.5'::float8);
--Testcase 146:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 61:
DELETE FROM FLOAT8_TMP;
--Testcase 147:
INSERT INTO FLOAT8_TMP VALUES ('144'::float8, 'NaN'::float8);
--Testcase 148:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 62:
DELETE FROM FLOAT8_TMP;
--Testcase 149:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8, 'NaN'::float8);
--Testcase 150:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 63:
DELETE FROM FLOAT8_TMP;
--Testcase 151:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'NaN'::float8);
--Testcase 152:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 64:
DELETE FROM FLOAT8_TMP;
--Testcase 153:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'NaN'::float8);
--Testcase 154:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 65:
DELETE FROM FLOAT8_TMP;
--Testcase 155:
INSERT INTO FLOAT8_TMP VALUES ('NaN'::float8 , '0'::float8);
--Testcase 156:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 279:
DELETE FROM FLOAT8_TMP;
--Testcase 280:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '0'::float8);
--Testcase 281:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 282:
DELETE FROM FLOAT8_TMP;
--Testcase 283:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '0'::float8);
--Testcase 284:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 285:
DELETE FROM FLOAT8_TMP;
--Testcase 286:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, 'infinity'::float8);
--Testcase 287:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 288:
DELETE FROM FLOAT8_TMP;
--Testcase 289:
INSERT INTO FLOAT8_TMP VALUES ('0'::float8, '-infinity'::float8);
--Testcase 290:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 291:
DELETE FROM FLOAT8_TMP;
--Testcase 292:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, 'infinity'::float8);
--Testcase 293:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 294:
DELETE FROM FLOAT8_TMP;
--Testcase 295:
INSERT INTO FLOAT8_TMP VALUES ('1'::float8, '-infinity'::float8);
--Testcase 296:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 297:
DELETE FROM FLOAT8_TMP;
--Testcase 298:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, 'infinity'::float8);
--Testcase 299:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 300:
DELETE FROM FLOAT8_TMP;
--Testcase 301:
INSERT INTO FLOAT8_TMP VALUES ('-1'::float8, '-infinity'::float8);
--Testcase 302:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 303:
DELETE FROM FLOAT8_TMP;
--Testcase 304:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, 'infinity'::float8);
--Testcase 305:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 306:
DELETE FROM FLOAT8_TMP;
--Testcase 307:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, 'infinity'::float8);
--Testcase 308:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 309:
DELETE FROM FLOAT8_TMP;
--Testcase 310:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, 'infinity'::float8);
--Testcase 311:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 312:
DELETE FROM FLOAT8_TMP;
--Testcase 313:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, 'infinity'::float8);
--Testcase 314:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 315:
DELETE FROM FLOAT8_TMP;
--Testcase 316:
INSERT INTO FLOAT8_TMP VALUES ('0.1'::float8, '-infinity'::float8);
--Testcase 317:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 318:
DELETE FROM FLOAT8_TMP;
--Testcase 319:
INSERT INTO FLOAT8_TMP VALUES ('-0.1'::float8, '-infinity'::float8);
--Testcase 320:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 321:
DELETE FROM FLOAT8_TMP;
--Testcase 322:
INSERT INTO FLOAT8_TMP VALUES ('1.1'::float8, '-infinity'::float8);
--Testcase 323:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 324:
DELETE FROM FLOAT8_TMP;
--Testcase 325:
INSERT INTO FLOAT8_TMP VALUES ('-1.1'::float8, '-infinity'::float8);
--Testcase 326:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 327:
DELETE FROM FLOAT8_TMP;
--Testcase 328:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-2'::float8);
--Testcase 329:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 330:
DELETE FROM FLOAT8_TMP;
--Testcase 331:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '2'::float8);
--Testcase 332:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 333:
DELETE FROM FLOAT8_TMP;
--Testcase 334:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, 'infinity'::float8);
--Testcase 335:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 336:
DELETE FROM FLOAT8_TMP;
--Testcase 337:
INSERT INTO FLOAT8_TMP VALUES ('infinity'::float8, '-infinity'::float8);
--Testcase 338:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- 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".
--Testcase 339:
DELETE FROM FLOAT8_TMP;
--Testcase 340:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-2'::float8);
--Testcase 341:
SELECT power(f1, f2) = '0' FROM FLOAT8_TMP;
--Testcase 342:
DELETE FROM FLOAT8_TMP;
--Testcase 343:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3'::float8);
--Testcase 344:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 345:
DELETE FROM FLOAT8_TMP;
--Testcase 346:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '2'::float8);
--Testcase 347:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 348:
DELETE FROM FLOAT8_TMP;
--Testcase 349:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '3'::float8);
--Testcase 350:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 351:
DELETE FROM FLOAT8_TMP;
--Testcase 352:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-3.5'::float8);
--Testcase 353:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 354:
DELETE FROM FLOAT8_TMP;
--Testcase 355:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, 'infinity'::float8);
--Testcase 356:
SELECT power(f1, f2) FROM FLOAT8_TMP;
--Testcase 357:
DELETE FROM FLOAT8_TMP;
--Testcase 358:
INSERT INTO FLOAT8_TMP VALUES ('-infinity'::float8, '-infinity'::float8);
--Testcase 359:
SELECT power(f1, f2) FROM FLOAT8_TMP;
-- take exp of ln(f.f1)
--Testcase 67:
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
--Testcase 360:
DELETE FROM FLOAT8_TMP;
--Testcase 361:
INSERT INTO FLOAT8_TMP VALUES ('inf'::float8), ('-inf'::float8), ('nan'::float8);
--Testcase 362:
SELECT exp(f1) FROM FLOAT8_TMP;
-- cube root
BEGIN;
--Testcase 68:
DELETE FROM FLOAT8_TBL;
--Testcase 69:
INSERT INTO FLOAT8_TBL VALUES ('27'::float8);
--Testcase 70:
SELECT ||/f1 as three FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 71:
SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f;
--Testcase 72:
SELECT * FROM FLOAT8_TBL;
--Testcase 73:
UPDATE FLOAT8_TBL
SET f1 = FLOAT8_TBL.f1 * '-1'
WHERE FLOAT8_TBL.f1 > '0.0';
--Testcase 74:
SELECT f.f1 * '1e200' from FLOAT8_TBL f;
--Testcase 75:
SELECT f.f1 ^ '1e200' from FLOAT8_TBL f;
BEGIN;
--Testcase 76:
DELETE FROM FLOAT8_TBL;
--Testcase 77:
INSERT INTO FLOAT8_TBL VALUES (0 ^ 0 + 0 ^ 1 + 0 ^ 0.0 + 0 ^ 0.5);
--Testcase 78:
SELECT * FROM FLOAT8_TBL;
ROLLBACK;
--Testcase 79:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 = '0.0' ;
--Testcase 80:
SELECT ln(f.f1) from FLOAT8_TBL f where f.f1 < '0.0' ;
--Testcase 81:
SELECT exp(f.f1) from FLOAT8_TBL f;
--Testcase 82:
SELECT f.f1 / '0.0' from FLOAT8_TBL f;
--Testcase 83:
SELECT * 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.
--Testcase 157:
DELETE FROM FLOAT8_TMP;
--Testcase 158:
INSERT INTO FLOAT8_TMP(f1) VALUES (1);
--Testcase 159:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 160:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 161:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 162:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 163:
DELETE FROM FLOAT8_TMP;
--Testcase 164:
INSERT INTO FLOAT8_TMP(f1) VALUES (2);
--Testcase 165:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 166:
DELETE FROM FLOAT8_TMP;
--Testcase 167:
INSERT INTO FLOAT8_TMP(f1) VALUES (0.5);
--Testcase 168:
SELECT atanh(f1) FROM FLOAT8_TMP;
-- test Inf/NaN cases for hyperbolic functions
--Testcase 169:
DELETE FROM FLOAT8_TMP;
--Testcase 170:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 171:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 172:
DELETE FROM FLOAT8_TMP;
--Testcase 173:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 174:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 175:
DELETE FROM FLOAT8_TMP;
--Testcase 176:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 177:
SELECT sinh(f1) FROM FLOAT8_TMP;
--Testcase 178:
DELETE FROM FLOAT8_TMP;
--Testcase 179:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 180:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 181:
DELETE FROM FLOAT8_TMP;
--Testcase 182:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 183:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 184:
DELETE FROM FLOAT8_TMP;
--Testcase 185:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 186:
SELECT cosh(f1) FROM FLOAT8_TMP;
--Testcase 187:
DELETE FROM FLOAT8_TMP;
--Testcase 188:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 189:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 190:
DELETE FROM FLOAT8_TMP;
--Testcase 191:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 192:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 193:
DELETE FROM FLOAT8_TMP;
--Testcase 194:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 195:
SELECT tanh(f1) FROM FLOAT8_TMP;
--Testcase 196:
DELETE FROM FLOAT8_TMP;
--Testcase 197:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'infinity');
--Testcase 198:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 199:
DELETE FROM FLOAT8_TMP;
--Testcase 200:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 '-infinity');
--Testcase 201:
SELECT asinh(f1) FROM FLOAT8_TMP;
--Testcase 202:
DELETE FROM FLOAT8_TMP;
--Testcase 203:
INSERT INTO FLOAT8_TMP(f1) VALUES (float8 'nan');
--Testcase 204:
SELECT asinh(f1) FROM FLOAT8_TMP;
-- acosh(Inf) should be Inf, but some mingw versions produce NaN, so skip test
-- SELECT acosh(float8 'infinity');
--Testcase 205:
DELETE FROM FLOAT8_TMP;
--Testcase 206:
INSERT INTO FLOAT8_TMP VALUES (float8 '-infinity');
--Testcase 207:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 208:
DELETE FROM FLOAT8_TMP;
--Testcase 209:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 210:
SELECT acosh(f1) FROM FLOAT8_TMP;
--Testcase 211:
DELETE FROM FLOAT8_TMP;
--Testcase 212:
INSERT INTO FLOAT8_TMP VALUES ((float8 'infinity'));
--Testcase 213:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 214:
DELETE FROM FLOAT8_TMP;
--Testcase 215:
INSERT INTO FLOAT8_TMP VALUES ((float8 '-infinity'));
--Testcase 216:
SELECT atanh(f1) FROM FLOAT8_TMP;
--Testcase 217:
DELETE FROM FLOAT8_TMP;
--Testcase 218:
INSERT INTO FLOAT8_TMP VALUES ((float8 'nan'));
--Testcase 219:
SELECT atanh(f1) FROM FLOAT8_TMP;
-- error functions
-- we run these with extra_float_digits = -1, to get consistently rounded
-- results on all platforms.
SET extra_float_digits = -1;
DELETE FROM FLOAT8_TBL;
INSERT INTO FLOAT8_TBL(f1) VALUES (float8 '-infinity'),
(-28), (-6), (-3.4), (-2.1), (-1.1), (-0.45),
(-1.2e-9), (-2.3e-13), (-1.2e-17), (0),
(1.2e-17), (2.3e-13), (1.2e-9),
(0.45), (1.1), (2.1), (3.4), (6), (28),
(float8 'infinity'), (float8 'nan');
SELECT f1,
erf(f1),
erfc(f1)
FROM FLOAT8_TBL;
--Testcase 369:
RESET extra_float_digits;
-- test for over- and underflow
--Testcase 84:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e400');
--Testcase 85:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e400');
--Testcase 86:
INSERT INTO FLOAT8_TBL(f1) VALUES ('10e-400');
--Testcase 87:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-10e-400');
-- maintain external table consistency across platforms
-- delete all values and reinsert well-behaved ones
--Testcase 88:
DELETE FROM FLOAT8_TBL;
--Testcase 89:
INSERT INTO FLOAT8_TBL(f1) VALUES ('0.0');
--Testcase 90:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-34.84');
--Testcase 91:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1004.30');
--Testcase 92:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e+200');
--Testcase 93:
INSERT INTO FLOAT8_TBL(f1) VALUES ('-1.2345678901234e-200');
--Testcase 94:
SELECT * FROM FLOAT8_TBL;
-- test edge-case coercions to integer
--Testcase 220:
DELETE FROM FLOAT8_TMP;
--Testcase 221:
INSERT INTO FLOAT8_TMP VALUES ('32767.4'::float8);
--Testcase 222:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 223:
DELETE FROM FLOAT8_TMP;
--Testcase 224:
INSERT INTO FLOAT8_TMP VALUES ('32767.6'::float8);
--Testcase 225:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 226:
DELETE FROM FLOAT8_TMP;
--Testcase 227:
INSERT INTO FLOAT8_TMP VALUES ('-32768.4'::float8);
--Testcase 228:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 229:
DELETE FROM FLOAT8_TMP;
--Testcase 230:
INSERT INTO FLOAT8_TMP VALUES ('-32768.6'::float8);
--Testcase 231:
SELECT f1::int2 FROM FLOAT8_TMP;
--Testcase 232:
DELETE FROM FLOAT8_TMP;
--Testcase 233:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.4'::float8);
--Testcase 234:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 235:
DELETE FROM FLOAT8_TMP;
--Testcase 236:
INSERT INTO FLOAT8_TMP VALUES ('2147483647.6'::float8);
--Testcase 237:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 238:
DELETE FROM FLOAT8_TMP;
--Testcase 239:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.4'::float8);
--Testcase 240:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 241:
DELETE FROM FLOAT8_TMP;
--Testcase 242:
INSERT INTO FLOAT8_TMP VALUES ('-2147483648.6'::float8);
--Testcase 243:
SELECT f1::int4 FROM FLOAT8_TMP;
--Testcase 244:
DELETE FROM FLOAT8_TMP;
--Testcase 245:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854773760'::float8);
--Testcase 246:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 247:
DELETE FROM FLOAT8_TMP;
--Testcase 248:
INSERT INTO FLOAT8_TMP VALUES ('9223372036854775807'::float8);
--Testcase 249:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 250:
DELETE FROM FLOAT8_TMP;
--Testcase 251:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854775808.5'::float8);
--Testcase 252:
SELECT f1::int8 FROM FLOAT8_TMP;
--Testcase 253:
DELETE FROM FLOAT8_TMP;
--Testcase 254:
INSERT INTO FLOAT8_TMP VALUES ('-9223372036854780000'::float8);
--Testcase 255:
SELECT f1::int8 FROM FLOAT8_TMP;
-- test exact cases for trigonometric functions in degrees
BEGIN;
--Testcase 95:
DELETE FROM FLOAT8_TBL;
--Testcase 96:
INSERT INTO FLOAT8_TBL VALUES (0), (30), (90), (150), (180),
(210), (270), (330), (360);
--Testcase 97:
SELECT f1,
sind(f1),
sind(f1) IN (-1,-0.5,0,0.5,1) AS sind_exact
FROM FLOAT8_TBL;
--Testcase 98:
DELETE FROM FLOAT8_TBL;
--Testcase 99:
INSERT INTO FLOAT8_TBL VALUES (0), (60), (90), (120), (180),
(240), (270), (300), (360);
--Testcase 100:
SELECT f1,
cosd(f1),
cosd(f1) IN (-1,-0.5,0,0.5,1) AS cosd_exact
FROM FLOAT8_TBL;
--Testcase 101:
DELETE FROM FLOAT8_TBL;
--Testcase 102:
INSERT INTO FLOAT8_TBL VALUES (0), (45), (90), (135), (180),
(225), (270), (315), (360);
--Testcase 103:
SELECT f1,
tand(f1),
tand(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS tand_exact,
cotd(f1),
cotd(f1) IN ('-Infinity'::float8,-1,0,
1,'Infinity'::float8) AS cotd_exact
FROM FLOAT8_TBL;
--Testcase 104:
DELETE FROM FLOAT8_TBL;
--Testcase 105:
INSERT INTO FLOAT8_TBL VALUES (-1), (-0.5), (0), (0.5), (1);
--Testcase 106:
SELECT f1,
asind(f1),
asind(f1) IN (-90,-30,0,30,90) AS asind_exact,
acosd(f1),
acosd(f1) IN (0,60,90,120,180) AS acosd_exact
FROM FLOAT8_TBL;
--Testcase 107:
DELETE FROM FLOAT8_TBL;
--Testcase 108:
INSERT INTO FLOAT8_TBL VALUES ('-Infinity'::float8), (-1), (0), (1),
('Infinity'::float8);
--Testcase 109:
SELECT f1,
atand(f1),
atand(f1) IN (-90,-45,0,45,90) AS atand_exact
FROM FLOAT8_TBL;
--Testcase 110:
DELETE FROM FLOAT8_TBL;
--Testcase 111:
INSERT INTO FLOAT8_TBL SELECT * FROM generate_series(0, 360, 90);
--Testcase 112:
SELECT x, y,
atan2d(y, x),
atan2d(y, x) IN (-90,0,90,180) AS atan2d_exact
FROM (SELECT 10*cosd(f1), 10*sind(f1)
FROM FLOAT8_TBL) AS t(x,y);
ROLLBACK;
--
-- 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).
--Testcase 256:
create type xfloat8;
--Testcase 257:
create function xfloat8in(cstring) returns xfloat8 immutable strict
language internal as 'int8in';
--Testcase 258:
create function xfloat8out(xfloat8) returns cstring immutable strict
language internal as 'int8out';
--Testcase 259:
create type xfloat8 (input = xfloat8in, output = xfloat8out, like = float8);
--Testcase 260:
create cast (xfloat8 as float8) without function;
--Testcase 261:
create cast (float8 as xfloat8) without function;
--Testcase 262:
create cast (xfloat8 as bigint) without function;
--Testcase 263:
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.
--Testcase 264:
create foreign table testdata(bits text, id int OPTIONS (key 'true')) server sqlite_svr;
begin;
--Testcase 265:
insert into testdata(bits) 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');
--Testcase 266:
select float8send(flt) as ibits,
flt
from (select bits::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- round-trip tests
begin;
--Testcase 267:
insert into testdata(bits) 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');
--Testcase 268:
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::bit(64)::bigint::xfloat8::float8 as flt
from testdata
offset 0) s;
rollback;
-- clean up, lest opr_sanity complain
--Testcase 269:
drop type xfloat8 cascade;
--Testcase 363:
DELETE FROM FLOAT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 280:
CREATE FOREIGN TABLE "type_FLOAT_INF"( "i" int OPTIONS (key 'true'), "f" float8) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF');
--Testcase 281:
CREATE FOREIGN TABLE "type_FLOAT_INF+"( "i" int OPTIONS (key 'true'), "f" float8, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_FLOAT_INF+');
--Testcase 282:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 283:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (10, 'Infinity');
--Testcase 284:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (11, '+Infinity');
--Testcase 285:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (12, '-Infinity');
--Testcase 286:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (13, 'Inf');
--Testcase 287:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (14, '+Inf');
--Testcase 288:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (15, '-Inf');
--Testcase 289: SQLite ignores NaN
--see https://github.com/sqlite/sqlite/blob/6db0b11e078f4b651f0cf00f845f3d77700c1a3a/src/vdbemem.c#L973
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (16, 'NaN');
--Testcase 290:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE text;
--Testcase 291:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (17, 'Infinity');
--Testcase 292:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (18, '+Infinity');
--Testcase 293:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (19, '-Infinity');
--Testcase 294:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (20, 'Inf');
--Testcase 295:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (21, '+Inf');
--Testcase 296:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (22, '-Inf');
--Testcase 297:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (23, 'NaN');
--Testcase 298:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (24, 'Infinity__');
--Testcase 299:
INSERT INTO "type_FLOAT_INF" (i, f) VALUES (25, 'Infi');
--Testcase 300:
ALTER FOREIGN TABLE "type_FLOAT_INF" ALTER COLUMN "f" TYPE float8;
--Testcase 301: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 302:
DELETE FROM "type_FLOAT_INF" WHERE i = 24;
--Testcase 303: error : improper data with text affinity
SELECT * FROM "type_FLOAT_INF+";
--Testcase 304:
DELETE FROM "type_FLOAT_INF" WHERE i = 25;
--Testcase 305:
SELECT * FROM "type_FLOAT_INF";
--Testcase 306:
SELECT * FROM "type_FLOAT_INF+";
--Testcase 307:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f ASC, i;
--Testcase 308:
SELECT * FROM "type_FLOAT_INF+" ORDER BY f DESC, i;
--Testcase 309:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 310:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 311:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 312:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 313:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 314:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 315:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 316:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 317:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 318:
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 319:
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 320:
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 321:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 322:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 323:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 324:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 325:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 326:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 327:
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 328:
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 329:
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 330:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Infinity' ORDER BY i;
--Testcase 331:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Infinity' ORDER BY i;
--Testcase 332:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Infinity' ORDER BY i;
--Testcase 333:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '+Inf' ORDER BY i;
--Testcase 334:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '+Inf' ORDER BY i;
--Testcase 335:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '+Inf' ORDER BY i;
--Testcase 336:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Infinity' ORDER BY i;
--Testcase 337:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Infinity' ORDER BY i;
--Testcase 338:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Infinity' ORDER BY i;
--Testcase 339:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > '-Inf' ORDER BY i;
--Testcase 340:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < '-Inf' ORDER BY i;
--Testcase 341:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = '-Inf' ORDER BY i;
--Testcase 342:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Infinity' ORDER BY i;
--Testcase 343:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Infinity' ORDER BY i;
--Testcase 344:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Infinity' ORDER BY i;
--Testcase 345:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'Inf' ORDER BY i;
--Testcase 346:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'Inf' ORDER BY i;
--Testcase 347:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'Inf' ORDER BY i;
--Testcase 348:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f > 'NaN' ORDER BY i;
--Testcase 349:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f < 'NaN' ORDER BY i;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_FLOAT_INF+" WHERE f = 'NaN' ORDER BY i;
--Testcase 351:
DELETE FROM "type_FLOAT_INF" WHERE i >= 10;
--Testcase 352:
DROP FOREIGN TABLE "type_FLOAT_INF";
--Testcase 353:
DROP FOREIGN TABLE "type_FLOAT_INF+";
--Testcase 270:
DROP SERVER sqlite_svr;
--Testcase 271:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/int4.sql
================================================
--
-- INT4 Based on PostgreSQL tests, please don't add additional tests here, use other test files
--
--Testcase 61:
CREATE EXTENSION sqlite_fdw;
--Testcase 62:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 63:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 64:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT4_TBL(f1) VALUES (' 0 ');
--Testcase 2:
INSERT INTO INT4_TBL(f1) VALUES ('123456 ');
--Testcase 3:
INSERT INTO INT4_TBL(f1) VALUES (' -123456');
--Testcase 4:
INSERT INTO INT4_TBL(f1) VALUES ('34.5');
-- largest and smallest values
--Testcase 5:
INSERT INTO INT4_TBL(f1) VALUES ('2147483647');
--Testcase 6:
INSERT INTO INT4_TBL(f1) VALUES ('-2147483647');
-- bad input values -- should give errors
--Testcase 7:
INSERT INTO INT4_TBL(f1) VALUES ('1000000000000');
--Testcase 8:
INSERT INTO INT4_TBL(f1) VALUES ('asdf');
--Testcase 9:
INSERT INTO INT4_TBL(f1) VALUES (' ');
--Testcase 10:
INSERT INTO INT4_TBL(f1) VALUES (' asdf ');
--Testcase 11:
INSERT INTO INT4_TBL(f1) VALUES ('- 1234');
--Testcase 12:
INSERT INTO INT4_TBL(f1) VALUES ('123 5');
--Testcase 13:
INSERT INTO INT4_TBL(f1) VALUES ('');
--Testcase 14:
SELECT * FROM INT4_TBL;
-- Also try it with non-error-throwing API
--Testcase 137:
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_INT4(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 138:
INSERT INTO NON_ERROR_THROWING_API_INT4 VALUES ('34', 1), ('asdf', 2), ('1000000000000', 3);
--Testcase 139:
SELECT pg_input_is_valid(f1, 'int4') FROM NON_ERROR_THROWING_API_INT4 WHERE id = 1;
--Testcase 140:
SELECT pg_input_is_valid(f1, 'int4') FROM NON_ERROR_THROWING_API_INT4 WHERE id = 2;
--Testcase 141:
SELECT pg_input_is_valid(f1, 'int4') FROM NON_ERROR_THROWING_API_INT4 WHERE id = 3;
--Testcase 142:
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4 WHERE id = 3), 'int4');
--Testcase 15:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int2 '0';
--Testcase 16:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <> int4 '0';
--Testcase 17:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int2 '0';
--Testcase 18:
SELECT i.* FROM INT4_TBL i WHERE i.f1 = int4 '0';
--Testcase 19:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int2 '0';
--Testcase 20:
SELECT i.* FROM INT4_TBL i WHERE i.f1 < int4 '0';
--Testcase 21:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int2 '0';
--Testcase 22:
SELECT i.* FROM INT4_TBL i WHERE i.f1 <= int4 '0';
--Testcase 23:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int2 '0';
--Testcase 24:
SELECT i.* FROM INT4_TBL i WHERE i.f1 > int4 '0';
--Testcase 25:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int2 '0';
--Testcase 26:
SELECT i.* FROM INT4_TBL i WHERE i.f1 >= int4 '0';
-- positive odds
--Testcase 27:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int2 '2') = int2 '1';
-- any evens
--Testcase 28:
SELECT i.* FROM INT4_TBL i WHERE (i.f1 % int4 '2') = int2 '0';
--Testcase 29:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i;
--Testcase 30:
SELECT i.f1, i.f1 * int2 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 31:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i;
--Testcase 32:
SELECT i.f1, i.f1 * int4 '2' AS x FROM INT4_TBL i
WHERE abs(f1) < 1073741824;
--Testcase 33:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i;
--Testcase 34:
SELECT i.f1, i.f1 + int2 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 35:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i;
--Testcase 36:
SELECT i.f1, i.f1 + int4 '2' AS x FROM INT4_TBL i
WHERE f1 < 2147483646;
--Testcase 37:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i;
--Testcase 38:
SELECT i.f1, i.f1 - int2 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 39:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i;
--Testcase 40:
SELECT i.f1, i.f1 - int4 '2' AS x FROM INT4_TBL i
WHERE f1 > -2147483647;
--Testcase 41:
SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i;
--Testcase 42:
SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i;
--
-- more complex expressions
--
-- variations on unary minus parsing
--Testcase 65:
DELETE FROM INT4_TMP;
--Testcase 66:
INSERT INTO INT4_TMP VALUES (-2, 3);
--Testcase 67:
SELECT f1 + f2 as one FROM INT4_TMP;
--Testcase 68:
DELETE FROM INT4_TMP;
--Testcase 69:
INSERT INTO INT4_TMP VALUES (4, 2);
--Testcase 70:
SELECT f1 - f2 as two FROM INT4_TMP;
--Testcase 46:
DELETE FROM INT4_TMP;
--Testcase 71:
INSERT INTO INT4_TMP VALUES (2, 1);
--Testcase 72:
SELECT f1- -f2 as three FROM INT4_TMP;
--Testcase 47:
DELETE FROM INT4_TMP;
--Testcase 73:
INSERT INTO INT4_TMP VALUES (2, 2);
--Testcase 74:
SELECT f1 - -f2 as four FROM INT4_TMP;
--Testcase 75:
DELETE FROM INT4_TMP;
--Testcase 76:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int2, '16'::int2 / '4'::int2);
--Testcase 77:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 78:
DELETE FROM INT4_TMP;
--Testcase 79:
INSERT INTO INT4_TMP VALUES ('2'::int2 * '2'::int4, '16'::int2 / '4'::int4);
--Testcase 80:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 81:
DELETE FROM INT4_TMP;
--Testcase 82:
INSERT INTO INT4_TMP VALUES ('2'::int4 * '2'::int2, '16'::int4 / '4'::int2);
--Testcase 83:
SELECT f1 = f2 AS true FROM INT4_TMP;
--Testcase 84:
DELETE FROM INT4_TMP;
--Testcase 85:
INSERT INTO INT4_TMP VALUES ('1000'::int4, '999'::int4);
--Testcase 86:
SELECT f1 < f2 AS false FROM INT4_TMP;
--Testcase 50:
DELETE FROM INT4_TMP;
--Testcase 91:
INSERT INTO INT4_TMP VALUES (1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1);
--Testcase 92:
SELECT f1 as ten FROM INT4_TMP;
--Testcase 51:
DELETE FROM INT4_TMP;
--Testcase 93:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 94:
SELECT f1 + f1/f2 as three FROM INT4_TMP;
--Testcase 52:
DELETE FROM INT4_TMP;
--Testcase 95:
INSERT INTO INT4_TMP VALUES (2 , 2);
--Testcase 96:
SELECT (f1 + f2)/f2 as two FROM INT4_TMP;
-- corner case
--Testcase 54:
DELETE FROM INT4_TMP;
--Testcase 97:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 98:
SELECT (f1<<31)::text FROM INT4_TMP;
--Testcase 56:
DELETE FROM INT4_TMP;
--Testcase 99:
INSERT INTO INT4_TMP VALUES (-1);
--Testcase 100:
SELECT ((f1<<31)+1)::text FROM INT4_TMP;
-- check sane handling of INT_MIN overflow cases
--Testcase 58:
DELETE FROM INT4_TMP;
--Testcase 101:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int4);
--Testcase 102:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 103:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 104:
SELECT f1 % f2 FROM INT4_TMP;
--Testcase 60:
DELETE FROM INT4_TMP;
--Testcase 105:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-1)::int2);
--Testcase 106:
SELECT f1 * f2 FROM INT4_TMP;
--Testcase 107:
SELECT f1 / f2 FROM INT4_TMP;
--Testcase 108:
SELECT f1 % f2 FROM INT4_TMP;
-- check rounding when casting from float
--Testcase 109:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 110:
DELETE FROM FLOAT8_TMP;
--Testcase 111:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 112:
SELECT f1 as x, f1::int4 as int4_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 113:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 114:
DELETE FROM NUMERIC_TMP;
--Testcase 115:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 116:
SELECT f1 as x, f1::int4 as int4_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 117:
DELETE FROM INT4_TMP;
--Testcase 118:
INSERT INTO INT4_TMP 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);
--Testcase 119:
SELECT f1, f2, gcd(f1, f2), gcd(f1, -f2), gcd(f2, f1), gcd(-f2, f1) FROM INT4_TMP;
--Testcase 120:
DELETE FROM INT4_TMP;
--Testcase 121:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 0::int4);
--Testcase 122:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 123:
DELETE FROM INT4_TMP;
--Testcase 124:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, (-2147483648)::int4);
--Testcase 125:
SELECT gcd(f1, f2) FROM INT4_TMP; -- overflow
-- test lcm()
--Testcase 126:
DELETE FROM INT4_TMP;
--Testcase 127:
INSERT INTO INT4_TMP 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);
--Testcase 128:
SELECT f1, f2, lcm(f1, f2), lcm(f1, -f2), lcm(f2, f1), lcm(-f2, f1) FROM INT4_TMP;
--Testcase 129:
DELETE FROM INT4_TMP;
--Testcase 130:
INSERT INTO INT4_TMP VALUES ((-2147483648)::int4, 1::int4);
--Testcase 131:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
--Testcase 132:
DELETE FROM INT4_TMP;
--Testcase 133:
INSERT INTO INT4_TMP VALUES (2147483647::int4, 2147483646::int4);
--Testcase 134:
SELECT lcm(f1, f2) FROM INT4_TMP; -- overflow
-- non-decimal literals
--Testcase 143:
CREATE FOREIGN TABLE special_case_int4 (f1 text, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 144:
INSERT INTO special_case_int4 VALUES ('0b100101'::int4);
--Testcase 145:
SELECT f1 FROM special_case_int4;
--Testcase 146:
DELETE FROM special_case_int4;
--Testcase 147:
INSERT INTO special_case_int4 VALUES ('0o273'::int4);
--Testcase 148:
SELECT f1 FROM special_case_int4;
--Testcase 149:
DELETE FROM special_case_int4;
--Testcase 150:
INSERT INTO special_case_int4 VALUES ('0x42F'::int4);
--Testcase 151:
SELECT f1 FROM special_case_int4;
--Testcase 152:
DELETE FROM special_case_int4;
--Testcase 153:
INSERT INTO special_case_int4 VALUES ('0b'::int4);
--Testcase 154:
SELECT f1 FROM special_case_int4;
--Testcase 155:
DELETE FROM special_case_int4;
--Testcase 156:
INSERT INTO special_case_int4 VALUES ('0x'::int4);
--Testcase 157:
SELECT f1 FROM special_case_int4;
--Testcase 158:
DELETE FROM special_case_int4;
--Testcase 159:
INSERT INTO special_case_int4 VALUES ('0x'::int4);
--Testcase 160:
SELECT f1 FROM special_case_int4;
-- cases near overflow
--Testcase 161:
DELETE FROM special_case_int4;
--Testcase 162:
INSERT INTO special_case_int4 VALUES ('0b1111111111111111111111111111111'::int4);
--Testcase 163:
SELECT f1 FROM special_case_int4;
--Testcase 164:
DELETE FROM special_case_int4;
--Testcase 165:
INSERT INTO special_case_int4 VALUES ('0b10000000000000000000000000000000'::int4);
--Testcase 166:
SELECT f1 FROM special_case_int4;
--Testcase 167:
DELETE FROM special_case_int4;
--Testcase 168:
INSERT INTO special_case_int4 VALUES ('0o17777777777'::int4);
--Testcase 169:
SELECT f1 FROM special_case_int4;
--Testcase 170:
DELETE FROM special_case_int4;
--Testcase 171:
INSERT INTO special_case_int4 VALUES ('0o20000000000'::int4);
--Testcase 172:
SELECT f1 FROM special_case_int4;
--Testcase 173:
DELETE FROM special_case_int4;
--Testcase 174:
INSERT INTO special_case_int4 VALUES ('0x7FFFFFFF'::int4);
--Testcase 175:
SELECT f1 FROM special_case_int4;
--Testcase 176:
DELETE FROM special_case_int4;
--Testcase 177:
INSERT INTO special_case_int4 VALUES ('0x80000000'::int4);
--Testcase 178:
SELECT f1 FROM special_case_int4;
--Testcase 179:
DELETE FROM special_case_int4;
--Testcase 180:
INSERT INTO special_case_int4 VALUES ('-0b10000000000000000000000000000000'::int4);
--Testcase 181:
SELECT f1 FROM special_case_int4;
--Testcase 182:
DELETE FROM special_case_int4;
--Testcase 183:
INSERT INTO special_case_int4 VALUES ('-0b10000000000000000000000000000001'::int4);
--Testcase 184:
SELECT f1 FROM special_case_int4;
--Testcase 185:
DELETE FROM special_case_int4;
--Testcase 186:
INSERT INTO special_case_int4 VALUES ('-0o20000000000'::int4);
--Testcase 187:
SELECT f1 FROM special_case_int4;
--Testcase 188:
DELETE FROM special_case_int4;
--Testcase 189:
INSERT INTO special_case_int4 VALUES ('-0o20000000001'::int4);
--Testcase 190:
SELECT f1 FROM special_case_int4;
--Testcase 191:
DELETE FROM special_case_int4;
--Testcase 192:
INSERT INTO special_case_int4 VALUES ('-0x80000000'::int4);
--Testcase 193:
SELECT f1 FROM special_case_int4;
--Testcase 194:
DELETE FROM special_case_int4;
--Testcase 195:
INSERT INTO special_case_int4 VALUES ('-0x80000001'::int4);
--Testcase 196:
SELECT f1 FROM special_case_int4;
-- underscores
--Testcase 197:
DELETE FROM special_case_int4;
--Testcase 198:
INSERT INTO special_case_int4 VALUES ('1_000_000'::int4);
--Testcase 199:
SELECT f1 FROM special_case_int4;
--Testcase 200:
DELETE FROM special_case_int4;
--Testcase 201:
INSERT INTO special_case_int4 VALUES ('1_2_3'::int4);
--Testcase 202:
SELECT f1 FROM special_case_int4;
--Testcase 203:
DELETE FROM special_case_int4;
--Testcase 204:
INSERT INTO special_case_int4 VALUES ('0x1EEE_FFFF'::int4);
--Testcase 205:
SELECT f1 FROM special_case_int4;
--Testcase 206:
DELETE FROM special_case_int4;
--Testcase 207:
INSERT INTO special_case_int4 VALUES ('0o2_73'::int4);
--Testcase 208:
SELECT f1 FROM special_case_int4;
--Testcase 209:
DELETE FROM special_case_int4;
--Testcase 210:
INSERT INTO special_case_int4 VALUES ('0b_10_0101'::int4);
--Testcase 211:
SELECT f1 FROM special_case_int4;
-- error cases
--Testcase 212:
DELETE FROM special_case_int4;
--Testcase 213:
INSERT INTO special_case_int4 VALUES ('_100'::int4);
--Testcase 214:
SELECT f1 FROM special_case_int4;
--Testcase 215:
DELETE FROM special_case_int4;
--Testcase 216:
INSERT INTO special_case_int4 VALUES ('100_'::int4);
--Testcase 217:
SELECT f1 FROM special_case_int4;
--Testcase 218:
DELETE FROM special_case_int4;
--Testcase 219:
INSERT INTO special_case_int4 VALUES ('100__000'::int4);
--Testcase 220:
SELECT f1 FROM special_case_int4;
--Testcase 221:
DELETE FROM INT4_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 135:
DROP SERVER sqlite_svr;
--Testcase 136:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/int8.sql
================================================
--
-- INT8
-- Test int8 64-bit integers.
--
--Testcase 140:
CREATE EXTENSION sqlite_fdw;
--Testcase 141:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 142:
CREATE FOREIGN TABLE INT8_TBL(
q1 int8 OPTIONS (key 'true'),
q2 int8 OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 143:
CREATE FOREIGN TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id int options (key 'true')
) SERVER sqlite_svr;
--Testcase 1:
INSERT INTO INT8_TBL VALUES(' 123 ',' 456');
--Testcase 2:
INSERT INTO INT8_TBL VALUES('123 ','4567890123456789');
--Testcase 3:
INSERT INTO INT8_TBL VALUES('4567890123456789','123');
--Testcase 4:
INSERT INTO INT8_TBL VALUES(+4567890123456789,'4567890123456789');
--Testcase 5:
INSERT INTO INT8_TBL VALUES('+4567890123456789','-4567890123456789');
-- bad inputs
--Testcase 6:
INSERT INTO INT8_TBL(q1) VALUES (' ');
--Testcase 7:
INSERT INTO INT8_TBL(q1) VALUES ('xxx');
--Testcase 8:
INSERT INTO INT8_TBL(q1) VALUES ('3908203590239580293850293850329485');
--Testcase 9:
INSERT INTO INT8_TBL(q1) VALUES ('-1204982019841029840928340329840934');
--Testcase 10:
INSERT INTO INT8_TBL(q1) VALUES ('- 123');
--Testcase 11:
INSERT INTO INT8_TBL(q1) VALUES (' 345 5');
--Testcase 12:
INSERT INTO INT8_TBL(q1) VALUES ('');
--Testcase 13:
SELECT * FROM INT8_TBL;
-- Also try it with non-error-throwing API
--Testcase 251:
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_INT8(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 252:
INSERT INTO NON_ERROR_THROWING_API_INT8 VALUES ('34', 1), ('asdf', 2), ('10000000000000000000', 3);
--Testcase 253:
SELECT pg_input_is_valid(f1, 'int8') FROM NON_ERROR_THROWING_API_INT8 WHERE id = 1;
--Testcase 254:
SELECT pg_input_is_valid(f1, 'int8') FROM NON_ERROR_THROWING_API_INT8 WHERE id = 2;
--Testcase 255:
SELECT pg_input_is_valid(f1, 'int8') FROM NON_ERROR_THROWING_API_INT8 WHERE id = 3;
--Testcase 256:
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT8 WHERE id = 3), 'int8');
-- int8/int8 cmp
--Testcase 14:
SELECT * FROM INT8_TBL WHERE q2 = 4567890123456789;
--Testcase 15:
SELECT * FROM INT8_TBL WHERE q2 <> 4567890123456789;
--Testcase 16:
SELECT * FROM INT8_TBL WHERE q2 < 4567890123456789;
--Testcase 17:
SELECT * FROM INT8_TBL WHERE q2 > 4567890123456789;
--Testcase 18:
SELECT * FROM INT8_TBL WHERE q2 <= 4567890123456789;
--Testcase 19:
SELECT * FROM INT8_TBL WHERE q2 >= 4567890123456789;
-- int8/int4 cmp
--Testcase 20:
SELECT * FROM INT8_TBL WHERE q2 = 456;
--Testcase 21:
SELECT * FROM INT8_TBL WHERE q2 <> 456;
--Testcase 22:
SELECT * FROM INT8_TBL WHERE q2 < 456;
--Testcase 23:
SELECT * FROM INT8_TBL WHERE q2 > 456;
--Testcase 24:
SELECT * FROM INT8_TBL WHERE q2 <= 456;
--Testcase 25:
SELECT * FROM INT8_TBL WHERE q2 >= 456;
-- int4/int8 cmp
--Testcase 26:
SELECT * FROM INT8_TBL WHERE 123 = q1;
--Testcase 27:
SELECT * FROM INT8_TBL WHERE 123 <> q1;
--Testcase 28:
SELECT * FROM INT8_TBL WHERE 123 < q1;
--Testcase 29:
SELECT * FROM INT8_TBL WHERE 123 > q1;
--Testcase 30:
SELECT * FROM INT8_TBL WHERE 123 <= q1;
--Testcase 31:
SELECT * FROM INT8_TBL WHERE 123 >= q1;
-- int8/int2 cmp
--Testcase 32:
SELECT * FROM INT8_TBL WHERE q2 = '456'::int2;
--Testcase 33:
SELECT * FROM INT8_TBL WHERE q2 <> '456'::int2;
--Testcase 34:
SELECT * FROM INT8_TBL WHERE q2 < '456'::int2;
--Testcase 35:
SELECT * FROM INT8_TBL WHERE q2 > '456'::int2;
--Testcase 36:
SELECT * FROM INT8_TBL WHERE q2 <= '456'::int2;
--Testcase 37:
SELECT * FROM INT8_TBL WHERE q2 >= '456'::int2;
-- int2/int8 cmp
--Testcase 38:
SELECT * FROM INT8_TBL WHERE '123'::int2 = q1;
--Testcase 39:
SELECT * FROM INT8_TBL WHERE '123'::int2 <> q1;
--Testcase 40:
SELECT * FROM INT8_TBL WHERE '123'::int2 < q1;
--Testcase 41:
SELECT * FROM INT8_TBL WHERE '123'::int2 > q1;
--Testcase 42:
SELECT * FROM INT8_TBL WHERE '123'::int2 <= q1;
--Testcase 43:
SELECT * FROM INT8_TBL WHERE '123'::int2 >= q1;
--Testcase 44:
SELECT q1 AS plus, -q1 AS minus FROM INT8_TBL;
--Testcase 45:
SELECT q1, q2, q1 + q2 AS plus FROM INT8_TBL;
--Testcase 46:
SELECT q1, q2, q1 - q2 AS minus FROM INT8_TBL;
--Testcase 47:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL;
--Testcase 48:
SELECT q1, q2, q1 * q2 AS multiply FROM INT8_TBL
WHERE q1 < 1000 or (q2 > 0 and q2 < 1000);
--Testcase 49:
SELECT q1, q2, q1 / q2 AS divide, q1 % q2 AS mod FROM INT8_TBL;
--Testcase 50:
SELECT q1, float8(q1) FROM INT8_TBL;
--Testcase 51:
SELECT q2, float8(q2) FROM INT8_TBL;
--Testcase 52:
SELECT 37 + q1 AS plus4 FROM INT8_TBL;
--Testcase 53:
SELECT 37 - q1 AS minus4 FROM INT8_TBL;
--Testcase 54:
SELECT 2 * q1 AS "twice int4" FROM INT8_TBL;
--Testcase 55:
SELECT q1 * 2 AS "twice int4" FROM INT8_TBL;
-- int8 op int4
--Testcase 56:
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
--Testcase 57:
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
--Testcase 58:
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
--Testcase 59:
SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL;
--Testcase 60:
SELECT q2, abs(q2) FROM INT8_TBL;
--Testcase 61:
SELECT min(q1), min(q2) FROM INT8_TBL;
--Testcase 62:
SELECT max(q1), max(q2) FROM INT8_TBL;
-- TO_CHAR()
--
--Testcase 63:
SELECT to_char(q1, '9G999G999G999G999G999'), to_char(q2, '9,999,999,999,999,999')
FROM INT8_TBL;
--Testcase 64:
SELECT to_char(q1, '9G999G999G999G999G999D999G999'), to_char(q2, '9,999,999,999,999,999.999,999')
FROM INT8_TBL;
--Testcase 65:
SELECT to_char( (q1 * -1), '9999999999999999PR'), to_char( (q2 * -1), '9999999999999999.999PR')
FROM INT8_TBL;
--Testcase 66:
SELECT to_char( (q1 * -1), '9999999999999999S'), to_char( (q2 * -1), 'S9999999999999999')
FROM INT8_TBL;
--Testcase 67:
SELECT to_char(q2, 'MI9999999999999999') FROM INT8_TBL;
--Testcase 68:
SELECT to_char(q2, 'FMS9999999999999999') FROM INT8_TBL;
--Testcase 69:
SELECT to_char(q2, 'FM9999999999999999THPR') FROM INT8_TBL;
--Testcase 70:
SELECT to_char(q2, 'SG9999999999999999th') FROM INT8_TBL;
--Testcase 71:
SELECT to_char(q2, '0999999999999999') FROM INT8_TBL;
--Testcase 72:
SELECT to_char(q2, 'S0999999999999999') FROM INT8_TBL;
--Testcase 73:
SELECT to_char(q2, 'FM0999999999999999') FROM INT8_TBL;
--Testcase 74:
SELECT to_char(q2, 'FM9999999999999999.000') FROM INT8_TBL;
--Testcase 75:
SELECT to_char(q2, 'L9999999999999999.000') FROM INT8_TBL;
--Testcase 76:
SELECT to_char(q2, 'FM9999999999999999.999') FROM INT8_TBL;
--Testcase 77:
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;
--Testcase 78:
SELECT to_char(q2, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM INT8_TBL;
--Testcase 79:
SELECT to_char(q2, '999999SG9999999999') FROM INT8_TBL;
-- check min/max values and overflow behavior
--Testcase 80:
DELETE FROM INT8_TMP;
--Testcase 144:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 145:
SELECT q1 FROM INT8_TMP;
--Testcase 81:
DELETE FROM INT8_TMP;
--Testcase 146:
INSERT INTO INT8_TMP VALUES ('-9223372036854775809'::int8);
--Testcase 147:
SELECT q1 FROM INT8_TMP;
--Testcase 82:
DELETE FROM INT8_TMP;
--Testcase 148:
INSERT INTO INT8_TMP VALUES ('9223372036854775807'::int8);
--Testcase 149:
SELECT q1 FROM INT8_TMP;
--Testcase 83:
DELETE FROM INT8_TMP;
--Testcase 150:
INSERT INTO INT8_TMP VALUES ('9223372036854775808'::int8);
--Testcase 151:
SELECT q1 FROM INT8_TMP;
--Testcase 84:
DELETE FROM INT8_TMP;
--Testcase 152:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775807'::int8));
--Testcase 153:
SELECT q1 FROM INT8_TMP;
--Testcase 86:
DELETE FROM INT8_TMP;
--Testcase 154:
INSERT INTO INT8_TMP VALUES (-('-9223372036854775808'::int8));
--Testcase 155:
SELECT q1 FROM INT8_TMP;
--Testcase 257:
DELETE FROM INT8_TMP;
--Testcase 258:
INSERT INTO INT8_TMP VALUES (0::int8 , '-9223372036854775808'::int8);
--Testcase 259:
SELECT q1 - q2 FROM INT8_TMP;
--Testcase 87:
DELETE FROM INT8_TMP;
--Testcase 156:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 157:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 88:
DELETE FROM INT8_TMP;
--Testcase 158:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 159:
SELECT q1 + q2 FROM INT8_TMP;
--Testcase 89:
DELETE FROM INT8_TMP;
--Testcase 160:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '-9223372036854775800'::int8);
--Testcase 161:
SELECT q1-q2 FROM INT8_TMP;
--Testcase 90:
DELETE FROM INT8_TMP;
--Testcase 162:
INSERT INTO INT8_TMP VALUES ('-9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 163:
SELECT q1 - q2 FROM INT8_TMP;
--Testcase 91:
DELETE FROM INT8_TMP;
--Testcase 164:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '9223372036854775800'::int8);
--Testcase 165:
SELECT q1 * q2 FROM INT8_TMP;
--Testcase 92:
DELETE FROM INT8_TMP;
--Testcase 166:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 167:
SELECT q1 / q2 FROM INT8_TMP;
--Testcase 93:
DELETE FROM INT8_TMP;
--Testcase 168:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '0'::int8);
--Testcase 169:
SELECT q1 % q2 FROM INT8_TMP;
--Testcase 94:
DELETE FROM INT8_TMP;
--Testcase 170:
INSERT INTO INT8_TMP VALUES ('-9223372036854775808'::int8);
--Testcase 171:
SELECT abs(q1) FROM INT8_TMP;
--Testcase 95:
DELETE FROM INT8_TMP;
--Testcase 172:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 173:
SELECT q1 + q3 FROM INT8_TMP;
--Testcase 96:
DELETE FROM INT8_TMP;
--Testcase 174:
INSERT INTO INT8_TMP(q1, q3) VALUES ('-9223372036854775800'::int8 , '100'::int4);
--Testcase 175:
SELECT q1 - q3 FROM INT8_TMP;
--Testcase 97:
DELETE FROM INT8_TMP;
--Testcase 176:
INSERT INTO INT8_TMP(q1, q3) VALUES ('9223372036854775800'::int8 , '100'::int4);
--Testcase 177:
SELECT q1 * q3 FROM INT8_TMP;
--Testcase 98:
DELETE FROM INT8_TMP;
--Testcase 178:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 179:
SELECT q3 + q1 FROM INT8_TMP;
--Testcase 99:
DELETE FROM INT8_TMP;
--Testcase 180:
INSERT INTO INT8_TMP(q3, q1) VALUES ('-100'::int4 , '9223372036854775800'::int8);
--Testcase 181:
SELECT q3 - q1 FROM INT8_TMP;
--Testcase 100:
DELETE FROM INT8_TMP;
--Testcase 182:
INSERT INTO INT8_TMP(q3, q1) VALUES ('100'::int4 , '9223372036854775800'::int8);
--Testcase 183:
SELECT q3 * q1 FROM INT8_TMP;
--Testcase 101:
DELETE FROM INT8_TMP;
--Testcase 184:
INSERT INTO INT8_TMP(q1, q4) VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 185:
SELECT q1 + q4 FROM INT8_TMP;
--Testcase 102:
DELETE FROM INT8_TMP;
--Testcase 186:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775800'::int8 , '100'::int2);
--Testcase 187:
SELECT q1 - q4 FROM INT8_TMP;
--Testcase 103:
DELETE FROM INT8_TMP;
--Testcase 188:
INSERT INTO INT8_TMP VALUES ('9223372036854775800'::int8 , '100'::int2);
--Testcase 189:
SELECT q1 * q4 FROM INT8_TMP;
--Testcase 104:
DELETE FROM INT8_TMP;
--Testcase 190:
INSERT INTO INT8_TMP(q1, q4) VALUES ('-9223372036854775808'::int8 , '0'::int2);
--Testcase 191:
SELECT q1 / q4 FROM INT8_TMP;
--Testcase 105:
DELETE FROM INT8_TMP;
--Testcase 192:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 193:
SELECT q4 + q1 FROM INT8_TMP;
--Testcase 106:
DELETE FROM INT8_TMP;
--Testcase 194:
INSERT INTO INT8_TMP(q4, q1) VALUES ('-100'::int2 , '9223372036854775800'::int8);
--Testcase 195:
SELECT q4 - q1 FROM INT8_TMP;
--Testcase 107:
DELETE FROM INT8_TMP;
--Testcase 196:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '9223372036854775800'::int8);
--Testcase 197:
SELECT q4 * q1 FROM INT8_TMP;
--Testcase 108:
DELETE FROM INT8_TMP;
--Testcase 198:
INSERT INTO INT8_TMP(q4, q1) VALUES ('100'::int2 , '0'::int8);
--Testcase 199:
SELECT q4 / q1 FROM INT8_TMP;
--Testcase 110:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 = 456;
--Testcase 111:
SELECT CAST(q1 AS int4) FROM int8_tbl WHERE q2 <> 456;
--Testcase 112:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 = 456;
--Testcase 113:
SELECT CAST(q1 AS int2) FROM int8_tbl WHERE q2 <> 456;
--Testcase 200:
DELETE FROM INT8_TMP;
--Testcase 201:
INSERT INTO INT8_TMP(q5) VALUES ('42'), ('-37');
--Testcase 202:
SELECT CAST(q5::int2 as int8) FROM INT8_TMP;
--Testcase 114:
SELECT CAST(q1 AS float4), CAST(q2 AS float8) FROM INT8_TBL;
--Testcase 203:
DELETE FROM INT8_TMP;
--Testcase 204:
INSERT INTO INT8_TMP(q5) VALUES ('36854775807.0');
--Testcase 205:
SELECT CAST(q5::float4 AS int8) FROM INT8_TMP;
--Testcase 206:
DELETE FROM INT8_TMP;
--Testcase 207:
INSERT INTO INT8_TMP(q5) VALUES ('922337203685477580700.0');
--Testcase 208:
SELECT CAST(q5::float8 AS int8) FROM INT8_TMP;
--Testcase 115:
SELECT CAST(q1 AS oid) FROM INT8_TBL;
--Testcase 209:
SELECT oid::int8 FROM pg_class WHERE relname = 'pg_class';
-- bit operations
--Testcase 116:
SELECT q1, q2, q1 & q2 AS "and", q1 | q2 AS "or", q1 # q2 AS "xor", ~q1 AS "not" FROM INT8_TBL;
--Testcase 117:
SELECT q1, q1 << 2 AS "shl", q1 >> 3 AS "shr" FROM INT8_TBL;
-- generate_series
--Testcase 118:
DELETE FROM INT8_TMP;
--Testcase 210:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8) q1;
--Testcase 211:
SELECT q1 FROM INT8_TMP;
--Testcase 120:
DELETE FROM INT8_TMP;
--Testcase 212:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 0) q1; -- should error
--Testcase 213:
SELECT q1 FROM INT8_TMP;
--Testcase 122:
DELETE FROM INT8_TMP;
--Testcase 214:
INSERT INTO INT8_TMP SELECT q1 FROM generate_series('+4567890123456789'::int8, '+4567890123456799'::int8, 2) q1;
--Testcase 215:
SELECT q1 FROM INT8_TMP;
-- corner case
--Testcase 216:
DELETE FROM INT8_TMP;
--Testcase 217:
INSERT INTO INT8_TMP VALUES (-1::int8<<63);
--Testcase 218:
SELECT q1::text FROM INT8_TMP;
--Testcase 219:
DELETE FROM INT8_TMP;
--Testcase 220:
INSERT INTO INT8_TMP VALUES ((-1::int8<<63)+1);
--Testcase 221:
SELECT q1::text FROM INT8_TMP;
-- check sane handling of INT64_MIN overflow cases
--Testcase 125:
DELETE FROM INT8_TMP;
--Testcase 222:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int8, 888);
--Testcase 126:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int8, 888);
--Testcase 127:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int8, 888);
--Testcase 128:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 129:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 130:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int4, 888);
--Testcase 131:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int4, 888);
--Testcase 132:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int4, 888);
--Testcase 133:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 134:
DELETE FROM INT8_TMP WHERE q2 = 888;
--Testcase 135:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 * (-1)::int2, 888);
--Testcase 136:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 / (-1)::int2, 888);
--Testcase 137:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8 % (-1)::int2, 888);
--Testcase 138:
SELECT q1 FROM INT8_TMP WHERE q2 = 888;
--Testcase 139:
DELETE FROM INT8_TMP WHERE q2 = 888;
-- check rounding when casting from float
--Testcase 223:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 224:
DELETE FROM FLOAT8_TMP;
--Testcase 225:
INSERT INTO FLOAT8_TMP VALUES
(-2.5::float8),
(-1.5::float8),
(-0.5::float8),
(0.0::float8),
(0.5::float8),
(1.5::float8),
(2.5::float8);
--Testcase 226:
SELECT f1 as x, f1::int8 as int8_value FROM FLOAT8_TMP;
-- check rounding when casting from numeric
--Testcase 227:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 228:
DELETE FROM NUMERIC_TMP;
--Testcase 229:
INSERT INTO NUMERIC_TMP VALUES
(-2.5::numeric),
(-1.5::numeric),
(-0.5::numeric),
(0.0::numeric),
(0.5::numeric),
(1.5::numeric),
(2.5::numeric);
--Testcase 230:
SELECT f1 as x, f1::int8 as int8_value FROM NUMERIC_TMP;
-- test gcd()
--Testcase 231:
DELETE FROM INT8_TMP;
--Testcase 232:
INSERT INTO INT8_TMP 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);
--Testcase 233:
SELECT q1, q2, gcd(q1, q2), gcd(q1, -q2), gcd(q2, q1), gcd(-q2, q1) FROM INT8_TMP;
--Testcase 234:
DELETE FROM INT8_TMP;
--Testcase 235:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 0::int8);
--Testcase 236:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 237:
DELETE FROM INT8_TMP;
--Testcase 238:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, (-9223372036854775808)::int8);
--Testcase 239:
SELECT gcd(q1, q2) FROM INT8_TMP; -- overflow
-- test lcm()
--Testcase 240:
DELETE FROM INT8_TMP;
--Testcase 241:
INSERT INTO INT8_TMP 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);
--Testcase 242:
SELECT q1, q2, lcm(q1, q2), lcm(q1, -q2), lcm(q2, q1), lcm(-q2, q1) FROM INT8_TMP;
--Testcase 243:
DELETE FROM INT8_TMP;
--Testcase 244:
INSERT INTO INT8_TMP VALUES ((-9223372036854775808)::int8, 1::int8);
--Testcase 245:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
--Testcase 246:
DELETE FROM INT8_TMP;
--Testcase 247:
INSERT INTO INT8_TMP VALUES ((9223372036854775807)::int8, (9223372036854775806)::int8);
--Testcase 248:
SELECT lcm(q1, q2) FROM INT8_TMP; -- overflow
-- non-decimal literals
--Testcase 260:
CREATE FOREIGN TABLE special_case_int8 (f1 text, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 261:
INSERT INTO special_case_int8 VALUES ('0b100101'::int8);
--Testcase 262:
SELECT f1 FROM special_case_int8;
--Testcase 263:
DELETE FROM special_case_int8;
--Testcase 264:
INSERT INTO special_case_int8 VALUES ('0o273'::int8);
--Testcase 265:
SELECT f1 FROM special_case_int8;
--Testcase 266:
DELETE FROM special_case_int8;
--Testcase 267:
INSERT INTO special_case_int8 VALUES ('0x42F'::int8);
--Testcase 268:
SELECT f1 FROM special_case_int8;
--Testcase 269:
DELETE FROM special_case_int8;
--Testcase 270:
INSERT INTO special_case_int8 VALUES ('0b'::int8);
--Testcase 271:
SELECT f1 FROM special_case_int8;
--Testcase 272:
DELETE FROM special_case_int8;
--Testcase 273:
INSERT INTO special_case_int8 VALUES ('0o'::int8);
--Testcase 274:
SELECT f1 FROM special_case_int8;
--Testcase 275:
DELETE FROM special_case_int8;
--Testcase 276:
INSERT INTO special_case_int8 VALUES ('0x'::int8);
--Testcase 277:
SELECT f1 FROM special_case_int8;
-- cases near overflow
--Testcase 278:
DELETE FROM special_case_int8;
--Testcase 279:
INSERT INTO special_case_int8 VALUES ('0b111111111111111111111111111111111111111111111111111111111111111'::int8);
--Testcase 280:
SELECT f1 FROM special_case_int8;
--Testcase 281:
DELETE FROM special_case_int8;
--Testcase 282:
INSERT INTO special_case_int8 VALUES ('0b1000000000000000000000000000000000000000000000000000000000000000'::int8);
--Testcase 283:
SELECT f1 FROM special_case_int8;
--Testcase 284:
DELETE FROM special_case_int8;
--Testcase 285:
INSERT INTO special_case_int8 VALUES ('0o777777777777777777777'::int8);
--Testcase 286:
SELECT f1 FROM special_case_int8;
--Testcase 287:
DELETE FROM special_case_int8;
--Testcase 288:
INSERT INTO special_case_int8 VALUES ('0o1000000000000000000000'::int8);
--Testcase 289:
SELECT f1 FROM special_case_int8;
--Testcase 290:
DELETE FROM special_case_int8;
--Testcase 291:
INSERT INTO special_case_int8 VALUES ('0x7FFFFFFFFFFFFFFF'::int8);
--Testcase 292:
SELECT f1 FROM special_case_int8;
--Testcase 293:
DELETE FROM special_case_int8;
--Testcase 294:
INSERT INTO special_case_int8 VALUES ('0x8000000000000000'::int8);
--Testcase 295:
SELECT f1 FROM special_case_int8;
--Testcase 296:
DELETE FROM special_case_int8;
--Testcase 297:
INSERT INTO special_case_int8 VALUES ('-0b1000000000000000000000000000000000000000000000000000000000000000'::int8);
--Testcase 298:
SELECT f1 FROM special_case_int8;
--Testcase 299:
DELETE FROM special_case_int8;
--Testcase 300:
INSERT INTO special_case_int8 VALUES ('-0b1000000000000000000000000000000000000000000000000000000000000001'::int8);
--Testcase 301:
SELECT f1 FROM special_case_int8;
--Testcase 302:
DELETE FROM special_case_int8;
--Testcase 303:
INSERT INTO special_case_int8 VALUES ('-0o1000000000000000000000'::int8);
--Testcase 304:
SELECT f1 FROM special_case_int8;
--Testcase 305:
DELETE FROM special_case_int8;
--Testcase 306:
INSERT INTO special_case_int8 VALUES ('-0o1000000000000000000001'::int8);
--Testcase 307:
SELECT f1 FROM special_case_int8;
--Testcase 308:
DELETE FROM special_case_int8;
--Testcase 309:
INSERT INTO special_case_int8 VALUES ('-0x8000000000000000'::int8);
--Testcase 310:
SELECT f1 FROM special_case_int8;
--Testcase 311:
DELETE FROM special_case_int8;
--Testcase 312:
INSERT INTO special_case_int8 VALUES ('-0x8000000000000001'::int8);
--Testcase 313:
SELECT f1 FROM special_case_int8;
-- underscores
--Testcase 314:
DELETE FROM special_case_int8;
--Testcase 315:
INSERT INTO special_case_int8 VALUES ('1_000_000'::int8);
--Testcase 316:
SELECT f1 FROM special_case_int8;
--Testcase 317:
DELETE FROM special_case_int8;
--Testcase 318:
INSERT INTO special_case_int8 VALUES ('1_2_3'::int8);
--Testcase 319:
SELECT f1 FROM special_case_int8;
--Testcase 320:
DELETE FROM special_case_int8;
--Testcase 321:
INSERT INTO special_case_int8 VALUES ('0x1EEE_FFFF'::int8);
--Testcase 322:
SELECT f1 FROM special_case_int8;
--Testcase 323:
DELETE FROM special_case_int8;
--Testcase 324:
INSERT INTO special_case_int8 VALUES ('0o2_73'::int8);
--Testcase 325:
SELECT f1 FROM special_case_int8;
--Testcase 326:
DELETE FROM special_case_int8;
--Testcase 327:
INSERT INTO special_case_int8 VALUES ('0b_10_0101'::int8);
--Testcase 328:
SELECT f1 FROM special_case_int8;
-- error cases
--Testcase 329:
DELETE FROM special_case_int8;
--Testcase 330:
INSERT INTO special_case_int8 VALUES ('_100'::int8);
--Testcase 331:
SELECT f1 FROM special_case_int8;
--Testcase 332:
DELETE FROM special_case_int8;
--Testcase 333:
INSERT INTO special_case_int8 VALUES ('100_'::int8);
--Testcase 334:
SELECT f1 FROM special_case_int8;
--Testcase 335:
DELETE FROM special_case_int8;
--Testcase 336:
INSERT INTO special_case_int8 VALUES ('100__000'::int8);
--Testcase 337:
SELECT f1 FROM special_case_int8;
--Testcase 338:
DELETE FROM INT8_TBL;
-- Clean up
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 249:
DROP SERVER sqlite_svr;
--Testcase 250:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/json.sql
================================================
-- SET log_min_messages TO DEBUG3;
-- SET client_min_messages TO DEBUG3;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 010:
CREATE FOREIGN TABLE "type_JSON" (
"i" int OPTIONS (key 'true'),
"j" json,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" json
) SERVER sqlite_svr OPTIONS (table 'type_JSON');
--Testcase 011:
CREATE FOREIGN TABLE "type_JSONB" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB');
--Testcase 012:
CREATE FOREIGN TABLE "type_JSONB+" (
"i" int OPTIONS (key 'true'),
"j" jsonb,
l int, t varchar(16), tx text,
ot text,
ot1 text,
oi int,
oi1 int2,
q text[],
"j1" jsonb
) SERVER sqlite_svr OPTIONS (table 'type_JSONB+');
--Testcase 013:
INSERT INTO "type_JSON" ("i", "j", ot, ot1, oi, oi1) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}],"a+u":47,"5":true,"cc3":["a", "b", "c"], "c3":[true, false]}',
'c', 'c3', 2, 1),
(2, '[11,22,33,44,55,66,77,88,99,10,11,12,13,14]',
'1', '29', 3, 1),
(3, '{"a":"xyz", "π":3.1415926535, "aπ":false }',
'a', 'π', 1, NULL),
(4, '{"a":null, "a22":22.0, "a2":2 }',
'a', '22', 4, NULL),
(5, '[9,null,7,6,5,4,3,2,1,0]',
'1', '5', -4, 5),
(6, '[0.0,1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,null,true]',
'1', '21', -2, 5);
--Testcase 014:
INSERT INTO "type_JSONB" SELECT * FROM "type_JSON";
--Testcase 015: check some SQLite JSONb initial bytes
SELECT i, tx FROM "type_JSONB+";
--Testcase 020:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 021: SQLite queries to type_JSON will be without normalization for j column
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN j OPTIONS (ADD column_type 'text');
--Testcase 022:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 023:
SELECT "i", "j", j."j"->'c' res FROM "type_JSON" j;
--Testcase 024:
SELECT "i", "j", j."j"->'a' res FROM "type_JSON" j;
--Testcase 025:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 026:
SELECT "i", "j", j."j"->'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 027:
SELECT "i", "j", j."j"->'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 028:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 029:
SELECT "i", "j", j."j"->>'c' res FROM "type_JSON" j;
--Testcase 030:
SELECT "i", "j", j."j"->>'a' res FROM "type_JSON" j;
--Testcase 031:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 032:
SELECT "i", "j", j."j"->>'c' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 033:
SELECT "i", "j", j."j"->>'a' res, l, t, tx FROM "type_JSONB+" j;
--Testcase 034:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 035:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 036:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 037:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 038:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'c' IS NOT NULL;
--Testcase 039:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->'a' IS NOT NULL;
--Testcase 040:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 041:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 042:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 044:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'c' IS NOT NULL;
--Testcase 045:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'a' IS NOT NULL;
--Testcase 046:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 047:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSON" j;
--Testcase 048:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSON" j;
--Testcase 049:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 050:
SELECT "i", "j", j."j" -> 1 res FROM "type_JSONB" j;
--Testcase 051:
SELECT "i", "j", j."j" -> 10 res FROM "type_JSONB" j;
--Testcase 052:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 053:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSON" j;
--Testcase 054:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSON" j;
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 056:
SELECT "i", "j", j."j" ->> 1 res FROM "type_JSONB" j;
--Testcase 057:
SELECT "i", "j", j."j" ->> 10 res FROM "type_JSONB" j;
--Testcase 058:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 059:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 060:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 061:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 062:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 1 IS NOT NULL;
--Testcase 063:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" -> 10 IS NOT NULL;
--Testcase 064:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 065:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 066:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 067:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 068:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 1 IS NOT NULL;
--Testcase 069:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j" ->> 10 IS NOT NULL;
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 071:
SELECT "i", "j", ot, j."j"->ot res FROM "type_JSON" j;
--Testcase 072:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 073:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSON" j;
--Testcase 074:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 075:
SELECT "i", "j", ot, j."j"->>ot res FROM "type_JSONB" j;
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 077:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 078:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 079:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 081:
SELECT "i", "j", ot FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 082:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 083:
SELECT "i", "j", ot FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 085:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSON" j;
--Testcase 086:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 087:
SELECT "i", "j", oi, j."j" -> oi res FROM "type_JSONB" j;
--Testcase 088:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 089:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSON" j;
--Testcase 090:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 091:
SELECT "i", "j", oi, j."j" ->> oi res FROM "type_JSONB" j;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 093:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 095:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" -> oi IS NOT NULL;
--Testcase 096:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 097:
SELECT "i", "j", oi FROM "type_JSON" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
--Testcase 099:
SELECT "i", "j", oi FROM "type_JSONB" j WHERE j."j" ->> oi IS NOT NULL;
-- extraction with arithmetical an other expressions
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 101:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 103:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 105:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 107:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 109:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NOT NULL;
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 111:
SELECT "i", "j", j."j" -> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi + oi1) IS NULL;
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 113:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NOT NULL;
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 115:
SELECT "i", "j", j."j" ->> (oi + oi1) res, oi + oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + oi1) IS NULL;
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 117:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 119:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 120:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 121:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 122:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 123:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSON" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 124:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 125:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NOT NULL;
--Testcase 126:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 127:
SELECT "i", "j", j."j" -> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" -> (oi - oi1) IS NULL;
--Testcase 128:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 129:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NOT NULL;
--Testcase 130:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 131:
SELECT "i", "j", j."j" ->> (oi - oi1) res, oi - oi1 expr FROM "type_JSONB" j WHERE j."j" ->> (oi - oi1) IS NULL;
--Testcase 132:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 133:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 134:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 135:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 136:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 137:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 138:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 139:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSON" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 140:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 141:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NOT NULL;
--Testcase 142:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 143:
SELECT "i", "j", j."j" -> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" -> (oi + 2) IS NULL;
--Testcase 144:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 145:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NOT NULL;
--Testcase 146:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 147:
SELECT "i", "j", j."j" ->> (oi + 2) res, oi + 2 expr FROM "type_JSONB" j WHERE j."j" ->> (oi + 2) IS NULL;
--Testcase 148:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 149:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 151:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 153:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 155:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSON" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 157:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NOT NULL;
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 159:
SELECT "i", "j", j."j" -> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" -> (ot || ot1) IS NULL;
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 161:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NOT NULL;
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 163:
SELECT "i", "j", j."j" ->> (ot || ot1) res, ot || ot1 expr FROM "type_JSONB" j WHERE j."j" ->> (ot || ot1) IS NULL;
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 165:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 167:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 169:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 171:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSON" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 172:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 173:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 174:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 175:
SELECT "i", "j", j."j" -> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" -> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 176:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 177:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NOT NULL;
--Testcase 178:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--Testcase 179:
SELECT "i", "j", j."j" ->> (ot || substr(ot1, 2, 1)) res, ot || substr(ot1, 2, 1) expr FROM "type_JSONB" j WHERE j."j" ->> (ot || substr(ot1, 2, 1)) IS NULL;
--TCs for SQLite JSON -> format, no sense in PostgreSQL itself
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 201:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 203:
SELECT "i", "j" FROM "type_JSON" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 204:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 205:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NOT NULL;
--Testcase 206:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 207:
SELECT "i", "j" FROM "type_JSONB" j WHERE j."j"->>'$.c[2].f' IS NULL;
--Testcase 208:
DELETE FROM "type_JSON";
--Testcase 209:
DELETE FROM "type_JSONB";
--Testcase 210:
INSERT INTO "type_JSON" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 211:
INSERT INTO "type_JSONB" ("i", "j", ot, oi) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '$', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '$.c', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', 'c', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]', NULL),
(5, '{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '$.c[#-1]', NULL),
(7, '{"a":2,"c":[4,5],"f":7}', '$.e', NULL);
--Testcase 212:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 213:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 214:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 215:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSON" j WHERE j."j"->>ot IS NULL;
--Testcase 216:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 217:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NOT NULL;
--Testcase 218:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 219:
SELECT "i", "j", ot, "j" ->> ot res FROM "type_JSONB" j WHERE j."j"->>ot IS NULL;
--Testcase 220:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 221:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NOT NULL;
--Testcase 222:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 223:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSON" j WHERE j."j"->ot IS NULL;
--Testcase 224:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 225:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NOT NULL;
--Testcase 226:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
--Testcase 227:
SELECT "i", "j", ot, "j" -> ot res FROM "type_JSONB" j WHERE j."j"->ot IS NULL;
-- end of SQLite right -> ->> operand test
-- Operators -> ->> in SELECT context
--Testcase 230:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 231:
SELECT "i", "j"->>ot "r" FROM "type_JSON" j;
--Testcase 232:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 233:
SELECT "i", "j"->>ot "r" FROM "type_JSONB" j;
--Testcase 234:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 235:
SELECT "i", "j"->ot "r" FROM "type_JSON" j;
--Testcase 236:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 237:
SELECT "i", "j"->ot "r" FROM "type_JSONB" j;
--Testcase 238:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 239:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j;
--Testcase 240:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 241:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j;
--Testcase 250:
DELETE FROM "type_JSON";
--Testcase 251:
DELETE FROM "type_JSONB";
--Testcase 252:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text;
--Testcase 253:
INSERT INTO "type_JSON" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 254:
ALTER FOREIGN TABLE "type_JSON" ALTER COLUMN "q" TYPE text[];
--Testcase 255:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text;
--Testcase 256:
INSERT INTO "type_JSONB" ("i", "j", q, ot) VALUES
(1, '{"a":2,"c":[4,5,{"f":7}]}', '{a}', NULL),
(2, '{"a":2,"c":[4,5,{"f":7}]}', '{c}', NULL),
(3, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2}', NULL),
(4, '{"a":2,"c":[4,5,{"f":7}]}', '{c,2,f}', NULL),
(5, '{"a":2,"c":[4,5],"f":7}', '{c,-1}', NULL),
(6, '{"a":2,"c":[4,5],"f":7}', '{u,8,i}', NULL),
(7, '{"a":2}', '{a}', NULL);
--Testcase 257:
ALTER FOREIGN TABLE "type_JSONB" ALTER COLUMN "q" TYPE text[];
--Testcase 260:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 261:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NULL;
--Testcase 262:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 263:
SELECT "i", j."j" #> q "r" FROM "type_JSON" j WHERE j."j" #> q IS NOT NULL;
--Testcase 264:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 265
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NULL;
--Testcase 266:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 267:
SELECT "i", j."j" #> q "r" FROM "type_JSONB" j WHERE j."j" #> q IS NOT NULL;
--Testcase 268:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 269:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NULL;
--Testcase 270:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 271:
SELECT "i", j."j" #>> q "r" FROM "type_JSON" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 272:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 273
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NULL;
--Testcase 274:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 275:
SELECT "i", j."j" #>> q "r" FROM "type_JSONB" j WHERE j."j" #>> q IS NOT NULL;
--Testcase 276:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 277: no such - even wrong JSON gives false
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NULL;
--Testcase 278:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 279:
SELECT "i", j."j" ?| q "r" FROM "type_JSONB" j WHERE j."j" ?| q IS NOT NULL;
--Testcase 280:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 281: no such - even wrong JSON gives false
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NULL;
--Testcase 282:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 283:
SELECT "i", j."j" ?& q "r" FROM "type_JSONB" j WHERE j."j" ?& q IS NOT NULL;
--Testcase 284:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 285: no such
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" - q IS NULL;
--Testcase 286:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 287:
SELECT "i", j."j" - q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 288:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 289: no such
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NULL;
--Testcase 290:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 291:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 292:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 293:
SELECT "i", j."j" #- q "r" FROM "type_JSONB" j WHERE j."j" #- q IS NOT NULL;
--Testcase 294:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 295:
UPDATE "type_JSONB" SET j1 = '{"c":[4,5,{"f":7}]}'::json;
--Testcase 296:
SELECT * FROM "type_JSONB+";
--Testcase 297:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 298:
SELECT "i", "j" @> "j1" "r" FROM "type_JSONB" WHERE "j" @> "j1";
--Testcase 299:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Testcase 300: no such
SELECT "i", "j1" <@ "j" "r" FROM "type_JSONB" WHERE "j" <@ "j1";
--Multievel extraction chains
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 302:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSON" j;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 304:
SELECT "i", "j", j."j"-> 'c' -> 2 ->> 'f' res FROM "type_JSONB" j;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 306:
SELECT *, "j" -> 'c' -> 2 ->> 'f' res FROM "type_JSON" WHERE i = 1 AND "j" -> 'c' -> 2 ->> 'f' IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
--Testcase 308:
SELECT *, "j" -> 'q' -> 2 ->> 'r' res FROM "type_JSONB" WHERE i = 1 AND "j" -> 'q' -> 2 ->> 'r' IS NOT NULL;
-- UPDATE tests
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 310:
UPDATE "type_JSON" SET j = '{"q":[4,5,{"r":7}]}' WHERE "i" = 1;
--Testcase 311:
SELECT * FROM "type_JSON" WHERE "i" = 1;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 313:
UPDATE "type_JSONB" SET j = '{"q":[4,5,{"r":7}]}'::json WHERE "i" = 1;
--Testcase 314:
SELECT * FROM "type_JSONB+" WHERE "i" = 1;
-- Real GIS data test, data from https://www.wikidata.org/wiki/Q118122043
-- https://commons.wikimedia.org/wiki/Category:Private_Garden_(Pavlovsk)
-- License of testing data in json_osm_test table: ODbL, © OpenStreetMap contributors
--Testcase 400:
CREATE FOREIGN TABLE json_osm_test (
wkt text NOT NULL,
osm_type varchar(8) OPTIONS (key 'true') NOT NULL,
osm_id int8 OPTIONS (key 'true') NOT NULL,
t json OPTIONS (column_name 'tags') NULL,
way_nodes text NULL
) SERVER sqlite_svr;
--Testcase 401:
INSERT INTO json_osm_test VALUES ('SRID=4326;POINT(30.4536193 59.6847624)', 'node', 1198356775, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4522474 59.6851858)', 'node', 1198357028, '{"access": "private", "locked": "yes", "barrier": "gate"}', NULL),
('SRID=4326;POINT(30.4532025 59.6850113)', 'node', 1738381537, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "description": "Ваза в дендрарии Собственного садика", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529584 59.6849417)', 'node', 3968068680, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526407 59.68497)', 'node', 4487385447, '{"height": "1.5", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "late C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4524943 59.6854502)', 'node', 4912270255, '{"fee": "yes", "access": "customers", "barrier": "gate", "vehicle": "no", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "barrier:personnel": "additional"}', NULL),
('SRID=4326;POINT(30.452977 59.6847621)', 'node', 7484858507, '{"name": "Неизвестный мужчина", "ref:okn": "781610399040516", "tourism": "artwork", "alt_name": "Спутник Одиссея", "heritage": "2", "historic": "yes", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6522/"}', NULL),
('SRID=4326;POINT(30.452909 59.6847573)', 'node', 7484858508, '{"name": "Антиной", "ref:okn": "781610399040526", "tourism": "artwork", "alt_name": "Дионис", "heritage": "2", "historic": "yes", "material": "stone", "start_date": "late C18..early C19", "artwork_type": "bust", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6521/"}', NULL),
('SRID=4326;POINT(30.4529561 59.6848095)', 'node', 8114975053, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528946 59.6848042)', 'node', 8114975054, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528732 59.6848762)', 'node', 8114975055, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529364 59.6848802)', 'node', 8114975056, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528444 59.6851765)', 'node', 8289295956, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527798 59.6851726)', 'node', 8289295957, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528665 59.6850957)', 'node', 8289295958, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528046 59.685091)', 'node', 8289295959, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528947 59.6850172)', 'node', 8289295960, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528301 59.6850118)', 'node', 8289295961, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4529101 59.6849636)', 'node', 8289295962, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528496 59.684959)', 'node', 8289295963, '{"name": "Ваза", "height": "1.5", "name:en": "Vase", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "wikidata": "Q118122044", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4528359 59.6852187)', 'node', 8331430659, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4527605 59.685213)', 'node', 8331430660, '{"height": "2", "ref:okn": "781620399040936", "tourism": "artwork", "historic": "yes", "material": "marble", "start_date": "C18", "artwork_type": "vase"}', NULL),
('SRID=4326;POINT(30.4523414 59.6851726)', 'node', 8331430663, '{"name": "Сатир", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4523561 59.685141)', 'node', 8331430664, '{"name": "Сатиресса", "height": "1.5", "tourism": "artwork", "historic": "yes", "wikidata": "Q118122105", "start_date": "~1779..1801", "artwork_type": "statue", "artwork:start_date": "C18"}', NULL),
('SRID=4326;POINT(30.4527994 59.6847007)', 'node', 8566916332, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4528945 59.6847497)', 'node', 8566916333, '{"height": "8", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529784 59.6853519)', 'node', 8895996426, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4529255 59.6853861)', 'node', 8895996427, '{"genus": "Thuja", "height": "1", "natural": "tree", "genus:ru": "Туя", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4525278 59.685471)', 'node', 8895996643, '{"genus": "Tilia", "height": "6", "natural": "tree", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4534153 59.6851412)', 'node', 8899249758, '{"genus": "Elaeagnus", "taxon": "Elaeagnus commutata", "natural": "shrub", "genus:ru": "Лох", "taxon:ru": "Лох серебристый", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4535524 59.6848638)', 'node', 8899249764, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4535202 59.6849613)', 'node', 8899249765, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534934 59.6850486)', 'node', 8899249766, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4534679 59.685136)', 'node', 8899249767, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4528899 59.6851725)', 'node', 8899249768, '{"height": "0.8", "highway": "street_lamp", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530448 59.6850046)', 'node', 8899249769, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4533465 59.6850216)', 'node', 8899249770, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4532205 59.6849417)', 'node', 8899249771, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531776 59.6850839)', 'node', 8899249772, '{"colour": "green", "amenity": "bench", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4534136 59.6851265)', 'node', 8899249773, '{"genus": "Malus", "taxon": "Malus niedzwetzkyana", "height": "5", "natural": "tree", "genus:ru": "Яблоня", "taxon:ru": "Яблоня Недзвецкого", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533043 59.6851928)', 'node', 8899249779, '{"height": "4", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.452916 59.6849894)', 'node', 8899249796, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4528248 59.684983)', 'node', 8899249797, '{"colour": "green", "amenity": "bench", "ref:okn": "781620399040946", "backrest": "yes", "material": "wood"}', NULL),
('SRID=4326;POINT(30.4531527 59.685139)', 'node', 8899299127, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4529549 59.6850382)', 'node', 8902082041, '{"genus": "Syrínga", "taxon": "Syringa vulgaris", "natural": "shrub", "genus:ru": "Сирень", "taxon:ru": "Сирень обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530139 59.6850101)', 'node', 8902082042, '{"genus": "Amelanchier", "taxon": "Amelanchier canadensis", "natural": "shrub", "genus:ru": "Ирга", "taxon:ru": "Ирга канадская", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530089 59.6850564)', 'node', 8902082048, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529982 59.685072)', 'node', 8902082055, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530213 59.6850872)', 'node', 8902082060, '{"genus": "Picea", "taxon": "Picea glauca", "height": "1.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель сизая", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4529918 59.6851617)', 'node', 8902082061, '{"genus": "Berberis", "taxon": "Berberis vulgaris", "natural": "shrub", "genus:ru": "Барбарис", "taxon:ru": "Барбарис обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530615 59.685137)', 'node', 8902082071, '{"genus": "Paeonia", "taxon": "Paeonia suffruticosa", "natural": "shrub", "genus:ru": "Пион", "taxon:ru": "Пион древовидный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531031 59.6851282)', 'node', 8902082072, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530991 59.6851451)', 'node', 8902082073, '{"genus": "Caragana", "taxon": "Caragana arborescens", "natural": "shrub", "genus:ru": "Карагана", "taxon:ru": "Карагана древовидная", "description": "Акация желтая", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4531977 59.6851532)', 'node', 8902082074, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453207 59.6851336)', 'node', 8902082075, '{"genus": "Thuja", "taxon": "Thuja occidentalis", "height": "1", "natural": "tree", "genus:ru": "Туя", "taxon:ru": "Туя западная", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532426 59.6850926)', 'node', 8902082171, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532694 59.6851157)', 'node', 8902082172, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533707 59.6851035)', 'node', 8902082173, '{"genus": "Hydrangea", "taxon": "Hydrangea paniculata", "natural": "shrub", "genus:ru": "Гортензия", "taxon:ru": "Гортензия метельчатая"}', NULL),
('SRID=4326;POINT(30.4528986 59.6851502)', 'node', 8902082174, '{"genus": "Quercus", "taxon": "Quercus robur", "natural": "tree", "genus:ru": "Дуб", "taxon:ru": "Дуб черешчатый", "leaf_type": "broadleaved", "denotation": "landmark", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4530486 59.6848994)', 'node', 8904992674, '{"genus": "Viburnum", "taxon": "Viburnum opulus", "natural": "shrub", "genus:ru": "Калина", "taxon:ru": "Калина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532396 59.6848373)', 'node', 8905335421, '{"genus": "Corylus", "taxon": "Corylus avellana", "natural": "shrub", "genus:ru": "Лещина", "taxon:ru": "Лещина обыкновенная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532946 59.684841)', 'node', 8905335422, '{"genus": "Spiraea", "taxon": "Spiraea chamaedryfolia", "natural": "shrub", "genus:ru": "Спирея", "taxon:ru": "Спирея дубравколистная", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533857 59.6849271)', 'node', 8905335423, '{"genus": "Euonymus", "taxon": "Euonymus europaeus", "natural": "shrub", "genus:ru": "Бересклет", "taxon:ru": "Бересклет европейский", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534136 59.6849004)', 'node', 8905335424, '{"genus": "Prunus", "taxon": "Prunus sachalinensis", "height": "5", "natural": "tree", "genus:ru": "Вишня", "taxon:ru": "Вишня сахалинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4533998 59.6848611)', 'node', 8905335425, '{"genus": "Buxus", "taxon": "Buxus sempervirens", "height": "1", "natural": "shrub", "genus:ru": "Самшит", "taxon:ru": "Самшит вечнозелёный", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4534776 59.6848679)', 'node', 8905335426, '{"genus": "Rhamnus", "taxon": "Rhamnus cathartica", "height": "4", "natural": "tree", "genus:ru": "Жостер", "taxon:ru": "Жостер слабительный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4534324 59.6849515)', 'node', 8905335427, '{"genus": "Lonicera", "taxon": "Lonicera caerulea", "natural": "shrub", "genus:ru": "Жимолость", "taxon:ru": "Жимолость синяя", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.453365 59.684981)', 'node', 8905335428, '{"genus": "Philadelphus", "taxon": "Philadelphus coronarius", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник венечный"}', NULL),
('SRID=4326;POINT(30.4533874 59.6849671)', 'node', 8905335429, '{"genus": "Juniperus", "taxon": "Juniperus sabina", "height": "0.5", "natural": "shrub", "genus:ru": "Можжевельник", "taxon:ru": "Можжевельник казацкий", "leaf_type": "needleleaved", "leaf_cycle": "evergreen"}', NULL),
('SRID=4326;POINT(30.4531319 59.6849356)', 'node', 8905335430, '{"genus": "Picea", "taxon": "Picea abies", "height": "0.5", "natural": "tree", "genus:ru": "Ель", "taxon:ru": "Ель европейская", "leaf_type": "needleleaved", "leaf_cycle": "evergreen", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532466 59.6848527)', 'node', 8905335431, '{"genus": "Ginkgo", "taxon": "Ginkgo biloba", "height": "2.5", "natural": "tree", "genus:ru": "Гингко", "taxon:ru": "Гинкго двулопастный", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "label"}', NULL),
('SRID=4326;POINT(30.4532184 59.6848635)', 'node', 8905335468, '{"genus": "Daphne", "taxon": "Daphne mezereum", "natural": "shrub", "genus:ru": "Волчеягодник", "taxon:ru": "Волчеягодник обыкновенный", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4532392 59.6848902)', 'node', 8905335469, '{"height": "3", "natural": "tree", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;POINT(30.4526679 59.6846912)', 'node', 8905558225, '{"height": "3", "highway": "street_lamp", "man_made": "surveillance", "material": "metal", "lamp_type": "electric"}', NULL),
('SRID=4326;POINT(30.4530347 59.6849253)', 'node', 8906857477, '{"genus": "Philadelphus lemoinei", "taxon": "Philadelphus lemoinei", "natural": "shrub", "genus:ru": "Чубушник", "taxon:ru": "Чубушник Лемуана", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530224 59.6849455)', 'node', 8906857478, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}', NULL),
('SRID=4326;POINT(30.4530015 59.6847554)', 'node', 8906857479, '{"natural": "tree_stump"}', NULL),
('SRID=4326;LINESTRING(30.4522584 59.6851734,30.4522474 59.6851858)', 'way', 103807093, '{"highway": "footway", "surface": "compacted"}', '{3968068679,1198357028}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525041 59.6846527,30.4522364 59.6845601,30.4516531 59.6843525,30.4513385 59.6842533,30.4513511 59.6841667)', 'way', 103807103, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{8566824024,12023699867,8114975022,1195141497,4014269128,3186425168}'),
('SRID=4326;LINESTRING(30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456)', 'way', 103807114, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{1198357004,303515662,8566916345,1198356771,8566916346,1198356889,1198357009,8906857470}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529382 59.6847803,30.4528051 59.6851927,30.4527793 59.6852746,30.4527609 59.6853349,30.4527422 59.6853961,30.4527263 59.6854482,30.4527224 59.6854618)', 'way', 153761053, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068681,8114975050,8114975107,8895975844,8895975845,8895975847,4912270253,1664064412}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4532459 59.6852254,30.45322 59.6852491)', 'way', 153761054, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975105,3968068669}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4528762 59.6851274,30.4530118 59.6851874)', 'way', 153947121, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381541,1665582246}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4529574 59.6848702,30.4531238 59.6848204)', 'way', 153947122, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1738381532,1665582234}'),
('SRID=4326;LINESTRING(30.4533888 59.6848413,30.4535109 59.6849058,30.4534919 59.684967)', 'way', 153947123, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582235,1738381534,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533267 59.6852228,30.4533391 59.6851996,30.4533483 59.6851876,30.4533556 59.6851828,30.4533653 59.6851769,30.4533784 59.6851717,30.4533901 59.6851678,30.4534147 59.6851629,30.4534315 59.6851615,30.4534524 59.6850941)', 'way', 153947124, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,8114975034,8899249793,8114975035,8902027910,8899249794,8902027909,8899249795,1738381544,8114975036,1665582244}'),
('SRID=4326;LINESTRING(30.4531795 59.685129,30.4533062 59.6850846,30.4534722 59.6850303,30.4534919 59.684967)', 'way', 153947125, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975075,1665582243,1738381539,1665582240}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4530483 59.6850678,30.4529356 59.6849912)', 'way', 153947126, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,1665582242,8902082170}'),
('SRID=4326;LINESTRING(30.4529356 59.6849912,30.4530873 59.6849398,30.453213 59.6848988)', 'way', 153947127, '{"highway": "footway", "surface": "fine_gravel"}', '{8902082170,1665582238,8904992643}'),
('SRID=4326;LINESTRING(30.4532598 59.6849025,30.4533508 59.6849575,30.4534722 59.6850303,30.4534524 59.6850941)', 'way', 153947128, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992648,1665582239,1738381539,1665582244}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4531238 59.6848204,30.4533888 59.6848413,30.4535282 59.6848524)', 'way', 153947130, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1665582234,1665582235,1665582236}'),
('SRID=4326;LINESTRING(30.4529389 59.6849276,30.4530873 59.6849398,30.4532201 59.6849487,30.4533508 59.6849575,30.4534919 59.684967)', 'way', 153947131, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582237,1665582238,8902082149,1665582239,1665582240}'),
('SRID=4326;LINESTRING(30.4532657 59.6852057,30.4533062 59.6850846,30.4533306 59.6850189,30.4533508 59.6849575,30.4533888 59.6848413)', 'way', 153947132, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582248,1665582243,8902082150,1665582239,1665582235}'),
('SRID=4326;LINESTRING(30.4534524 59.6850941,30.4533062 59.6850846,30.4531801 59.6850762,30.4530483 59.6850678,30.452898 59.6850578)', 'way', 153947133, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582244,1665582243,8902082168,1665582242,1665582241}'),
('SRID=4326;LINESTRING(30.4532234 59.6850226,30.4533062 59.6850846,30.4534147 59.6851629)', 'way', 153947134, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975088,1665582243,1738381544}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4530483 59.6850678,30.4530675 59.6850048,30.4530873 59.6849398,30.4531238 59.6848204)', 'way', 153947135, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,1665582242,8902082151,1665582238,1665582234}'),
('SRID=4326;LINESTRING(30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858)', 'way', 312745383, '{"barrier": "fence"}', '{1439053672,4912270255,4438910482,8895996664,4438910480,3234125031,4438910477,8893386635,4438910475,8895996665,4438910473,8114975112,8114975111,1198357028}'),
('SRID=4326;LINESTRING(30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554)', 'way', 315626926, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053649,8895996432,8895996430,1439053648,1439053645,8895996431,1439053641,1439053639}'),
('SRID=4326;LINESTRING(30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577)', 'way', 317173782, '{"height": "1.5", "barrier": "fence", "material": "metal", "fence_type": "bars"}', '{1653641713,8114975028,8114975027,8566824024}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.4526304 59.6847065,30.4529536 59.6847313,30.453482 59.6847765,30.4535921 59.6847856,30.4535778 59.6848316,30.4534654 59.685163)', 'way', 393601662, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774427,8905543616,3968068681,7927774426,3968068674,8114975049,3968068687}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4530118 59.6851874,30.4532501 59.6852048,30.4532657 59.6852057)', 'way', 393601664, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1665582246,8899299159,1665582248}'),
('SRID=4326;LINESTRING(30.4528624 59.685176,30.4528762 59.6851274,30.4530483 59.6850678,30.4531752 59.6850205)', 'way', 393601667, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068670,1738381541,1665582242,8114975100}'),
('SRID=4326;LINESTRING(30.452545 59.6854429,30.4525305 59.6854105,30.4525224 59.6853929,30.4525133 59.6853758,30.4525036 59.6853597,30.4524909 59.6853438,30.4524775 59.6853279,30.4524583 59.6853083,30.4524437 59.6852938,30.4524165 59.6852717,30.4523957 59.6852568,30.452375 59.6852427,30.4523461 59.6852243,30.4523179 59.6852068)', 'way', 393620818, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975116,8895996660,8895996640,4438927787,8895996641,8895996659,8895996642,4438927782,8114975115,8895996661,8895996639,4438927777,8895996638,8114975114}'),
('SRID=4326;LINESTRING(30.45322 59.6852491,30.4530263 59.6852336,30.4529402 59.6852275,30.4528645 59.6852217)', 'way', 393620820, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{3968068669,8895975857,8895975877,8895975841}'),
('SRID=4326;LINESTRING(30.4527686 59.6854977,30.4528746 59.6855048)', 'way', 446650486, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{1439053671,1439053674}'),
('SRID=4326;LINESTRING(30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905)', 'way', 446650506, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053619,8914843795,8895996424,8914843796,1439053616,8914843797,8895996423,8914843798,1439053613,8914843799,8895996422,8895996441,8914843802,8895996421,8914843801,1439053611,8914843800,8895996420,1439053614}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522278 59.6851794)', 'way', 446651403, '{"barrier": "fence"}', '{1198357028,1653641713}'),
('SRID=4326;LINESTRING(30.4524943 59.6854502,30.452545 59.6854429,30.4525879 59.6854383,30.4527263 59.6854482,30.4528729 59.6854587)', 'way', 500077282, '{"highway": "footway", "surface": "fine_gravel"}', '{4912270255,8114975116,4438928092,4912270253,4438928093}'),
('SRID=4326;LINESTRING(30.4522474 59.6851858,30.4522167 59.6853009)', 'way', 758868053, '{"highway": "footway"}', '{1198357028,1406921754}'),
('SRID=4326;LINESTRING(30.4529536 59.6847313,30.4529562 59.6847243)', 'way', 849729200, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068681,8905543615}'),
('SRID=4326;LINESTRING(30.453482 59.6847765,30.4534851 59.684767)', 'way', 849729201, '{"highway": "footway", "surface": "fine_gravel"}', '{7927774426,8905543614}'),
('SRID=4326;LINESTRING(30.452599 59.6846895,30.4525675 59.6846756,30.45256 59.6846723,30.452568 59.6846486,30.4535014 59.6847265,30.4534976 59.6847368)', 'way', 849729202, '{"highway": "footway", "surface": "fine_gravel"}', '{3968068677,12023732269,8566916344,8566916343,8566916342,7927774425}'),
('SRID=4326;LINESTRING(30.4528543 59.6851747,30.4529071 59.6850026,30.4529249 59.685004,30.4529333 59.6849769,30.452917 59.6849756,30.4529721 59.6847963)', 'way', 871154683, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8114975041,8899249805,8899249804,8899249803,8899249802,8114975042}'),
('SRID=4326;LINESTRING(30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274,30.4526587 59.6847165)', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8114975046,8114975047,8906857474,8906857473,8114975046}'),
('SRID=4326;LINESTRING(30.4530118 59.6851874,30.4531264 59.6851489)', 'way', 871154687, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582246,8114975076}'),
('SRID=4326;LINESTRING(30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257)', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975078,8114975073,8114975074,8114975057,8114975058,8114975059,8114975075,8114975060,8114975061,8114975067,8114975068,8114975069,8114975077,8114975070,8114975062,8114975063,8114975064,8114975076,8114975065,8114975066,8114975071,8114975072,8114975078}'),
('SRID=4326;LINESTRING(30.4532501 59.6852048,30.4531713 59.6851525)', 'way', 871154689, '{"highway": "footway", "surface": "fine_gravel"}', '{8899299159,8114975077}'),
('SRID=4326;LINESTRING(30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998)', 'way', 871154691, '{"highway": "footway"}', '{8114975097,8114975079,8114975080,8114975081,8114975082,8114975083,8114975099,8114975084,8114975085,8114975086,8114975087,8114975088,8114975089,8114975090,8114975091,8114975092,8114975100,8114975093,8114975094,8114975095,8114975096,8114975097}'),
('SRID=4326;LINESTRING(30.4529775 59.684808,30.4529574 59.6848702,30.4530873 59.6849398,30.4531787 59.684998)', 'way', 871154694, '{"highway": "footway", "surface": "fine_gravel"}', '{1664064416,1738381532,1665582238,8114975097}'),
('SRID=4326;LINESTRING(30.4532281 59.6850005,30.4533508 59.6849575,30.4535109 59.6849058,30.4535282 59.6848524)', 'way', 871154695, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975099,1665582239,1738381534,1665582236}'),
('SRID=4326;LINESTRING(30.4532459 59.6852254,30.4528051 59.6851927,30.4522785 59.6851511)', 'way', 871154698, '{"highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8114975105,8114975107,8114975109}'),
('SRID=4326;LINESTRING(30.4526095 59.6853751,30.4526201 59.6853832,30.4527025 59.6853899,30.4527175 59.6853841,30.4527302 59.6853414,30.4527195 59.685334,30.4526348 59.6853281,30.4526225 59.6853328,30.4526095 59.6853751)', 'way', 871154699, '{"landuse": "flowerbed"}', '{8114975123,8114975124,8114975125,8895996607,8895996606,8114975126,8114975127,8114975181,8114975123}'),
('SRID=4326;LINESTRING(30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686)', 'way', 871154701, '{"landuse": "flowerbed"}', '{8114975136,8114975137,8114975138,8114975139,8114975140,8114975141,8114975142,8114975143,8114975136}'),
('SRID=4326;LINESTRING(30.4525419 59.6853075,30.4525505 59.6853142,30.4526031 59.6853185,30.4526157 59.6853129,30.4526268 59.6852724,30.4526177 59.6852659,30.4525671 59.6852621,30.452555 59.6852672,30.4525419 59.6853075)', 'way', 871154702, '{"landuse": "flowerbed"}', '{8114975144,8114975145,8114975146,8114975147,8114975148,8114975149,8114975150,8114975151,8114975144}'),
('SRID=4326;LINESTRING(30.4526478 59.6852554,30.4526557 59.6852612,30.452739 59.6852678,30.4527533 59.685262,30.452765 59.685222,30.4527443 59.68522,30.4527459 59.685216,30.452673 59.6852102,30.4526587 59.6852148,30.4526478 59.6852554)', 'way', 871154706, '{"landuse": "flowerbed"}', '{8114975172,8114975173,8114975174,8114975175,8114975176,8114975177,8114975178,8114975179,8114975180,8114975172}'),
('SRID=4326;LINESTRING(30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)', 'way', 872998899, '{"landuse": "flowerbed"}', '{8129422266,8129422267,8129422268,8129422269,8129422270,8129422271,8129422272,8895996472,8129422273,8895996471,8129422266}'),
('SRID=4326;LINESTRING(30.4536402 59.684764,30.4536193 59.6847624,30.4536067 59.6847614)', 'way', 891865282, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{1635198216,1198356775,8289295975}'),
('SRID=4326;LINESTRING(30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232)', 'way', 922841960, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824024,1653641402,8566824025,8566824026}'),
('SRID=4326;LINESTRING(30.453531 59.6847593,30.4531199 59.6847256)', 'way', 922854851, '{"height": "8", "natural": "tree_row", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{5002059748,5002059751}'),
('SRID=4326;LINESTRING(30.4526262 59.684701,30.452599 59.6846895)', 'way', 922854852, '{"highway": "steps"}', '{7927774427,3968068677}'),
('SRID=4326;LINESTRING(30.4536067 59.6847614,30.4535894 59.6847601)', 'way', 922854853, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{8289295975,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4526552 59.6847274,30.4526587 59.6847165,30.4528767 59.6847343,30.4528732 59.6847452,30.4526552 59.6847274)))', 'way', 871154684, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531197 59.6851398,30.4531205 59.6851349,30.4531241 59.6851304,30.4531325 59.6851257,30.4531378 59.6851238,30.4531466 59.6851223,30.4531559 59.6851221,30.453165 59.6851233,30.453173 59.6851256,30.4531795 59.685129,30.4531835 59.6851328,30.4531855 59.685137,30.4531853 59.6851413,30.4531829 59.6851454,30.4531786 59.6851491,30.4531713 59.6851525,30.4531634 59.6851545,30.4531533 59.6851554,30.4531431 59.6851547,30.4531339 59.6851525,30.4531264 59.6851489,30.4531217 59.6851446,30.4531197 59.6851398)))', 'way', 871154688, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531682 59.6850102,30.4531694 59.6850057,30.453173 59.6850015,30.4531787 59.684998,30.4531868 59.6849952,30.4531962 59.6849937,30.453206 59.6849937,30.4532145 59.684995,30.453222 59.6849973,30.4532281 59.6850005,30.4532323 59.6850046,30.4532341 59.6850091,30.4532335 59.6850137,30.4532298 59.6850185,30.4532234 59.6850226,30.4532151 59.6850253,30.4532056 59.6850267,30.4531956 59.6850267,30.4531843 59.6850246,30.4531752 59.6850205,30.45317 59.6850157,30.4531682 59.6850102)))', 'way', 871154691, '{"highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526095 59.6853751,30.4526225 59.6853328,30.4526348 59.6853281,30.4527195 59.685334,30.4527302 59.6853414,30.4527175 59.6853841,30.4527025 59.6853899,30.4526201 59.6853832,30.4526095 59.6853751)))', 'way', 871154699, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526283 59.6853139,30.4526398 59.6852734,30.4526535 59.6852686,30.4527368 59.6852749,30.4527467 59.6852817,30.4527358 59.6853225,30.4527215 59.6853281,30.4526382 59.6853213,30.4526283 59.6853139)))', 'way', 871154701, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525419 59.6853075,30.452555 59.6852672,30.4525671 59.6852621,30.4526177 59.6852659,30.4526268 59.6852724,30.4526157 59.6853129,30.4526031 59.6853185,30.4525505 59.6853142,30.4525419 59.6853075)))', 'way', 871154702, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526478 59.6852554,30.4526587 59.6852148,30.452673 59.6852102,30.4527459 59.685216,30.4527443 59.68522,30.452765 59.685222,30.4527533 59.685262,30.452739 59.6852678,30.4526557 59.6852612,30.4526478 59.6852554)))', 'way', 871154706, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525308 59.6853272,30.4525479 59.6853207,30.452602 59.6853253,30.4526097 59.6853317,30.4525977 59.6853735,30.4525857 59.6853804,30.4525671 59.6853795,30.452562 59.6853695,30.4525568 59.6853608,30.4525449 59.685344,30.4525308 59.6853272)))', 'way', 872998899, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;LINESTRING(30.4521596 59.6854203,30.4524943 59.6854502)', 'way', 961421780, '{"highway": "footway", "surface": "fine_gravel"}', '{8893386627,4912270255}'),
('SRID=4326;LINESTRING(30.4533818 59.6852214,30.4533763 59.68521)', 'way', 961717566, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053598,1439053596}'),
('SRID=4326;LINESTRING(30.4534979 59.6851951,30.4535038 59.6852069)', 'way', 961717567, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053589,1439053591}'),
('SRID=4326;LINESTRING(30.4533763 59.68521,30.4534979 59.6851951)', 'way', 961717568, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053596,1439053589}'),
('SRID=4326;LINESTRING(30.4527378 59.6852117,30.4526559 59.6852052,30.4525684 59.6851982,30.4524641 59.6851898,30.4522584 59.6851734)', 'way', 961717569, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975842,8895975876,8895975873,8895975858,3968068679}'),
('SRID=4326;LINESTRING(30.4530032 59.685292,30.453022 59.6852839,30.4530407 59.6852758,30.4530635 59.68527,30.4530877 59.685267,30.4531091 59.6852663,30.4531333 59.6852683,30.4531547 59.6852744,30.45322 59.6852491)', 'way', 961717570, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975875,8895975856,8895975855,8895975850,8895975854,8895975853,8895975852,8895975851,3968068669}'),
('SRID=4326;LINESTRING(30.4524419 59.6852441,30.452456 59.6851977,30.4524483 59.6851915,30.4523702 59.6851856,30.4523568 59.6851898,30.4523826 59.6852055,30.4524088 59.6852218,30.4524248 59.6852328,30.4524419 59.6852441)', 'way', 961717571, '{"landuse": "flowerbed"}', '{8895975865,8895975864,8895975863,8895975862,8895975859,8895975861,8895975860,8895975838,8895975865}'),
('SRID=4326;LINESTRING(30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946)', 'way', 961717572, '{"landuse": "flowerbed"}', '{8895975872,8895975871,8895975870,8895975869,8895975868,8895975867,8895975866,8895975872}'),
('SRID=4326;LINESTRING(30.4530263 59.6852336,30.4530032 59.685292,30.4529231 59.6852858,30.4527793 59.6852746,30.452638 59.6852636,30.4525513 59.6852568,30.4524466 59.6852487,30.4524641 59.6851898)', 'way', 961717573, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975857,8895975875,8895975843,8895975844,8895975848,8895975846,8895975874,8895975858}'),
('SRID=4326;LINESTRING(30.4529402 59.6852275,30.4529231 59.6852858,30.4529053 59.6853463,30.4528865 59.6854078)', 'way', 961717574, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975877,8895975843,8895975880,8895975878}'),
('SRID=4326;LINESTRING(30.4526559 59.6852052,30.452638 59.6852636,30.4526195 59.6853238,30.4526009 59.6853847,30.4527422 59.6853961,30.4528865 59.6854078)', 'way', 961717575, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975876,8895975848,8895975849,8895975879,8895975847,8895975878}'),
('SRID=4326;LINESTRING(30.4525684 59.6851982,30.4525513 59.6852568,30.4525338 59.685317,30.4526195 59.6853238,30.4527609 59.6853349,30.4529053 59.6853463)', 'way', 961717576, '{"access": "private", "highway": "footway", "surface": "fine_gravel", "historic": "yes"}', '{8895975873,8895975846,8895975881,8895975849,8895975845,8895975880}'),
('SRID=4326;LINESTRING(30.4527487 59.6852082,30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082)', 'way', 961717577, '{"landuse": "flowerbed"}', '{8895975885,8895975884,8895975883,8895975882,8895975885}'),
('SRID=4326;LINESTRING(30.4532064 59.6852443,30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443)', 'way', 961717578, '{"landuse": "flowerbed"}', '{8895975889,8895975888,8895975887,8895975886,8895975889}'),
('SRID=4326;LINESTRING(30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696)', 'way', 961717579, '{"landuse": "flowerbed"}', '{8895975901,8895975902,8895975900,8895975903,8895975891,8895975890,8895975901}'),
('SRID=4326;LINESTRING(30.4530554 59.6852658,30.4530414 59.6852392,30.453028 59.6852429,30.4530143 59.6852802,30.4530288 59.6852733,30.453041 59.6852693,30.4530554 59.6852658)', 'way', 961717580, '{"landuse": "flowerbed"}', '{8895975898,8895975895,8895975896,8895975907,8895975897,8895975906,8895975898}'),
('SRID=4326;LINESTRING(30.4530632 59.6852641,30.4530782 59.6852621,30.4530921 59.6852616,30.4531031 59.6852618,30.4531172 59.6852446,30.4530501 59.6852392,30.4530632 59.6852641)', 'way', 961717581, '{"landuse": "flowerbed"}', '{8895975905,8895975899,8895975904,8895975892,8895975893,8895975894,8895975905}'),
('SRID=4326;LINESTRING(30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204)', 'way', 961717582, '{"height": "7", "barrier": "fence", "fence_type": "bars", "min_height": "6"}', '{1439053627,8914843793,8895996425,8914843794,1439053619}'),
('SRID=4326;LINESTRING(30.4525812 59.6854845,30.4526564 59.6854895)', 'way', 961717593, '{"height": "2", "barrier": "fence", "material": "stone", "fence_type": "bars", "min_height": "1"}', '{8895996555,1439053669}'),
('SRID=4326;LINESTRING(30.4527747 59.6854387,30.4528506 59.685445,30.4528681 59.6854402,30.4528755 59.6854172,30.4528654 59.6854091,30.4527852 59.6854026,30.4527687 59.6854078,30.4527618 59.6854305,30.4527747 59.6854387)', 'way', 961717594, '{"landuse": "flowerbed"}', '{8895996465,8895996464,8895996463,8895996462,8895996461,8895996460,8895996459,8895996458,8895996465}'),
('SRID=4326;LINESTRING(30.4525201 59.6853123,30.4525328 59.6853069,30.4525442 59.6852666,30.4525351 59.6852597,30.4524557 59.6852538,30.4524775 59.6852724,30.4524969 59.6852906,30.4525201 59.6853123)', 'way', 961717595, '{"landuse": "flowerbed"}', '{8895996470,8895996469,8895996468,8895996467,8895996466,8895996428,8895996429,8895996470}'),
('SRID=4326;LINESTRING(30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969,30.4523418 59.6851889)', 'way', 961717596, '{"landuse": "grass"}', '{8895996495,8895975839,8895996483,8895996484,8895996485,8895996486,8895996487,8895996488,8895996489,8895996490,8895996491,8895996492,8895996493,8895996494,8895996496,8895996473,8895996479,8895996480,8895996474,8895996509,8895996508,8895996507,8895996506,8895996505,8895996504,8895996503,8895996502,8895996501,8895996500,8895996499,8895996498,8895996497,8895996478,8895996495}'),
('SRID=4326;LINESTRING(30.4523081 59.6852118,30.4522803 59.6851945,30.4522795 59.6852157,30.4523143 59.6852356,30.4523427 59.6852536,30.4523628 59.6852673,30.4523827 59.6852816,30.4524087 59.6853027,30.4524225 59.6853163,30.4524411 59.6853354,30.452454 59.6853507,30.452466 59.6853657,30.4524751 59.6853808,30.4524839 59.6853973,30.4524918 59.6854125,30.4524982 59.6854272,30.452501 59.6854325,30.4525097 59.6854362,30.4525224 59.6854348,30.4525257 59.6854303,30.4525231 59.6854242,30.4525171 59.6854097,30.4525091 59.6853943,30.4525002 59.6853776,30.4524909 59.685362,30.4524785 59.6853465,30.4524653 59.6853309,30.4524465 59.6853116,30.4524322 59.6852976,30.4524056 59.685276,30.4523853 59.6852614,30.4523649 59.6852475,30.4523362 59.6852293,30.4523081 59.6852118)', 'way', 961717597, '{"landuse": "grass"}', '{8895996522,8895996477,8895996536,8895996524,8895996525,8895996526,8895996527,8895996528,8895996529,8895996530,8895996531,8895996532,8895996533,8895996534,8895996535,8895996537,8895996482,8895996476,8895996481,8895996523,8895996475,8895996521,8895996520,8895996519,8895996518,8895996517,8895996516,8895996515,8895996514,8895996513,8895996512,8895996511,8895996510,8895996522}'),
('SRID=4326;LINESTRING(30.4526076 59.685425,30.4526842 59.6854313,30.4527032 59.6854269,30.4527112 59.6854034,30.4527003 59.6853955,30.4526196 59.6853891,30.4526042 59.6853942,30.4525975 59.6854176,30.4526076 59.685425)', 'way', 961717598, '{"landuse": "flowerbed"}', '{8895996545,8895996544,8895996543,8895996542,8895996541,8895996540,8895996539,8895996538,8895996545}'),
('SRID=4326;LINESTRING(30.4528639 59.685494,30.4528702 59.6854731,30.4527911 59.6854671,30.4527849 59.685488,30.4528639 59.685494)', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996549,8895996548,8895996547,8895996546,8895996549}'),
('SRID=4326;LINESTRING(30.4526433 59.6854773,30.4526495 59.6854564,30.4525705 59.6854504,30.4525642 59.6854713,30.4526433 59.6854773)', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996553,8895996552,8895996551,8895996550,8895996553}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528709 59.6855164)', 'way', 961717601, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,8895996554}'),
('SRID=4326;LINESTRING(30.4529138 59.6853368,30.4529235 59.6853445,30.4529678 59.6853472,30.4529853 59.6853413,30.4529963 59.6853005,30.4529866 59.6852936,30.4529427 59.6852903,30.4529263 59.6852951,30.4529138 59.6853368)', 'way', 961717602, '{"landuse": "flowerbed"}', '{8895996564,8895996563,8895996562,8895996561,8895996560,8895996559,8895996558,8895996557,8895996564}'),
('SRID=4326;LINESTRING(30.452933 59.6852753,30.4529441 59.6852838,30.4529886 59.6852873,30.453002 59.6852821,30.4530171 59.6852433,30.4530088 59.6852371,30.4529582 59.685233,30.4529444 59.6852374,30.452933 59.6852753)', 'way', 961717603, '{"landuse": "flowerbed"}', '{8895996572,8895996571,8895996570,8895996569,8895996568,8895996567,8895996566,8895996565,8895996572}'),
('SRID=4326;LINESTRING(30.4525595 59.6852465,30.4525692 59.6852544,30.4526207 59.6852585,30.4526333 59.6852538,30.452645 59.6852146,30.4526353 59.6852076,30.4525847 59.6852036,30.4525709 59.685208,30.4525595 59.6852465)', 'way', 961717604, '{"landuse": "flowerbed"}', '{8895996580,8895996579,8895996578,8895996577,8895996576,8895996575,8895996574,8895996573,8895996580}'),
('SRID=4326;LINESTRING(30.452817 59.6852667,30.4528288 59.6852748,30.4529066 59.6852809,30.45292 59.6852751,30.4529319 59.6852358,30.4529216 59.6852291,30.452851 59.685224,30.4528493 59.6852281,30.452831 59.6852267,30.452817 59.6852667)', 'way', 961717605, '{"landuse": "flowerbed"}', '{8895996589,8895996588,8895996587,8895996586,8895996585,8895996584,8895996581,8895996583,8895996582,8895996589}'),
('SRID=4326;LINESTRING(30.4527946 59.6853272,30.4528053 59.6853349,30.4528878 59.6853416,30.4529031 59.6853359,30.4529154 59.6852941,30.4529042 59.6852874,30.4528247 59.6852816,30.4528087 59.6852864,30.4527946 59.6853272)', 'way', 961717606, '{"landuse": "flowerbed"}', '{8895996597,8895996596,8895996595,8895996594,8895996593,8895996592,8895996591,8895996590,8895996597}'),
('SRID=4326;LINESTRING(30.4527745 59.6853889,30.4527865 59.6853969,30.4528677 59.6854032,30.4528839 59.6853982,30.4528953 59.6853552,30.4528845 59.6853477,30.4528052 59.6853419,30.4527899 59.6853454,30.4527745 59.6853889)', 'way', 961717607, '{"landuse": "flowerbed"}', '{8895996605,8895996604,8895996603,8895996602,8895996601,8895996600,8895996599,8895996598,8895996605}'),
('SRID=4326;LINESTRING(30.452565 59.6854206,30.4525598 59.6854071,30.4525516 59.6853892,30.4525422 59.6853716,30.4525319 59.6853544,30.4525184 59.6853376,30.4525045 59.6853211,30.4524848 59.6853009,30.4524693 59.6852857,30.4524408 59.6852624,30.4524192 59.685247,30.4523979 59.6852324,30.4523685 59.6852137,30.4523402 59.6851962)', 'way', 961717608, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996623,8895996621,8895996620,8895996619,8895996618,8895996617,8895996616,8895996615,8895996614,8895996613,8895996612,8895996611,8895996610,8895996622}'),
('SRID=4326;LINESTRING(30.4525109 59.6854262,30.4525044 59.6854114,30.4524965 59.6853961,30.4524877 59.6853796,30.4524784 59.6853642,30.4524662 59.6853489,30.4524532 59.6853335,30.4524345 59.6853143,30.4524204 59.6853005,30.4523942 59.6852791,30.452374 59.6852647,30.4523538 59.6852509,30.4523252 59.6852327,30.4522972 59.6852153)', 'way', 961717609, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8895996637,8895996635,8895996634,8895996633,8895996632,8895996631,8895996630,8895996629,8895996628,8895996627,8895996626,8895996625,8895996624,8895996636}'),
('SRID=4326;LINESTRING(30.4523179 59.6852068,30.4522881 59.6851891,30.4522584 59.6851734,30.4522785 59.6851511,30.4525958 59.6847532,30.4529382 59.6847803,30.4535778 59.6848316)', 'way', 961717610, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975114,8895996608,3968068679,8114975109,8114975051,8114975050,8114975049}'),
('SRID=4326;LINESTRING(30.4527224 59.6854618,30.4527166 59.6854798)', 'way', 961717612, '{"highway": "steps", "incline": "up", "surface": "paving_stones"}', '{1664064412,8895996662}'),
('SRID=4326;LINESTRING(30.4534116 59.6851536,30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536)', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249763,8899249762,8899249761,8899249760,8899249759,8899249763}'),
('SRID=4326;LINESTRING(30.4535137 59.6851734,30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437)', 'way', 962062988, '{"source:taxon": "board"}', '{8899249777,8899249776,8899249775,8899249774}'),
('SRID=4326;LINESTRING(30.4534505 59.6851512,30.4535484 59.6848425)', 'way', 962062989, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.5", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8899249781,8899249780}'),
('SRID=4326;LINESTRING(30.4532761 59.6852013,30.4533137 59.6852128,30.453319 59.6851999,30.4533257 59.6851898,30.4533338 59.6851796,30.4533458 59.6851715,30.4533606 59.6851647,30.453378 59.6851586,30.4533941 59.6851559,30.4533211 59.6851024,30.4533083 59.6851038,30.4532761 59.6852013)', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249792,8899249791,8899249790,8899249789,8899249788,8899249787,8899249786,8899249785,8899249784,8899249783,8899249782,8899249792}'),
('SRID=4326;LINESTRING(30.4534315 59.6851615,30.4534654 59.685163)', 'way', 962062991, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975036,3968068687}'),
('SRID=4326;LINESTRING(30.45277 59.6851675,30.4528221 59.6849965,30.4528061 59.6849952,30.4528148 59.6849678,30.4528309 59.6849691,30.4528877 59.684789)', 'way', 962062992, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "source:taxon": "board", "species:wikidata": "Q162750"}', '{8899249807,8899249801,8899249800,8899249799,8899249798,8899249806}'),
('SRID=4326;LINESTRING(30.4530825 59.6850727,30.4530768 59.6850789,30.4531357 59.6851196,30.4531475 59.6851179,30.4531599 59.6851179,30.4531731 59.6851201,30.4531813 59.685123,30.4532721 59.6850914,30.45327 59.6850856,30.4530825 59.6850727)', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899249816,8899249815,8899249814,8899249813,8899249812,8899249811,8899249810,8899249809,8899249808,8899249816}'),
('SRID=4326;LINESTRING(30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148)', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299126,8899299125,8899299124,8899299123,8899299122,8899299121,8899299120,8899299119,8899299118,8899299117,8899299126}'),
('SRID=4326;LINESTRING(30.4531566 59.6851458,30.4531627 59.6851441,30.4531665 59.6851411,30.4531672 59.6851376,30.4531645 59.6851343,30.4531591 59.685132,30.4531523 59.6851313,30.4531455 59.6851322,30.4531404 59.6851346,30.4531381 59.685138,30.4531391 59.6851415,30.4531433 59.6851444,30.4531496 59.6851459,30.4531566 59.6851458)', 'way', 962062995, '{"landuse": "grass"}', '{8899299139,8899299138,8899299137,8899299136,8899299135,8899299134,8899299133,8899299132,8899299131,8899299130,8899299129,8899299128,8899299140,8899299139}'),
('SRID=4326;LINESTRING(30.4531836 59.6851532,30.45325 59.6851972,30.4532587 59.6851977,30.4532923 59.6851023,30.4532804 59.6850981,30.4531914 59.68513,30.4531946 59.6851353,30.453195 59.6851401,30.4531936 59.6851444,30.45319 59.6851488,30.4531836 59.6851532)', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299150,8899299149,8899299141,8899299148,8899299142,8899299147,8899299146,8899299145,8899299144,8899299143,8899299150}'),
('SRID=4326;LINESTRING(30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8899299158,8899299157,8899299156,8899299155,8899299154,8899299153,8899299152,8899299151,8899249778,8899299158}'),
('SRID=4326;LINESTRING(30.4532162 59.6852145,30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145)', 'way', 962062998, '{"landuse": "grass"}', '{8899299165,8899299164,8899299163,8899299161,8899299160,8899299162,8899299165}'),
('SRID=4326;LINESTRING(30.4532627 59.6852077,30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077)', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', '{8902082028,8902082027,8902082026,8902082025,8902082024,8902082023,8902082022,8902082021,8902082020,8902027911,8902082019,8902082018,8902082017,8902027912,8902027916,8902027913,8902027915,8902027914,8902082028}'),
('SRID=4326;LINESTRING(30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082032,8902082031,8902082030,8902082029,8902082032}'),
('SRID=4326;LINESTRING(30.4529465 59.6849826,30.4530583 59.6849454,30.4530566 59.6849397,30.4529452 59.6849315,30.4529338 59.6849691,30.4529492 59.6849698,30.4529465 59.6849826)', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082038,8902082037,8902082036,8902082035,8902082034,8902082033,8902082038}'),
('SRID=4326;LINESTRING(30.4530344 59.685052,30.4530456 59.6850508,30.4530757 59.684955,30.4530662 59.6849507,30.4529465 59.6849918,30.4530344 59.685052)', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082047,8902082046,8902082045,8902082044,8902082043,8902082047}'),
('SRID=4326;LINESTRING(30.4529083 59.6850544,30.4530153 59.6850613,30.4530221 59.685056,30.4529398 59.6850009,30.4529378 59.6850121,30.4529184 59.6850114,30.4529083 59.6850544)', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082054,8902082053,8902082052,8902082051,8902082050,8902082049,8902082054}'),
('SRID=4326;LINESTRING(30.4528875 59.6851184,30.4530138 59.6850731,30.4530125 59.6850679,30.4529043 59.6850625,30.4528875 59.6851184)', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082059,8902082058,8902082057,8902082056,8902082059}'),
('SRID=4326;LINESTRING(30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789)', 'way', 962382766, '{"landuse": "grass"}', '{8902082065,8902082064,8902082063,8902082062,8902082065}'),
('SRID=4326;LINESTRING(30.4529896 59.6851748,30.4530072 59.6851719,30.4530311 59.6850841,30.4530206 59.6850798,30.4528885 59.6851275,30.4529896 59.6851748)', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082070,8902082069,8902082068,8902082067,8902082066,8902082070}'),
('SRID=4326;LINESTRING(30.4533332 59.6850719,30.4534612 59.68503,30.4533655 59.6849715,30.4533546 59.6849733,30.4533227 59.6850682,30.4533332 59.6850719)', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082080,8902082079,8902082078,8902082077,8902082076,8902082080}'),
('SRID=4326;LINESTRING(30.4533437 59.685083,30.4534444 59.6850899,30.4534619 59.6850382,30.4533411 59.685078,30.4533437 59.685083)', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082084,8902082083,8902082082,8902082081,8902082084}'),
('SRID=4326;LINESTRING(30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173)', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082090,8902082089,8902082088,8902082087,8902082086,8902082085,8902082090}'),
('SRID=4326;LINESTRING(30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113)', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082096,8902082095,8902082094,8902082093,8902082092,8902082091,8902082096}'),
('SRID=4326;LINESTRING(30.4532258 59.6849527,30.4532116 59.6849902,30.4532207 59.684992,30.4532298 59.6849953,30.4533219 59.6849634,30.4533191 59.6849588,30.4532258 59.6849527)', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082102,8902082101,8902082100,8902082099,8902082098,8902082097,8902082102}'),
('SRID=4326;LINESTRING(30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082108,8902082107,8902082106,8902082105,8902082104,8902082103,8902082108}'),
('SRID=4326;LINESTRING(30.4530763 59.6850024,30.4531619 59.6850065,30.4531647 59.6850018,30.4531695 59.6849976,30.4531032 59.6849548,30.453091 59.6849565,30.4530763 59.6850024)', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082109,8902082114,8902082113,8902082112,8902082111,8902082110,8902082109}'),
('SRID=4326;LINESTRING(30.4530716 59.6850547,30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547)', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082120,8902082119,8902082118,8902082117,8902082116,8902082115,8902082120}'),
('SRID=4326;LINESTRING(30.4531735 59.6850722,30.4531863 59.6850287,30.4531799 59.6850271,30.4531749 59.6850252,30.4530791 59.6850599,30.453083 59.685065,30.4531735 59.6850722)', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082126,8902082125,8902082124,8902082123,8902082122,8902082121,8902082126}'),
('SRID=4326;LINESTRING(30.4531903 59.6850727,30.4532727 59.6850781,30.4532816 59.6850715,30.4532223 59.6850274,30.453211 59.6850297,30.453201 59.6850303,30.4531903 59.6850727)', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', '{8902082132,8902082131,8902082130,8902082129,8902082128,8902082127,8902082132}'),
('SRID=4326;LINESTRING(30.453206 59.6849937,30.4532201 59.6849487)', 'way', 962382778, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975081,8902082149}'),
('SRID=4326;LINESTRING(30.4532335 59.6850137,30.4533306 59.6850189)', 'way', 962382779, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975086,8902082150}'),
('SRID=4326;LINESTRING(30.4531682 59.6850102,30.4530675 59.6850048)', 'way', 962382780, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975094,8902082151}'),
('SRID=4326;LINESTRING(30.4531253 59.6850083,30.4531256 59.6850158,30.4531288 59.6850232,30.4531349 59.6850302,30.4531434 59.6850364,30.4531543 59.6850416,30.4531669 59.6850457,30.4531809 59.6850485,30.4531957 59.6850498,30.4532107 59.6850496,30.4532253 59.685048,30.4532391 59.685045,30.4532514 59.6850406,30.4532618 59.6850352,30.4532699 59.6850288,30.4532753 59.6850217,30.4532779 59.6850143,30.4532776 59.6850067,30.4532744 59.6849993,30.4532684 59.6849924,30.4532598 59.6849862,30.453249 59.6849809,30.4532363 59.6849768,30.4532224 59.6849741,30.4532076 59.6849728,30.4531926 59.6849729,30.4531779 59.6849745,30.4531642 59.6849776,30.4531519 59.6849819,30.4531415 59.6849874,30.4531334 59.6849938,30.4531279 59.6850008,30.4531253 59.6850083)', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8902082167,8902082134,8902082166,8902082133,8902082165,8902082148,8902082164,8902082147,8902082163,8902082146,8902082162,8902082145,8902082161,8902082144,8902082160,8902082143,8902082159,8902082142,8902082158,8902082141,8902082157,8902082140,8902082156,8902082139,8902082155,8902082138,8902082154,8902082137,8902082153,8902082136,8902082152,8902082135,8902082167}'),
('SRID=4326;LINESTRING(30.4531956 59.6850267,30.4531801 59.6850762)', 'way', 962382782, '{"highway": "footway", "surface": "fine_gravel"}', '{8114975091,8902082168}'),
('SRID=4326;LINESTRING(30.452898 59.6850578,30.4529124 59.6850066,30.4529307 59.6850078,30.4529356 59.6849912,30.4529412 59.6849735,30.4529245 59.6849722,30.4529389 59.6849276)', 'way', 962382783, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582241,1738381535,8902082040,8902082170,8902082039,8902082169,1665582237}'),
('SRID=4326;LINESTRING(30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877)', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992660,8904992659,8904992658,8904992657,8904992656,8904992655,8904992654,8904992653,8904992652,8904992651,8904992650,8904992649,8904992648,8904992647,8904992646,8904992645,8904992644,8904992643,8904992642,8904992641,8904992640,8904992639,8904992660}'),
('SRID=4326;LINESTRING(30.4532432 59.6848971,30.4532493 59.6848954,30.4532531 59.6848924,30.4532538 59.6848889,30.4532511 59.6848856,30.4532457 59.6848833,30.4532389 59.6848826,30.4532321 59.6848835,30.453227 59.684886,30.4532247 59.6848893,30.4532257 59.6848928,30.4532299 59.6848957,30.4532362 59.6848972,30.4532432 59.6848971)', 'way', 962678726, '{"landuse": "grass"}', '{8904992673,8904992672,8904992671,8904992670,8904992669,8904992668,8904992667,8904992666,8904992665,8904992664,8904992663,8904992662,8904992661,8904992673}'),
('SRID=4326;LINESTRING(30.4530998 59.6849248,30.4531105 59.684928,30.4532056 59.6848974,30.4532029 59.6848932,30.4532023 59.6848877,30.4532043 59.6848829,30.4532098 59.6848776,30.4531384 59.6848341,30.4531253 59.6848349,30.4530998 59.6849248)', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992682,8904992681,8904992680,8904992679,8904992637,8904992678,8904992677,8904992676,8904992675,8904992682}'),
('SRID=4326;LINESTRING(30.4530724 59.6849262,30.4530868 59.6849239,30.4531127 59.6848333,30.4531034 59.6848301,30.4529683 59.6848711,30.4530724 59.6849262)', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992687,8904992686,8904992685,8904992684,8904992683,8904992687}'),
('SRID=4326;LINESTRING(30.4530589 59.6849341,30.4530633 59.6849302,30.452961 59.6848772,30.4529482 59.6849246,30.4530589 59.6849341)', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992691,8904992690,8904992689,8904992688,8904992691}'),
('SRID=4326;LINESTRING(30.4531212 59.684939,30.4533222 59.6849516,30.4533269 59.6849477,30.4532581 59.6849071,30.4532455 59.6849087,30.4532339 59.6849085,30.4532243 59.684907,30.4532133 59.6849034,30.4531185 59.6849335,30.4531212 59.684939)', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8904992699,8904992698,8904992697,8904992696,8904992692,8904992638,8904992695,8904992694,8904992693,8904992699}'),
('SRID=4326;LINESTRING(30.453536 59.6848401,30.4529797 59.6847958,30.452977 59.6848046,30.4535329 59.6848493,30.453536 59.6848401)', 'way', 962714214, '{"landuse": "flowerbed"}', '{8905335420,8905335419,8905335418,8905335417,8905335420}'),
('SRID=4326;LINESTRING(30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335435,8905335434,8905335433,8905335432,8905335435}'),
('SRID=4326;LINESTRING(30.4533819 59.6849565,30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565)', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335439,8905335438,8905335437,8905335436,8905335439}'),
('SRID=4326;LINESTRING(30.4533623 59.6849431,30.4533739 59.6849464,30.4534994 59.6849065,30.4534038 59.6848537,30.4533921 59.6848545,30.4533623 59.6849431)', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335444,8905335443,8905335442,8905335441,8905335440,8905335444}'),
('SRID=4326;LINESTRING(30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335454,8905335453,8905335452,8905335451,8905335450,8905335449,8905335448,8905335447,8905335446,8905335454}'),
('SRID=4326;LINESTRING(30.4529663 59.6848632,30.4530962 59.6848253,30.4530928 59.6848201,30.4529831 59.6848107,30.4529663 59.6848632)', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335458,8905335457,8905335456,8905335455,8905335458}'),
('SRID=4326;LINESTRING(30.4532195 59.6848732,30.4532263 59.6848712,30.4532379 59.6848698,30.4532504 59.6848704,30.4532619 59.6848729,30.4532706 59.684876,30.4533642 59.6848467,30.4533614 59.6848416,30.453158 59.6848262,30.4531503 59.6848308,30.4532195 59.6848732)', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8905335467,8905335466,8905335465,8905335464,8905335463,8905335462,8905335461,8905335445,8905335460,8905335459,8905335467}'),
('SRID=4326;LINESTRING(30.4532684 59.6848807,30.4533888 59.6848413)', 'way', 962714221, '{"highway": "footway", "surface": "fine_gravel"}', '{8904992654,1665582235}'),
('SRID=4326;LINESTRING(30.4531238 59.6848204,30.4532177 59.684877)', 'way', 962714222, '{"highway": "footway", "surface": "fine_gravel"}', '{1665582234,8904992660}'),
('SRID=4326;LINESTRING(30.4527677 59.6846399,30.4528579 59.6846477)', 'way', 962735606, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8905543613,1198356896}'),
('SRID=4326;LINESTRING(30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399)', 'way', 962735608, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8566824026,1198356935,8566824027,8905543613}'),
('SRID=4326;LINESTRING(30.4534851 59.684767,30.4534913 59.6847521,30.4534976 59.6847368)', 'way', 962735609, '{"highway": "steps"}', '{8905543614,12023732271,7927774425}'),
('SRID=4326;LINESTRING(30.4529562 59.6847243,30.4529615 59.6847082,30.4529628 59.6847041)', 'way', 962735610, '{"highway": "steps"}', '{8905543615,12023732270,3968068678}'),
('SRID=4326;LINESTRING(30.4526304 59.6847065,30.4525958 59.6847532)', 'way', 962735611, '{"highway": "footway", "surface": "fine_gravel"}', '{8905543616,8114975051}'),
('SRID=4326;LINESTRING(30.4528676 59.6847547,30.4526341 59.6847357,30.452631 59.6847454,30.4528645 59.6847644,30.4528676 59.6847547)', 'way', 962735612, '{"landuse": "grass"}', '{8905558220,8905558219,8905558218,8905558217,8905558220}'),
('SRID=4326;LINESTRING(30.4535589 59.6848104,30.4530176 59.6847681,30.4530149 59.6847769,30.4535559 59.6848195,30.4535589 59.6848104)', 'way', 962735613, '{"landuse": "grass"}', '{8905558224,8905558223,8905558222,8905558221,8905558224}'),
('SRID=4326;LINESTRING(30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573,30.4530182 59.6847465)', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', '{8905558227,8905558226,8906857476,8906857475,8905558227}'),
('SRID=4326;LINESTRING(30.4523152 59.6851448,30.4526116 59.6847664)', 'way', 962869359, '{"genus": "Prunus", "taxon": "Prunus virginiana", "height": "1.7", "barrier": "hedge", "genus:ru": "Черёмуха", "taxon:ru": "Черёмуха виргинская", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857452,8906857451}'),
('SRID=4326;LINESTRING(30.4526277 59.6846803,30.4526365 59.6846782,30.4526406 59.6846738,30.4526381 59.684669,30.4526302 59.6846662,30.4526205 59.6846666,30.4526137 59.6846701,30.4526128 59.684675,30.4526184 59.684679,30.4526277 59.6846803)', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', '{8906857461,8906857453,8906857460,8906857459,8906857458,8906857457,8906857456,8906857455,8906857454,8906857461}'),
('SRID=4326;LINESTRING(30.4535863 59.6847456,30.4535811 59.6847595)', 'way', 962869365, '{"height": "2", "barrier": "fence", "ref:okn": "781610399040356", "historic": "yes", "man_made": "embankment"}', '{8906857470,8289295976}'),
('SRID=4326;MULTIPOLYGON(((30.4513 59.6845239,30.4513105 59.6845148,30.4513253 59.6844972,30.4513336 59.6844848,30.4513473 59.6844699,30.4513568 59.6844555,30.4513653 59.6844381,30.4513738 59.6844262,30.4513936 59.6844093,30.4514013 59.6843976,30.4514225 59.6843888,30.4514444 59.6843812,30.4514614 59.6843629,30.4514704 59.6843445,30.4514736 59.6843262,30.4514828 59.6842988,30.4514912 59.6842865,30.4514975 59.6842799,30.4515117 59.6842705,30.4515428 59.6842625,30.4516031 59.6842549,30.4518408 59.6843394,30.4519523 59.6843794,30.4520216 59.6844035,30.4520874 59.6844268,30.4521402 59.684444,30.4521943 59.6844606,30.452244 59.6844736,30.4522939 59.6844865,30.4523452 59.6844991,30.4524113 59.6845149,30.4524654 59.6845284,30.4525244 59.6845406,30.4525539 59.6845467,30.452566 59.6845558,30.452571 59.6845656,30.4525675 59.6845745,30.4525615 59.68459,30.4525618 59.6845988,30.4525613 59.6846073,30.4525568 59.6846156,30.4525466 59.6846232,30.4525331 59.6846279,30.4525251 59.684634,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4521768 59.6852884,30.4521573 59.685297,30.4521207 59.6853099,30.4520859 59.6853167,30.4520483 59.6853214,30.4520121 59.6853235,30.4519679 59.6853228,30.4519209 59.685316,30.4518731 59.6853033,30.4518364 59.6852869,30.4518016 59.6852646,30.4517747 59.6852436,30.4517546 59.685224,30.4517399 59.685205,30.4517278 59.6851773,30.4517104 59.6851603,30.4516916 59.6851468,30.4516857 59.6851285,30.4516903 59.6851123,30.4517117 59.6851023,30.4517426 59.685094,30.4517784 59.6850892,30.4518103 59.6850908,30.4518403 59.6851005,30.4518731 59.6850949,30.4518771 59.6850809,30.4518692 59.685051,30.4518777 59.6850294,30.4519043 59.6850131,30.4519376 59.6850028,30.4519737 59.684999,30.4520079 59.6849997,30.4520477 59.685012,30.4520887 59.6850223,30.4521435 59.6850216,30.4521948 59.6850093,30.4522112 59.6849969,30.4522301 59.6849727,30.45222 59.6849586,30.4521979 59.6849496,30.4521524 59.6849328,30.452119 59.6849135,30.452105 59.6848849,30.4521099 59.684868,30.4520932 59.684849,30.4520658 59.6848372,30.4520255 59.6848223,30.4520099 59.6848104,30.4519866 59.6847939,30.4519651 59.6847718,30.4519517 59.6847501,30.4519518 59.6847258,30.4519545 59.6847041,30.4519786 59.6846635,30.4520121 59.6846479,30.452051 59.6846256,30.4520604 59.6846161,30.4520537 59.6846046,30.4520175 59.6845829,30.4519692 59.6845613,30.451933 59.684566,30.4519102 59.6845748,30.4518928 59.6845917,30.4518772 59.6846127,30.4518697 59.684638,30.4518561 59.6846587,30.4518347 59.6846794,30.4518136 59.6846859,30.451785 59.6846963,30.4517612 59.6847117,30.4517363 59.6847257,30.4517004 59.6847328,30.4516678 59.6847376,30.4516243 59.6847395,30.4515783 59.6847426,30.4515624 59.6847383,30.451536 59.6847319,30.4515265 59.6847207,30.4515128 59.6847092,30.4515012 59.6846991,30.4514963 59.6846932,30.4515039 59.6846846,30.4515091 59.6846707,30.4515006 59.6846638,30.4514837 59.6846584,30.4514488 59.6846536,30.4514298 59.6846424,30.4514235 59.6846339,30.451434 59.6846216,30.451452 59.6846104,30.4514721 59.684604,30.4514816 59.6845934,30.4514827 59.6845827,30.4514763 59.6845715,30.4514427 59.6845604,30.4514004 59.6845719,30.4513792 59.6845708,30.451356 59.684566,30.4513317 59.6845601,30.4513137 59.6845489,30.4513042 59.6845393,30.4513 59.6845239)))', 'relation', 12444790, '{"natural": "wood", "leaf_type": "mixed", "leaf_cycle": "mixed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523568 59.6851898,30.4523702 59.6851856,30.4524483 59.6851915,30.452456 59.6851977,30.4524419 59.6852441,30.4524248 59.6852328,30.4524088 59.6852218,30.4523826 59.6852055,30.4523568 59.6851898)))', 'way', 961717571, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524524 59.6852459,30.4524673 59.6851987,30.4524824 59.6851946,30.4525509 59.6852001,30.4525595 59.685207,30.4525499 59.6852458,30.4525356 59.685252,30.4524524 59.6852459)))', 'way', 961717572, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523303 59.6851757,30.452333 59.6851663,30.4527521 59.6851991,30.4527487 59.6852082,30.4523303 59.6851757)))', 'way', 961717577, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528543 59.6852169,30.452857 59.6852074,30.4532097 59.6852351,30.4532064 59.6852443,30.4528543 59.6852169)))', 'way', 961717578, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531109 59.6852622,30.4531259 59.6852456,30.4532017 59.6852514,30.4531538 59.6852696,30.4531388 59.6852648,30.4531262 59.6852629,30.4531109 59.6852622)))', 'way', 961717579, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6852802,30.453028 59.6852429,30.4530414 59.6852392,30.4530554 59.6852658,30.453041 59.6852693,30.4530288 59.6852733,30.4530143 59.6852802)))', 'way', 961717580, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530501 59.6852392,30.4531172 59.6852446,30.4531031 59.6852618,30.4530921 59.6852616,30.4530782 59.6852621,30.4530632 59.6852641,30.4530501 59.6852392)))', 'way', 961717581, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.4531138 59.6852988,30.4530897 59.6853096,30.4530682 59.6853211,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168)))', 'relation', 12935642, '{"height": "6", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530106 59.6853114,30.4530161 59.6853019,30.4530244 59.6852922,30.4530375 59.685285,30.4530534 59.685278,30.4530732 59.685274,30.4530931 59.6852723,30.4531124 59.685272,30.4531329 59.6852751,30.4531443 59.685278,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530111 59.6853217,30.4530106 59.6853114)))', 'relation', 12922491, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530012 59.685359,30.4529724 59.685378,30.4529542 59.6853912,30.4529312 59.685409,30.4529136 59.685403)))', 'relation', 12935641, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527618 59.6854305,30.4527687 59.6854078,30.4527852 59.6854026,30.4528654 59.6854091,30.4528755 59.6854172,30.4528681 59.6854402,30.4528506 59.685445,30.4527747 59.6854387,30.4527618 59.6854305)))', 'way', 961717594, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524557 59.6852538,30.4525351 59.6852597,30.4525442 59.6852666,30.4525328 59.6853069,30.4525201 59.6853123,30.4524969 59.6852906,30.4524775 59.6852724,30.4524557 59.6852538)))', 'way', 961717595, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523226 59.6851969,30.4523418 59.6851889,30.4523598 59.6851989,30.4523808 59.6852109,30.4524103 59.6852297,30.4524317 59.6852443,30.4524536 59.68526,30.4524825 59.6852834,30.4524981 59.6852989,30.4525179 59.6853192,30.452532 59.6853359,30.4525456 59.6853529,30.4525561 59.6853703,30.4525656 59.6853881,30.4525739 59.6854062,30.4525791 59.6854198,30.4525811 59.6854262,30.452574 59.6854304,30.4525626 59.6854314,30.4525546 59.6854286,30.4525509 59.6854228,30.4525457 59.6854094,30.4525376 59.6853916,30.4525283 59.6853742,30.4525181 59.6853572,30.4525048 59.6853406,30.452491 59.6853243,30.4524715 59.6853042,30.4524562 59.6852892,30.452428 59.6852663,30.4524066 59.6852509,30.4523855 59.6852365,30.4523561 59.6852179,30.4523226 59.6851969)))', 'way', 961717596, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522795 59.6852157,30.4522803 59.6851945,30.4523081 59.6852118,30.4523362 59.6852293,30.4523649 59.6852475,30.4523853 59.6852614,30.4524056 59.685276,30.4524322 59.6852976,30.4524465 59.6853116,30.4524653 59.6853309,30.4524785 59.6853465,30.4524909 59.685362,30.4525002 59.6853776,30.4525091 59.6853943,30.4525171 59.6854097,30.4525231 59.6854242,30.4525257 59.6854303,30.4525224 59.6854348,30.4525097 59.6854362,30.452501 59.6854325,30.4524982 59.6854272,30.4524918 59.6854125,30.4524839 59.6853973,30.4524751 59.6853808,30.452466 59.6853657,30.452454 59.6853507,30.4524411 59.6853354,30.4524225 59.6853163,30.4524087 59.6853027,30.4523827 59.6852816,30.4523628 59.6852673,30.4523427 59.6852536,30.4523143 59.6852356,30.4522795 59.6852157)))', 'way', 961717597, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525975 59.6854176,30.4526042 59.6853942,30.4526196 59.6853891,30.4527003 59.6853955,30.4527112 59.6854034,30.4527032 59.6854269,30.4526842 59.6854313,30.4526076 59.685425,30.4525975 59.6854176)))', 'way', 961717598, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527849 59.685488,30.4527911 59.6854671,30.4528702 59.6854731,30.4528639 59.685494,30.4527849 59.685488)))', 'way', 961717599, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525642 59.6854713,30.4525705 59.6854504,30.4526495 59.6854564,30.4526433 59.6854773,30.4525642 59.6854713)))', 'way', 961717600, '{"genus": "Syrínga", "taxon": "Syringa meyeri", "natural": "scrub", "genus:ru": "Сирень", "taxon:ru": "Сирень Мейера", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529138 59.6853368,30.4529263 59.6852951,30.4529427 59.6852903,30.4529866 59.6852936,30.4529963 59.6853005,30.4529853 59.6853413,30.4529678 59.6853472,30.4529235 59.6853445,30.4529138 59.6853368)))', 'way', 961717602, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452933 59.6852753,30.4529444 59.6852374,30.4529582 59.685233,30.4530088 59.6852371,30.4530171 59.6852433,30.453002 59.6852821,30.4529886 59.6852873,30.4529441 59.6852838,30.452933 59.6852753)))', 'way', 961717603, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525595 59.6852465,30.4525709 59.685208,30.4525847 59.6852036,30.4526353 59.6852076,30.452645 59.6852146,30.4526333 59.6852538,30.4526207 59.6852585,30.4525692 59.6852544,30.4525595 59.6852465)))', 'way', 961717604, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452817 59.6852667,30.452831 59.6852267,30.4528493 59.6852281,30.452851 59.685224,30.4529216 59.6852291,30.4529319 59.6852358,30.45292 59.6852751,30.4529066 59.6852809,30.4528288 59.6852748,30.452817 59.6852667)))', 'way', 961717605, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527946 59.6853272,30.4528087 59.6852864,30.4528247 59.6852816,30.4529042 59.6852874,30.4529154 59.6852941,30.4529031 59.6853359,30.4528878 59.6853416,30.4528053 59.6853349,30.4527946 59.6853272)))', 'way', 961717606, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527745 59.6853889,30.4527899 59.6853454,30.4528052 59.6853419,30.4528845 59.6853477,30.4528953 59.6853552,30.4528839 59.6853982,30.4528677 59.6854032,30.4527865 59.6853969,30.4527745 59.6853889)))', 'way', 961717607, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533349 59.6850974,30.4533424 59.6850906,30.4534424 59.6850974,30.453427 59.6851532,30.4534116 59.6851536,30.4533349 59.6850974)))', 'way', 962062985, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534909 59.6851715,30.4535 59.6851418,30.4535229 59.6851437,30.4535137 59.6851734,30.4534909 59.6851715)))', 'relation', 12925809, '{"crop": "grape", "genus": "Vitis", "taxon": "Vitis amurensis", "landuse": "vineyard", "genus:ru": "Виноград", "taxon:ru": "Виноград амурский"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532761 59.6852013,30.4533083 59.6851038,30.4533211 59.6851024,30.4533941 59.6851559,30.453378 59.6851586,30.4533606 59.6851647,30.4533458 59.6851715,30.4533338 59.6851796,30.4533257 59.6851898,30.453319 59.6851999,30.4533137 59.6852128,30.4532761 59.6852013)))', 'way', 962062990, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530768 59.6850789,30.4530825 59.6850727,30.45327 59.6850856,30.4532721 59.6850914,30.4531813 59.685123,30.4531731 59.6851201,30.4531599 59.6851179,30.4531475 59.6851179,30.4531357 59.6851196,30.4530768 59.6850789)))', 'way', 962062993, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530252 59.6851728,30.4530493 59.6850863,30.4530634 59.6850845,30.4531219 59.6851249,30.4531169 59.6851285,30.4531133 59.6851328,30.4531117 59.6851378,30.4531125 59.6851429,30.4531159 59.685148,30.4530357 59.6851757,30.4530252 59.6851728)))', 'way', 962062994, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531381 59.685138,30.4531404 59.6851346,30.4531455 59.6851322,30.4531523 59.6851313,30.4531591 59.685132,30.4531645 59.6851343,30.4531672 59.6851376,30.4531665 59.6851411,30.4531627 59.6851441,30.4531566 59.6851458,30.4531496 59.6851459,30.4531433 59.6851444,30.4531391 59.6851415,30.4531381 59.685138)))', 'way', 962062995, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531836 59.6851532,30.45319 59.6851488,30.4531936 59.6851444,30.453195 59.6851401,30.4531946 59.6851353,30.4531914 59.68513,30.4532804 59.6850981,30.4532923 59.6851023,30.4532587 59.6851977,30.45325 59.6851972,30.4531836 59.6851532)))', 'way', 962062996, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530454 59.6851813,30.4531256 59.6851544,30.4531347 59.6851575,30.4531466 59.6851595,30.4531581 59.6851596,30.4531699 59.6851581,30.4532258 59.6851962,30.4532198 59.6852006,30.4530501 59.6851877,30.4530454 59.6851813)))', 'way', 962062997, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528382 59.6851861,30.4528402 59.6851794,30.452846 59.6851798,30.4528466 59.6851777,30.4532188 59.6852056,30.4532162 59.6852145,30.4528382 59.6851861)))', 'way', 962062998, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528577 59.6851769,30.4529093 59.6850046,30.4529281 59.685006,30.4529375 59.6849752,30.4529207 59.6849738,30.4529724 59.6848063,30.4535349 59.6848517,30.4534357 59.6851637,30.4534213 59.6851644,30.4534075 59.6851668,30.4533894 59.6851708,30.4533747 59.6851759,30.4533579 59.6851844,30.4533479 59.6851932,30.4533405 59.6852038,30.4533345 59.6852155,30.4533291 59.6852257,30.4532627 59.6852077,30.4528577 59.6851769)))', 'way', 962382760, '{"ref": "6", "name": "Ботанический сад", "leisure": "garden", "name:en": "The Botanical Garden", "wikidata": "Q118122045", "garden:type": "botanical"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533751 59.6849668,30.453381 59.6849616,30.4534833 59.6849698,30.4534679 59.6850219,30.4533751 59.6849668)))', 'way', 962382761, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529338 59.6849691,30.4529452 59.6849315,30.4530566 59.6849397,30.4530583 59.6849454,30.4529465 59.6849826,30.4529492 59.6849698,30.4529338 59.6849691)))', 'way', 962382762, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529465 59.6849918,30.4530662 59.6849507,30.4530757 59.684955,30.4530456 59.6850508,30.4530344 59.685052,30.4529465 59.6849918)))', 'way', 962382763, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529083 59.6850544,30.4529184 59.6850114,30.4529378 59.6850121,30.4529398 59.6850009,30.4530221 59.685056,30.4530153 59.6850613,30.4529083 59.6850544)))', 'way', 962382764, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528875 59.6851184,30.4529043 59.6850625,30.4530125 59.6850679,30.4530138 59.6850731,30.4528875 59.6851184)))', 'way', 962382765, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528698 59.6851739,30.4528812 59.685135,30.4529823 59.6851789,30.4529779 59.6851826,30.4528698 59.6851739)))', 'way', 962382766, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528885 59.6851275,30.4530206 59.6850798,30.4530311 59.6850841,30.4530072 59.6851719,30.4529896 59.6851748,30.4528885 59.6851275)))', 'way', 962382767, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533227 59.6850682,30.4533546 59.6849733,30.4533655 59.6849715,30.4534612 59.68503,30.4533332 59.6850719,30.4533227 59.6850682)))', 'way', 962382768, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533411 59.685078,30.4534619 59.6850382,30.4534444 59.6850899,30.4533437 59.685083,30.4533411 59.685078)))', 'way', 962382769, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532321 59.6850233,30.4532368 59.6850199,30.4532392 59.6850173,30.4533204 59.6850217,30.4533057 59.6850665,30.4532939 59.6850677,30.4532321 59.6850233)))', 'way', 962382770, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532374 59.6850005,30.4533289 59.6849694,30.4533388 59.6849721,30.4533251 59.6850146,30.4532419 59.6850113,30.4532411 59.6850057,30.4532374 59.6850005)))', 'way', 962382771, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532116 59.6849902,30.4532258 59.6849527,30.4533191 59.6849588,30.4533219 59.6849634,30.4532298 59.6849953,30.4532207 59.684992,30.4532116 59.6849902)))', 'way', 962382772, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453114 59.6849505,30.4531198 59.684945,30.4532124 59.6849517,30.4532004 59.6849896,30.4531904 59.6849904,30.45318 59.6849928,30.453114 59.6849505)))', 'way', 962382773, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530763 59.6850024,30.453091 59.6849565,30.4531032 59.6849548,30.4531695 59.6849976,30.4531647 59.6850018,30.4531619 59.6850065,30.4530763 59.6850024)))', 'way', 962382774, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530603 59.6850515,30.4530743 59.6850085,30.4531615 59.6850116,30.4531626 59.685015,30.4531656 59.685019,30.4530716 59.6850547,30.4530603 59.6850515)))', 'way', 962382775, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530791 59.6850599,30.4531749 59.6850252,30.4531799 59.6850271,30.4531863 59.6850287,30.4531735 59.6850722,30.453083 59.685065,30.4530791 59.6850599)))', 'way', 962382776, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531903 59.6850727,30.453201 59.6850303,30.453211 59.6850297,30.4532223 59.6850274,30.4532816 59.6850715,30.4532727 59.6850781,30.4531903 59.6850727)))', 'way', 962382777, '{"genus": "Rosa", "taxon": "Rosa spinosissima", "natural": "scrub", "genus:ru": "Роза", "taxon:ru": "Роза колючейшая", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "source:taxon": "board"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531253 59.6850083,30.4531279 59.6850008,30.4531334 59.6849938,30.4531415 59.6849874,30.4531519 59.6849819,30.4531642 59.6849776,30.4531779 59.6849745,30.4531926 59.6849729,30.4532076 59.6849728,30.4532224 59.6849741,30.4532363 59.6849768,30.453249 59.6849809,30.4532598 59.6849862,30.4532684 59.6849924,30.4532744 59.6849993,30.4532776 59.6850067,30.4532779 59.6850143,30.4532753 59.6850217,30.4532699 59.6850288,30.4532618 59.6850352,30.4532514 59.6850406,30.4532391 59.685045,30.4532253 59.685048,30.4532107 59.6850496,30.4531957 59.6850498,30.4531809 59.6850485,30.4531669 59.6850457,30.4531543 59.6850416,30.4531434 59.6850364,30.4531349 59.6850302,30.4531288 59.6850232,30.4531256 59.6850158,30.4531253 59.6850083)))', 'way', 962382781, '{"genus": "Tilia", "height": "6", "natural": "tree_row", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453207 59.6848903,30.4532078 59.6848854,30.4532114 59.6848808,30.4532177 59.684877,30.4532251 59.6848743,30.4532339 59.6848728,30.4532432 59.6848726,30.4532523 59.6848737,30.4532603 59.6848761,30.4532684 59.6848807,30.4532708 59.6848832,30.4532728 59.6848874,30.4532726 59.6848917,30.4532702 59.6848959,30.4532659 59.6848995,30.4532598 59.6849025,30.4532507 59.684905,30.4532406 59.6849059,30.4532304 59.6849052,30.4532212 59.6849029,30.453213 59.6848988,30.453209 59.6848951,30.453207 59.6848903)))', 'way', 962678725, '{"highway": "footway", "surface": "fine_gravel"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532247 59.6848893,30.453227 59.684886,30.4532321 59.6848835,30.4532389 59.6848826,30.4532457 59.6848833,30.4532511 59.6848856,30.4532538 59.6848889,30.4532531 59.6848924,30.4532493 59.6848954,30.4532432 59.6848971,30.4532362 59.6848972,30.4532299 59.6848957,30.4532257 59.6848928,30.4532247 59.6848893)))', 'way', 962678726, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530998 59.6849248,30.4531253 59.6848349,30.4531384 59.6848341,30.4532098 59.6848776,30.4532043 59.6848829,30.4532023 59.6848877,30.4532029 59.6848932,30.4532056 59.6848974,30.4531105 59.684928,30.4530998 59.6849248)))', 'way', 962678727, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529683 59.6848711,30.4531034 59.6848301,30.4531127 59.6848333,30.4530868 59.6849239,30.4530724 59.6849262,30.4529683 59.6848711)))', 'way', 962678728, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529482 59.6849246,30.452961 59.6848772,30.4530633 59.6849302,30.4530589 59.6849341,30.4529482 59.6849246)))', 'way', 962678729, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531185 59.6849335,30.4532133 59.6849034,30.4532243 59.684907,30.4532339 59.6849085,30.4532455 59.6849087,30.4532581 59.6849071,30.4533269 59.6849477,30.4533222 59.6849516,30.4531212 59.684939,30.4531185 59.6849335)))', 'way', 962678730, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452977 59.6848046,30.4529797 59.6847958,30.453536 59.6848401,30.4535329 59.6848493,30.452977 59.6848046)))', 'way', 962714214, '{"landuse": "flowerbed"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534135 59.68485,30.4534175 59.684847,30.4535189 59.6848554,30.4535068 59.684899,30.4534135 59.68485)))', 'way', 962714215, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533809 59.6849511,30.4535014 59.6849122,30.4534847 59.684964,30.4533819 59.6849565,30.4533809 59.6849511)))', 'way', 962714216, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533623 59.6849431,30.4533921 59.6848545,30.4534038 59.6848537,30.4534994 59.6849065,30.4533739 59.6849464,30.4533623 59.6849431)))', 'way', 962714217, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532695 59.6849025,30.4532754 59.6848982,30.4532786 59.6848938,30.4532796 59.6848892,30.4532772 59.6848818,30.4533702 59.6848509,30.4533788 59.6848538,30.4533512 59.6849423,30.4533368 59.6849437,30.4532695 59.6849025)))', 'way', 962714218, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529663 59.6848632,30.4529831 59.6848107,30.4530928 59.6848201,30.4530962 59.6848253,30.4529663 59.6848632)))', 'way', 962714219, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4531503 59.6848308,30.453158 59.6848262,30.4533614 59.6848416,30.4533642 59.6848467,30.4532706 59.684876,30.4532619 59.6848729,30.4532504 59.6848704,30.4532379 59.6848698,30.4532263 59.6848712,30.4532195 59.6848732,30.4531503 59.6848308)))', 'way', 962714220, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452631 59.6847454,30.4526341 59.6847357,30.4528676 59.6847547,30.4528645 59.6847644,30.452631 59.6847454)))', 'way', 962735612, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530149 59.6847769,30.4530176 59.6847681,30.4535589 59.6848104,30.4535559 59.6848195,30.4530149 59.6847769)))', 'way', 962735613, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530143 59.6847573,30.4530182 59.6847465,30.4535658 59.6847921,30.4535618 59.6848022,30.4530143 59.6847573)))', 'way', 962735614, '{"genus": "Cotoneaster", "taxon": "Cotoneaster lucidus", "height": "0.5", "barrier": "hedge", "landuse": "grass", "genus:ru": "Кизильник", "taxon:ru": "Кизильник блестящий", "leaf_type": "broadleaved", "leaf_cycle": "deciduous", "species:ru": "Кизильник блестящий", "species:wikidata": "Q162750"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523152 59.6851448,30.4526116 59.6847664,30.4528877 59.684789,30.4528309 59.6849691,30.4528148 59.6849678,30.4528061 59.6849952,30.4528221 59.6849965,30.45277 59.6851675,30.4527658 59.68518,30.4523152 59.6851448)))', 'relation', 12933782, '{"ref": "5", "name": "Кенконс", "genus": "Tilia", "name:en": "The Quincunx", "natural": "wood", "genus:ru": "Липа", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526128 59.684675,30.4526137 59.6846701,30.4526205 59.6846666,30.4526302 59.6846662,30.4526381 59.684669,30.4526406 59.6846738,30.4526365 59.6846782,30.4526277 59.6846803,30.4526184 59.684679,30.4526128 59.684675)))', 'way', 962869361, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526042 59.6846709,30.4526082 59.6846655,30.452617 59.6846635,30.4528469 59.6846817,30.452843 59.684694,30.4528376 59.6847122,30.4526498 59.6846973,30.4526123 59.6846817,30.4526042 59.6846709)))', 'relation', 12933783, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530629 59.6847308,30.4530706 59.6847131,30.4530752 59.684699,30.4535863 59.6847456,30.4535811 59.6847595,30.4535752 59.6847748,30.4530629 59.6847308)))', 'relation', 12933784, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4534977 59.6852035,30.4534967 59.6852111,30.453492 59.6852191,30.4534813 59.6852261,30.4534692 59.6852309,30.4534524 59.6852342,30.453435 59.6852355,30.4534193 59.6852337,30.4534045 59.6852307,30.4533914 59.6852248,30.4533831 59.6852182,30.4533763 59.68521,30.4533752 59.6852006)))', 'relation', 12935640, '{"height": "5.5", "roof:shape": "pyramidal", "roof:colour": "#DADDE2", "roof:height": "0.5", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4526773 59.6854805,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.4527511 59.6854859,30.4526773 59.6854805)))', 'relation', 12987950, '{"height": "1", "roof:shape": "skillion", "roof:colour": "grey", "roof:height": "1", "building:part": "yes", "roof:direction": "170", "building:colour": "#E4C78F", "roof:orientation": "along"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4526773 59.6854805,30.4527511 59.6854859,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528709 59.6855164,30.4527091 59.6855042,30.4525787 59.6854944)))', 'relation', 12935639, '{"height": "1", "roof:shape": "flat", "roof:colour": "grey", "building:part": "yes", "building:colour": "#E4C78F"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4524973 59.6846698,30.4526025 59.6847092,30.4522278 59.6851794,30.4522474 59.6851858,30.4522167 59.6853009,30.4522119 59.6853269,30.4521905 59.6853763,30.4521596 59.6854203,30.4521293 59.6854701,30.4520946 59.6855262,30.4520624 59.6855804,30.4520524 59.6856064,30.452047 59.6856386,30.452047 59.6856666,30.4520551 59.685713,30.4520778 59.685798,30.4520997 59.6858613,30.4521127 59.6859046,30.4521047 59.6859432,30.4520825 59.6859825,30.4520478 59.686026,30.4520492 59.6860479,30.4520658 59.6860755,30.4520819 59.6860924,30.4521387 59.6861383,30.4521581 59.6861556,30.4521822 59.6861782,30.45222 59.6862149,30.4522535 59.6862461,30.4522676 59.6862668,30.4522828 59.6862897,30.4522911 59.6863104,30.4522992 59.6863312,30.4523018 59.6863618,30.4522989 59.6863961,30.4522911 59.6864255,30.452286 59.6864496,30.4522787 59.6864747,30.4522743 59.6864925,30.452274 59.6865148,30.4522776 59.6865312,30.4522888 59.6865538,30.4523045 59.686573,30.4523226 59.6865862,30.4523413 59.6865954,30.4523836 59.686613,30.4524214 59.6866244,30.4524614 59.686634,30.4524912 59.6866392,30.4525264 59.6866438,30.4525641 59.6866457,30.4526585 59.6866455,30.4527524 59.6866414,30.4528825 59.6866353,30.4530173 59.6866255,30.4531259 59.6866181,30.4531936 59.6866133,30.453271 59.6866114,30.4533083 59.686614,30.4534028 59.6866228,30.4535229 59.6866363,30.4536201 59.6866455,30.453691 59.6866508,30.4536976 59.6866508,30.4539823 59.6866673,30.4539778 59.6866919,30.4544217 59.6867427,30.4544227 59.6867377,30.4544646 59.686742,30.4544638 59.6867472,30.4545508 59.6867576,30.4545534 59.6867525,30.4545963 59.6867573,30.4546214 59.6867604,30.4546788 59.6867553,30.4548168 59.686752,30.4551163 59.6867835,30.4552388 59.6868093,30.4553945 59.6868602,30.455491 59.6869022,30.4555769 59.68694,30.4556466 59.6869672,30.4557807 59.6870023,30.4558987 59.6870186,30.4559816 59.68702,30.4560875 59.6870601,30.4561508 59.6871091,30.4561831 59.6871675,30.456183 59.687235,30.4561616 59.6872894,30.4561159 59.6873352,30.4560824 59.6873697,30.4560436 59.6874139,30.4560113 59.687453,30.4559765 59.6875127,30.4559804 59.6875356,30.4559953 59.6875601,30.4560395 59.6875816,30.4560838 59.6875938,30.4561467 59.6876019,30.4561991 59.6876021,30.4563573 59.6875979,30.4565289 59.6875961,30.4566782 59.6875933,30.4567611 59.687592,30.4568899 59.687586,30.4570005 59.6875828,30.4570995 59.6875755,30.4572099 59.6875697,30.4573214 59.6875781,30.4574243 59.6875895,30.4575564 59.6876086,30.4576489 59.6876236,30.4577906 59.6876357,30.4578929 59.687656,30.4579737 59.6876911,30.4580413 59.6877282,30.4581225 59.6877678,30.4581817 59.6878027,30.4582341 59.6878291,30.4583152 59.6878863,30.4583478 59.6879193,30.4583877 59.6879673,30.458411 59.6880122,30.4584387 59.6880452,30.4584657 59.6880811,30.4585427 59.6881373,30.4585748 59.6881735,30.4586375 59.6882236,30.4586938 59.6882576,30.4587833 59.6883125,30.45884 59.6883434,30.4588959 59.6883741,30.4589723 59.6884163,30.4590175 59.6884495,30.4590717 59.6884887,30.4591366 59.6885238,30.4591908 59.6885653,30.4592104 59.6886013,30.4592312 59.6886474,30.4592494 59.6886943,30.4592859 59.6887303,30.4593172 59.688773,30.4593556 59.6888131,30.459429 59.6888677,30.459467 59.6889042,30.4594979 59.688929,30.4595172 59.6889694,30.4595266 59.6890044,30.4595285 59.689042,30.4595248 59.6890919,30.4595255 59.6891719,30.4595317 59.6892178,30.4595442 59.6893129,30.4595387 59.689363,30.4595118 59.6894235,30.4594761 59.689469,30.4594014 59.6895068,30.4593069 59.6895588,30.4592476 59.6895966,30.4591945 59.6896312,30.4591511 59.6896562,30.4591092 59.6896944,30.4590843 59.6897378,30.4590826 59.689771,30.4590853 59.6898069,30.4591078 59.6898435,30.4592007 59.6898882,30.4592339 59.6899293,30.4592628 59.6899874,30.4592762 59.6900429,30.45928 59.6901025,30.4592809 59.6901575,30.4592798 59.6902243,30.4593042 59.6902777,30.4593662 59.6903178,30.4594544 59.6903409,30.4595249 59.6903674,30.4595807 59.6903944,30.4596268 59.6904316,30.4596583 59.6904756,30.4596087 59.690551,30.4596006 59.6905905,30.4595977 59.6906403,30.4595904 59.6906903,30.4595826 59.6907418,30.4595821 59.6908019,30.459583 59.6908375,30.459529 59.6908703,30.4594074 59.6909353,30.4592831 59.6909939,30.459213 59.6910431,30.4591817 59.691066,30.4591361 59.6911201,30.4591012 59.6911675,30.4591012 59.691223,30.4591406 59.6912486,30.4592295 59.6912875,30.4592895 59.6913173,30.4593728 59.6913444,30.4594455 59.6913593,30.459517 59.6913682,30.4596037 59.6913935,30.4596491 59.6914211,30.4596908 59.6914522,30.4597319 59.6914924,30.4597559 59.6915361,30.4597745 59.6915821,30.459787 59.6916313,30.4597852 59.6916643,30.4597718 59.6917238,30.4597396 59.6917861,30.4596859 59.6918429,30.4596685 59.6918693,30.4596383 59.6919054,30.4596009 59.6919405,30.4595315 59.6919991,30.4594652 59.6920502,30.4594082 59.6920946,30.4593773 59.6921151,30.4593545 59.6921348,30.4593366 59.6921529,30.4593399 59.6921734,30.4593659 59.6921939,30.4596045 59.6923272,30.4596496 59.6923362,30.4596901 59.6923377,30.4597398 59.6923315,30.4597933 59.6923156,30.4598526 59.6922792,30.4599141 59.692234,30.4600168 59.6921771,30.4600862 59.6921317,30.4601606 59.6921103,30.4602526 59.6920827,30.460323 59.6920633,30.4603814 59.6920333,30.4604812 59.6919715,30.4605362 59.6919506,30.4606073 59.6919499,30.4606743 59.6919675,30.4607467 59.6920081,30.4608017 59.6920284,30.4608728 59.6920473,30.4609935 59.6920595,30.4610726 59.692067,30.4611517 59.6920866,30.4612403 59.6921299,30.4612939 59.6921759,30.4613569 59.6922104,30.4614227 59.6922341,30.4614964 59.6922659,30.4615568 59.6923059,30.4616211 59.6923729,30.4616748 59.6924466,30.4617579 59.6925197,30.4618368 59.6925614,30.461948 59.6926074,30.4620442 59.6926525,30.4621643 59.6927115,30.4622732 59.6927583,30.4623906 59.6927971,30.4625398 59.6928238,30.4626554 59.6928355,30.4627278 59.6928346,30.4627807 59.6928331,30.4629009 59.6928193,30.4629797 59.6928093,30.4630314 59.6928086,30.4630815 59.6928162,30.4631241 59.6928309,30.4631433 59.692849,30.4631354 59.6928782,30.4630918 59.6929178,30.4629933 59.692982,30.4628509 59.6930395,30.4627989 59.693076,30.4627775 59.6931068,30.4627715 59.6931374,30.4627782 59.6931678,30.4628 59.6931938,30.462816 59.6932161,30.4628201 59.6932352,30.4628276 59.6932642,30.4628055 59.6932947,30.462749 59.6933555,30.4627356 59.6934076,30.4627544 59.6934638,30.4627866 59.6935491,30.4628348 59.6936025,30.4628814 59.6936516,30.4629464 59.6936976,30.4630181 59.6937555,30.4631033 59.6938351,30.463194 59.693908,30.4632997 59.6939707,30.4633997 59.6940315,30.4634563 59.6940722,30.4634978 59.6941112,30.4635448 59.6941433,30.4635995 59.6941633,30.4636618 59.6941785,30.4637065 59.6941778,30.4637604 59.694169,30.4638165 59.6941725,30.4638941 59.6941882,30.463945 59.6941973,30.4639826 59.6942136,30.4640155 59.6942304,30.4640341 59.6942422,30.4640539 59.694259,30.4640781 59.6942943,30.4641097 59.6943536,30.4641054 59.6943849,30.4640955 59.6944214,30.4640677 59.6944543,30.4640278 59.694509,30.4639684 59.6945921,30.4639761 59.694632,30.4640196 59.6946691,30.4640928 59.6947215,30.4641504 59.6947644,30.4642414 59.694848,30.4643013 59.6949614,30.4643265 59.6950347,30.4643629 59.6950927,30.464383 59.6951471,30.4644155 59.6951914,30.4644503 59.6952616,30.464467 59.6953187,30.4644779 59.6953885,30.4644493 59.6954307,30.4644137 59.6954645,30.4643477 59.6955048,30.4642827 59.6955528,30.4641331 59.6956106,30.4640324 59.6956546,30.4639589 59.6956973,30.4639054 59.6957548,30.4638826 59.6958068,30.4638917 59.6958626,30.4638959 59.695908,30.4638913 59.6959452,30.4638761 59.6959807,30.4638581 59.6960266,30.4638387 59.6960774,30.4638353 59.6961315,30.4638514 59.6962235,30.4639031 59.6963079,30.4639806 59.6963837,30.4640641 59.696435,30.4641563 59.6964993,30.4642492 59.6965314,30.464353 59.6965624,30.4645112 59.6966079,30.4646909 59.6966431,30.4648519 59.6966796,30.4649082 59.6966992,30.4649645 59.6967256,30.4650316 59.6967635,30.465104 59.6968014,30.4651737 59.6968352,30.4652724 59.696889,30.4653398 59.6969338,30.4653714 59.6969637,30.4653977 59.6970024,30.4654124 59.6970396,30.4654285 59.6970924,30.4654299 59.6971357,30.4654285 59.6971912,30.4654178 59.6972534,30.4654178 59.6973103,30.4654268 59.6973472,30.465443 59.6973849,30.4654739 59.6974306,30.465535 59.6974889,30.4655776 59.6975263,30.4655998 59.6975497,30.4656249 59.6975948,30.4656281 59.6976305,30.4656291 59.6976586,30.465636 59.697698,30.4656478 59.6977439,30.4656559 59.6977839,30.4656639 59.6978247,30.4656741 59.697865,30.4656808 59.6978977,30.4656931 59.6979479,30.4657242 59.6979888,30.4657651 59.6980369,30.4658049 59.6980618,30.4658569 59.6980859,30.4659085 59.6981101,30.4659691 59.6981356,30.4659934 59.6981619,30.4660187 59.6982125,30.4660434 59.6982506,30.4660765 59.6982913,30.46612 59.6983229,30.46618 59.6983645,30.4662324 59.6983954,30.466279 59.6984245,30.4663222 59.6984585,30.4663422 59.6984839,30.4663508 59.6985161,30.466347 59.6985389,30.4663297 59.6985658,30.4662984 59.6986043,30.4662667 59.6986353,30.4662287 59.6986639,30.4662098 59.6986996,30.4662023 59.698738,30.4662177 59.6987814,30.4662476 59.6988217,30.4662941 59.6988595,30.4663218 59.6988897,30.4663703 59.6989336,30.4664066 59.698983,30.4664342 59.6990318,30.46626 59.699006,30.4662245 59.6990009,30.4661986 59.6989985,30.465736 59.6989731,30.465674 59.6989864,30.4656438 59.6989955,30.4656194 59.6990058,30.4655995 59.6990178,30.4655881 59.6990296,30.4655669 59.6990522,30.4655425 59.6990838,30.4655077 59.6991223,30.4654429 59.6991855,30.4653481 59.6992218,30.4652461 59.6992516,30.4651852 59.6992621,30.4651339 59.6992648,30.4650235 59.6992651,30.4649339 59.6992741,30.4648662 59.6992863,30.4647744 59.6993078,30.4647108 59.6993347,30.4646409 59.6993755,30.4645943 59.6994397,30.4645313 59.6994729,30.464447 59.6994976,30.4643342 59.6995189,30.4641272 59.6995513,30.4601 59.6956121,30.4590933 59.6945995,30.4585195 59.6940453,30.4565283 59.6920253,30.4559963 59.6915691,30.455779 59.6913562,30.4555191 59.6911016,30.4536132 59.6892318,30.4533114 59.6893232,30.4532486 59.6892981,30.453085 59.689221,30.4529871 59.689177,30.4528879 59.6891357,30.4528128 59.6891072,30.4524488 59.6889751,30.4524008 59.688958,30.4523038 59.6889045,30.4522723 59.6888961,30.4522552 59.6888858,30.4522361 59.6888724,30.452216 59.68885,30.4521838 59.6888324,30.4521207 59.6887986,30.4520511 59.6887644,30.4518909 59.6886967,30.4517882 59.6886551,30.4516822 59.6886098,30.4515358 59.6885556,30.4514019 59.6885123,30.4513037 59.6884778,30.4512571 59.6884636,30.4512056 59.6884428,30.4511404 59.6884196,30.4510778 59.6883871,30.4510264 59.6883553,30.4509783 59.6883239,30.4508749 59.6882578,30.4508266 59.688226,30.4507678 59.6881981,30.4505943 59.6881208,30.4501869 59.6879433,30.4499736 59.6878632,30.4499334 59.6878503,30.4498881 59.687841,30.4497871 59.6878092,30.4494924 59.6876814,30.4490926 59.6875099,30.4490362 59.6874936,30.4489854 59.6874759,30.4489383 59.6874638,30.448876 59.687449,30.4487626 59.6874338,30.4486346 59.6874221,30.4485214 59.6874142,30.4483648 59.6874032,30.4474691 59.687337,30.4468361 59.6872873,30.4467403 59.6872722,30.446684 59.6872669,30.4463496 59.6872017,30.4463085 59.6871943,30.4462561 59.6871833,30.4462179 59.6871721,30.446187 59.6871613,30.4461557 59.68715,30.4461253 59.6871366,30.4461066 59.6871274,30.4460918 59.6871135,30.4460273 59.6870454,30.4459552 59.6870078,30.4459436 59.6870073,30.4459073 59.6869902,30.4458766 59.6869748,30.445846 59.6869616,30.4458216 59.6869518,30.4457961 59.6869433,30.4457578 59.6869309,30.4457123 59.6869183,30.4456647 59.6869057,30.4455949 59.6868892,30.4455514 59.68688,30.4455232 59.6868726,30.4455129 59.6868665,30.4453868 59.6868434,30.44531 59.6868381,30.4452457 59.6868322,30.44506 59.686812,30.4450028 59.6868076,30.4449557 59.6868041,30.4449237 59.6868029,30.4448943 59.6868019,30.4448734 59.6868039,30.4448512 59.6868054,30.4448212 59.6868026,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017)))', 'relation', 4187886, '{"ref": "II", "name": "Долина реки Славянки", "place": "quarter", "name:az": "Slavyanka çayının vadisi", "name:fr": "Vallée de la rivière Slavianka", "name:hy": "Սլավյանկա գետի հովիտ", "name:uk": "Долина річки Слов''янки", "name:zh": "谷斯拉维亚卡河", "boundary": "protected_area", "int_name": "Vallée de la rivière Slavianka", "wikidata": "Q121809341", "wikipedia": "ru:Павловский парк#Долина реки Славянки", "description": "Район Павловского парка"}', NULL),
('SRID=4326;LINESTRING(30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392)', 'way', 1297781094, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{8289295976,12023732271,12023732270,12023732269,8114975027,12023699867,12023732331,12023732330,12023732337,12023732336}'),
('SRID=4326;LINESTRING(30.4528746 59.6855048,30.4528788 59.6854915)', 'way', 1093902027, '{"height": "8", "barrier": "fence", "fence_type": "bars", "min_height": "6.65"}', '{1439053674,1439053668}'),
('SRID=4326;LINESTRING(30.4535894 59.6847601,30.4535811 59.6847595)', 'way', 1297781085, '{"height": "1.5", "barrier": "fence", "fence_type": "bars"}', '{12023732332,8289295976}'),
('SRID=4326;LINESTRING(30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601)', 'way', 1297781086, '{"height": "2", "barrier": "fence", "fence_type": "metal"}', '{12023732335,12023732334,12023732333,12023732332}'),
('SRID=4326;MULTIPOLYGON(((30.4519927 59.6856654,30.451993 59.6856352,30.4519974 59.6856085,30.4520057 59.6855861,30.452033 59.685533,30.4520717 59.6854725,30.4521073 59.6854196,30.4521538 59.6853554,30.4521646 59.6853419,30.4521729 59.6853289,30.4521751 59.685321,30.4521778 59.6853033,30.4521768 59.6852884,30.4522278 59.6851794,30.4522474 59.6851858,30.4522695 59.6851929,30.4522692 59.6852184,30.452307 59.6852409,30.4523333 59.6852571,30.4523534 59.6852701,30.4523836 59.685295,30.4524088 59.6853175,30.4524395 59.6853504,30.4524616 59.6853789,30.4524735 59.685401,30.4524845 59.6854195,30.4524943 59.6854502,30.452497 59.6854882,30.452346 59.6854768,30.4523217 59.6855588,30.4522802 59.6855556,30.4522258 59.6855515,30.4522191 59.6855742,30.4522002 59.685638,30.4521808 59.6857036,30.4521745 59.6857248,30.4522289 59.6857289,30.4522705 59.6857319,30.4522477 59.6858088,30.4522804 59.6858113,30.4525803 59.6858339,30.4526091 59.6858361,30.4526832 59.6858416,30.4528205 59.685852,30.4528174 59.6858982,30.4527279 59.6859036,30.4527314 59.6859191,30.4527383 59.6859422,30.4527472 59.6859643,30.4527643 59.6859927,30.4527791 59.6860133,30.4527956 59.6860336,30.4528174 59.6860572,30.4528406 59.6860793,30.4528659 59.6861008,30.4528879 59.6861175,30.4529175 59.6861373,30.4529497 59.6861561,30.4529804 59.6861727,30.4530167 59.6861897,30.4530418 59.6861992,30.4530963 59.6861616,30.4531534 59.686184,30.4531278 59.6862023,30.453137 59.6862056,30.4531608 59.6862141,30.4531704 59.6862175,30.453196 59.6861992,30.4531795 59.686249,30.4531642 59.6862975,30.453138 59.686381,30.4531363 59.6863866,30.4532826 59.6863983,30.4532725 59.6864305,30.4532916 59.686432,30.4532869 59.6864462,30.4532998 59.6864473,30.4533248 59.6864494,30.4533485 59.6864515,30.4533611 59.6864525,30.4533659 59.6864383,30.4534768 59.6864467,30.453575 59.6864544,30.4535812 59.6864636,30.4536188 59.68646,30.4536556 59.6864553,30.4536952 59.6864492,30.4537376 59.6864434,30.4537814 59.6864354,30.4538212 59.6864281,30.453863 59.6864194,30.4538817 59.6864353,30.4539287 59.6864214,30.4539454 59.6864356,30.4539576 59.686432,30.4540057 59.6864176,30.4540172 59.6864141,30.4540005 59.6863999,30.4540399 59.6863883,30.4540219 59.6863729,30.4540549 59.6863624,30.4540887 59.6863495,30.4541297 59.6863344,30.4541407 59.6863296,30.4541607 59.6863411,30.4541696 59.6863371,30.4542 59.6863235,30.4542091 59.6863195,30.4541887 59.6863078,30.4541965 59.6863041,30.4542363 59.6862844,30.4542705 59.6862654,30.4542999 59.6862773,30.4544137 59.6862059,30.4543849 59.6861942,30.4544059 59.686181,30.4544395 59.686154,30.4544728 59.6861239,30.4544964 59.6860973,30.4545494 59.6861117,30.4546053 59.6861282,30.4545922 59.6861427,30.4545784 59.6861572,30.4545449 59.6861862,30.4545138 59.6862131,30.4544576 59.6862495,30.4543906 59.6862854,30.4543294 59.6863147,30.4542746 59.6863415,30.454221 59.6863683,30.454115 59.6864133,30.454039 59.6864407,30.4539464 59.6864693,30.4539252 59.6864763,30.4538233 59.6865047,30.4536724 59.6865094,30.4536724 59.6865223,30.4536503 59.6865223,30.4535973 59.686521,30.4535465 59.6865208,30.4535021 59.6865209,30.4534712 59.6865222,30.4534473 59.6865255,30.453429 59.6865331,30.4534215 59.6865438,30.4534132 59.686574,30.4534136 59.6865866,30.453423 59.6865971,30.4534445 59.6866075,30.4534686 59.686613,30.4534579 59.6866461,30.4534073 59.6866421,30.4533332 59.6866345,30.4532837 59.6866305,30.453254 59.6866292,30.4532071 59.6866305,30.4531615 59.686632,30.4531191 59.6866347,30.4531041 59.6865988,30.4531448 59.6865925,30.4531695 59.6865869,30.4531966 59.6865772,30.4532138 59.6865676,30.4532231 59.6865589,30.453199 59.6865568,30.4531811 59.6865532,30.4531596 59.6865468,30.4531373 59.6865396,30.4531219 59.6865326,30.4530964 59.6865196,30.4530733 59.6865042,30.4530555 59.6864887,30.4530367 59.6864681,30.4530227 59.6864499,30.4530105 59.6864274,30.4530012 59.6864103,30.4529945 59.6863933,30.4529919 59.6863759,30.4529905 59.686347,30.4529907 59.6863231,30.4529911 59.6862911,30.4529891 59.686281,30.4529827 59.6862715,30.4529634 59.6862545,30.4529402 59.6862373,30.4529067 59.6862141,30.4528563 59.6861801,30.4528201 59.6861533,30.4527906 59.6861317,30.4527578 59.6861047,30.452731 59.6860823,30.4527092 59.6860609,30.4526947 59.6860457,30.4526816 59.6860278,30.4526652 59.6860011,30.4526541 59.6859782,30.4526337 59.6859283,30.4526256 59.6859159,30.4526103 59.685908,30.4525905 59.6859034,30.4525603 59.6859009,30.452391 59.6858965,30.4523675 59.6858999,30.4523504 59.685904,30.4523333 59.6859114,30.452312 59.685923,30.4522313 59.6859637,30.4521811 59.6859882,30.452085 59.686032,30.4520765 59.6860386,30.4520753 59.6860476,30.4520797 59.6860577,30.4520264 59.6860652,30.4520201 59.6860504,30.4520162 59.6860346,30.4520143 59.6860207,30.4520168 59.6860051,30.4520203 59.685989,30.4520274 59.6859769,30.4520341 59.6859612,30.4520405 59.6859506,30.452047 59.6859415,30.4520537 59.6859259,30.4520544 59.6859134,30.4520523 59.6858956,30.4520465 59.6858708,30.4520254 59.6858069,30.4519995 59.68571,30.4519927 59.6856654),(30.4521704 59.6857398,30.4521704 59.6857513,30.4521744 59.6857635,30.4521811 59.6857763,30.4521945 59.6857899,30.4522187 59.6858021,30.4522414 59.6858088,30.4522629 59.685735,30.4521731 59.6857289,30.4521704 59.6857398),(30.452226 59.6855475,30.4523159 59.6855543,30.4523387 59.6854798,30.4523212 59.6854826,30.4523011 59.6854866,30.452277 59.6854941,30.4522596 59.6855015,30.4522448 59.6855117,30.4522354 59.6855225,30.4522301 59.6855347,30.452226 59.6855475),(30.4522508 59.6858359,30.4525647 59.6858582,30.4525714 59.6858373,30.4522575 59.6858142,30.4522508 59.6858359),(30.4523249 59.685462,30.4523727 59.6854667,30.4523804 59.6854465,30.4523327 59.6854418,30.4523249 59.685462)))', 'relation', 6636677, '{"surface": "fine_gravel", "area:highway": "footway"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533763 59.68521,30.4534979 59.6851951,30.4535038 59.6852069,30.4534995 59.6852209,30.4533878 59.6852355,30.4533818 59.6852214,30.4533763 59.68521)))', 'relation', 12947389, '{"height": "6", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4523253 59.6851768,30.4523286 59.6851637,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4525881 59.6854311,30.452574 59.6853959,30.4525486 59.6853522,30.4525291 59.6853286,30.4525137 59.6853106,30.452501 59.6852981,30.4524755 59.6852751,30.452455 59.6852592,30.4524366 59.6852453,30.4524178 59.6852321,30.4523994 59.6852201,30.4523706 59.6852014,30.452339 59.6851839,30.4523253 59.6851768)))', 'relation', 5906400, '{"ref": "2", "name": "Цветочный партер", "leisure": "garden", "name:en": "The Flower Parterre", "ref:okn": "781620399040956", "alt_name": "Цветники Марии Фёдоровны", "wikidata": "Q118122045", "garden:type": "flowerbed", "garden:style": "french"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.4533268 59.6853074,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532343 59.6853363,30.453156 59.6852825)))', 'relation', 17755883, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4531158 59.6853933,30.4531719 59.6854212,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530216 59.6854636,30.4529242 59.6854401,30.4529045 59.6854337)))', 'relation', 17755885, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4532343 59.6853363,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.453238 59.6853862,30.453207 59.6854026,30.4531719 59.6854212,30.4531158 59.6853933,30.4530217 59.6853466)))', 'relation', 17755884, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4527677 59.6846399,30.4527719 59.6846286,30.4527799 59.6846212,30.4527933 59.6846157,30.4528134 59.6846137,30.4528403 59.6846144,30.4528537 59.6846178,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399)))', 'relation', 12932608, '{"natural": "scrub", "leaf_type": "broadleaved", "leaf_cycle": "deciduous"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 1721132, '{"ref": "3", "name": "Павильон Трёх граций", "note": "Геометрические теги крыши павильона размещены отдельно", "name:es": "Pabellón de las tres gracias", "name:fr": "Pavillon des Trois Grâces", "name:pt": "Pavilhão das Três Graças", "name:zh": "三美人亭", "ref:okn": "781610399040356", "tourism": "attraction", "building": "yes", "heritage": "2", "historic": "yes", "wikidata": "Q112716431", "addr:city": "Павловск", "architect": "Чарльз Камерон", "start_date": "1800", "addr:street": "Садовая улица", "architect:en": "Charles Cameron", "addr:housenumber": "20 литЧ", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6514/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12202573, '{"height": "7", "min_height": "5.5", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "1", "building:part": "yes", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452843 59.684694,30.4528469 59.6846817,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4530752 59.684699,30.4530706 59.6847131,30.4529628 59.6847041,30.452843 59.684694)))', 'relation', 12497925, '{"height": "1.5", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4525466 59.6846232,30.4525568 59.6846156,30.4525613 59.6846073,30.4525618 59.6845988,30.4525615 59.68459,30.4525675 59.6845745,30.452571 59.6845656,30.452566 59.6845558,30.4525539 59.6845467,30.4526659 59.6845694,30.4527826 59.6845897,30.4528946 59.6846069,30.4530012 59.6846212,30.4535732 59.6846878,30.4535916 59.6846905,30.453606 59.6846946,30.4536164 59.684701,30.4536208 59.6847085,30.4536214 59.684718,30.4536181 59.6847274,30.4536067 59.6847614,30.4535894 59.6847601,30.4535811 59.6847595,30.4535863 59.6847456,30.4535923 59.6847296,30.4535925 59.6847224,30.4535886 59.6847164,30.4535807 59.6847121,30.4535698 59.6847103,30.4535555 59.6847085,30.4530859 59.6846667,30.4530887 59.6846582,30.4530942 59.6846416,30.4528639 59.6846231,30.45286 59.6846392,30.4528579 59.6846477,30.4527677 59.6846399,30.4525841 59.6846239,30.4525626 59.6846222,30.4525466 59.6846232)))', 'relation', 12131779, '{"landuse": "grass"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.452047 59.6856386,30.4520524 59.6856064,30.4520624 59.6855804,30.4520946 59.6855262,30.4521293 59.6854701,30.4521596 59.6854203,30.4521905 59.6853763,30.4522119 59.6853269,30.4522167 59.6853009,30.4522474 59.6851858,30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4601554 59.6854805,30.4601767 59.6856005,30.4601793 59.6857568,30.4601468 59.6858374,30.4600081 59.6860973,30.459853 59.68614,30.459704 59.6863415,30.4596832 59.6864086,30.4596712 59.686482,30.4596638 59.6865545,30.459666 59.6866369,30.4596929 59.6867933,30.4597047 59.6868418,30.4597409 59.6869365,30.4598403 59.6871335,30.4599111 59.6872432,30.4599552 59.6873116,30.4600453 59.6874469,30.460134 59.687572,30.4600858 59.6875668,30.4600427 59.6875593,30.4599863 59.6875559,30.4598958 59.6875545,30.4597744 59.6875619,30.4597289 59.6875627,30.4596698 59.687583,30.4596323 59.6876026,30.4595974 59.6876371,30.4595625 59.6876658,30.4595236 59.6876852,30.459478 59.6876967,30.459407 59.6877062,30.4593453 59.6877028,30.4592849 59.6876838,30.4592367 59.6876553,30.4591509 59.6875883,30.4590905 59.6875599,30.4590355 59.6875424,30.4589524 59.6875261,30.4588343 59.6875105,30.4586868 59.6875038,30.4585474 59.6875038,30.4584333 59.6875086,30.4583274 59.6875126,30.4582348 59.6875193,30.4581437 59.6875301,30.4580095 59.6875505,30.4579371 59.6875654,30.4579009 59.6875782,30.4578312 59.6876019,30.4577386 59.6876249,30.4576489 59.6876236,30.4575564 59.6876086,30.4574243 59.6875895,30.4573214 59.6875781,30.4572099 59.6875697,30.4570995 59.6875755,30.4570005 59.6875828,30.4568899 59.687586,30.4567611 59.687592,30.4566782 59.6875933,30.4565289 59.6875961,30.4563573 59.6875979,30.4561991 59.6876021,30.4561467 59.6876019,30.4560838 59.6875938,30.4560395 59.6875816,30.4559953 59.6875601,30.4559804 59.6875356,30.4559765 59.6875127,30.4560113 59.687453,30.4560436 59.6874139,30.4560824 59.6873697,30.4561159 59.6873352,30.4561616 59.6872894,30.456183 59.687235,30.4561831 59.6871675,30.4561508 59.6871091,30.4560875 59.6870601,30.4559816 59.68702,30.4558987 59.6870186,30.4557807 59.6870023,30.4556466 59.6869672,30.4555769 59.68694,30.455491 59.6869022,30.4553945 59.6868602,30.4552388 59.6868093,30.4551163 59.6867835,30.4548168 59.686752,30.4546788 59.6867553,30.4546214 59.6867604,30.4545963 59.6867573,30.4545534 59.6867525,30.4545508 59.6867576,30.4544638 59.6867472,30.4544646 59.686742,30.4544227 59.6867377,30.4544217 59.6867427,30.4539778 59.6866919,30.4539823 59.6866673,30.4536976 59.6866508,30.453691 59.6866508,30.4536201 59.6866455,30.4535229 59.6866363,30.4534028 59.6866228,30.4533083 59.686614,30.453271 59.6866114,30.4531936 59.6866133,30.4531259 59.6866181,30.4530173 59.6866255,30.4528825 59.6866353,30.4527524 59.6866414,30.4526585 59.6866455,30.4525641 59.6866457,30.4525264 59.6866438,30.4524912 59.6866392,30.4524614 59.686634,30.4524214 59.6866244,30.4523836 59.686613,30.4523413 59.6865954,30.4523226 59.6865862,30.4523045 59.686573,30.4522888 59.6865538,30.4522776 59.6865312,30.452274 59.6865148,30.4522743 59.6864925,30.4522787 59.6864747,30.452286 59.6864496,30.4522911 59.6864255,30.4522989 59.6863961,30.4523018 59.6863618,30.4522992 59.6863312,30.4522911 59.6863104,30.4522828 59.6862897,30.4522676 59.6862668,30.4522535 59.6862461,30.45222 59.6862149,30.4521822 59.6861782,30.4521581 59.6861556,30.4521387 59.6861383,30.4520819 59.6860924,30.4520658 59.6860755,30.4520492 59.6860479,30.4520478 59.686026,30.4520825 59.6859825,30.4521047 59.6859432,30.4521127 59.6859046,30.4520997 59.6858613,30.4520778 59.685798,30.4520551 59.685713,30.452047 59.6856666,30.452047 59.6856386)))', 'relation', 4194432, '{"ref": "III", "name": "Придворцовый район", "place": "quarter", "name:fr": "Secteur central", "website": "https://pavlovskmuseum.ru/about/park/layout/36/", "boundary": "protected_area", "wikidata": "Q121809724", "wikipedia": "ru:Павловский парк#Центральный (Придворцовый) район", "description": "Район исторического Павловского парка"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4366882 59.6889898,30.4370373 59.6889668,30.4370736 59.6889644,30.4371138 59.6889367,30.4374634 59.6889115,30.4375002 59.6889088,30.4375427 59.6889059,30.4380171 59.6888738,30.438182 59.6888616,30.4383254 59.6888487,30.4384589 59.6888338,30.4385849 59.6888182,30.4388652 59.6887778,30.4389016 59.6887728,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346802 59.6935317,30.4346817 59.6935045,30.4346729 59.6934955,30.4346017 59.6934439,30.4344133 59.6933106,30.4344523 59.6932882,30.4344971 59.6932601,30.4345233 59.6932407,30.4345424 59.6932254,30.4345634 59.6932027,30.4345863 59.693171,30.4345979 59.6931498,30.4346066 59.6931248,30.4346128 59.6930889,30.434612 59.693054,30.4346077 59.6930245,30.4346019 59.6930124,30.4345969 59.693,30.4345757 59.6929702,30.4345621 59.6929518,30.434542 59.6929299,30.4345091 59.6928998,30.4344756 59.6928775,30.4344413 59.6928581,30.4343883 59.6928337,30.4343603 59.6928224,30.4343198 59.692809,30.4342705 59.6927958,30.4342429 59.6927909,30.4341796 59.6927811,30.4341217 59.6927737,30.4340777 59.6927708,30.4340075 59.6927673,30.4339293 59.6927692,30.4338474 59.6927768,30.433767 59.6927902,30.4337225 59.6928016,30.4335043 59.6926756,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)))', 'relation', 1721131, '{"name": "Павловский парк", "note": "https://wiki.openstreetmap.org/wiki/RU:Павловск/Павловский_парк", "leisure": "park", "name:be": "Паўлаўскі парк", "name:bg": "Павловски парк", "name:ca": "Parc Pàvlovsk", "name:en": "Pavlovsk Park", "name:es": "Parque Pávlovsk", "name:fr": "Parc de Pavlovsk", "name:he": "פארק פבלובסק", "name:hy": "Պավլովսկ պարկը", "name:nl": "Pavlovskpark", "name:ru": "Павловский парк", "name:zh": "巴甫洛夫斯克公园", "ref:okn": "781720399040986", "website": "https://pavlovskmuseum.ru/about/park/", "boundary": "protected_area", "heritage": "2", "historic": "yes", "int_name": "Parc de Pavlovsk", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q2506336", "wikipedia": "ru:Павловский парк", "fee:amount": "100", "start_date": "1777", "opening_hours": "07:00-19:00", "protect_class": "22", "operator:phone": "+7 (812) 452-15-36", "fee:conditional": "yes @ 9:00-17:00", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6407/", "operator:tourism": "museum", "operator:website": "http://www.pavlovskmuseum.ru", "protection_title": "Государственный музей-заповедник"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4324568 59.6916037,30.4324575 59.6915749,30.4324621 59.6915482,30.4324682 59.6915286,30.4324753 59.6915093,30.4324823 59.6914899,30.4324944 59.6914662,30.4325151 59.6914382,30.4329919 59.6909939,30.43335 59.690647,30.4334536 59.6905408,30.4339347 59.6900298,30.4339655 59.689999,30.4340158 59.6899496,30.4340708 59.6898981,30.4341325 59.6898423,30.4342103 59.6897817,30.4348634 59.6892971,30.4350304 59.6891847,30.4350941 59.6891512,30.4351437 59.6891282,30.4352121 59.6891005,30.4352859 59.6890795,30.4353489 59.6890653,30.4354555 59.6890493,30.4355219 59.6890436,30.4355801 59.6890388,30.4357297 59.689028,30.4358183 59.6890226,30.4358639 59.6890281,30.4359047 59.6890265,30.4359108 59.689045,30.4366128 59.6889954,30.4368674 59.6896812,30.4373083 59.6896203,30.4383622 59.6894747,30.4383925 59.6894699,30.4387768 59.6894091,30.4389533 59.6893793,30.4395631 59.6892765,30.4395975 59.6896826,30.43963 59.6897841,30.4411104 59.6895883,30.4411759 59.6892872,30.4412059 59.6891298,30.4412229 59.6890714,30.4402547 59.6891154,30.4398722 59.6891396,30.4395358 59.6891608,30.4394903 59.6891472,30.4392717 59.6889536,30.4391469 59.6889286,30.4391174 59.6889211,30.4390705 59.6889062,30.4390316 59.6888852,30.4390007 59.6888636,30.4389819 59.6888446,30.4389356 59.688768,30.4394909 59.6886943,30.4398543 59.6886325,30.4400071 59.6886046,30.4406955 59.688479,30.4408104 59.688458,30.4414068 59.6883491,30.4414241 59.6883739,30.4414406 59.6883714,30.4414646 59.6883674,30.4414905 59.688363,30.4417352 59.6883072,30.4417808 59.6882913,30.4418344 59.6882694,30.4418821 59.6882476,30.4419664 59.6882073,30.4431861 59.6875688,30.443383 59.6874657,30.4433566 59.6874537,30.4434022 59.6874298,30.4434203 59.6874209,30.4434378 59.6874131,30.4434606 59.6874073,30.4434998 59.6874019,30.4435553 59.6873939,30.4435961 59.6873824,30.4436284 59.6873671,30.4436444 59.6873558,30.4436589 59.687339,30.4436667 59.6873247,30.4436715 59.6873005,30.4436661 59.68728,30.4436564 59.6872675,30.4436464 59.687259,30.4438843 59.6871016,30.4441866 59.6869058,30.4442598 59.6869111,30.4442951 59.6869136,30.4443323 59.6869292,30.4443347 59.6869302,30.4443923 59.6869614,30.4444065 59.6869691,30.444438 59.6869552,30.4445489 59.6869077,30.444645 59.6868671,30.4446626 59.6868597,30.4446945 59.6868462,30.4446194 59.686801,30.4446175 59.6867999,30.4445818 59.68678,30.4445803 59.686779,30.4445518 59.6867606,30.4445169 59.686738,30.4444952 59.6867243,30.4444865 59.6867138,30.4444865 59.6867017,30.4444952 59.6866905,30.4445375 59.6866638,30.444687 59.6865741,30.4448347 59.6864855,30.445096 59.6863422,30.4452308 59.6862691,30.4453607 59.6861984,30.4456533 59.6860464,30.4458048 59.6859713,30.4459528 59.6859038,30.4463406 59.6857168,30.446723 59.6855342,30.447509 59.6851751,30.4477152 59.6850805,30.4478346 59.6850209,30.447946 59.6849604,30.4480438 59.684899,30.4481859 59.6848002,30.4483241 59.6846939,30.4484287 59.68461,30.4484662 59.6845826,30.4485046 59.6845589,30.4486084 59.6844949,30.4486791 59.6844562,30.4488525 59.6843737,30.4490602 59.6842836,30.449236 59.6842106,30.4493951 59.6841491,30.4494519 59.6841382,30.4495136 59.6841273,30.4496558 59.6841097,30.4498549 59.6840882,30.4498949 59.6840845,30.450264 59.6840506,30.4503834 59.6840449,30.4504672 59.684042,30.4505671 59.6840395,30.4506691 59.6840402,30.4507093 59.6840439,30.4507582 59.6840576,30.4508011 59.6840678,30.4508456 59.6840745,30.4510132 59.6840377,30.4511147 59.6840765,30.4511813 59.6841019,30.4512523 59.684129,30.4513511 59.6841667,30.4513385 59.6842533,30.4516531 59.6843525,30.4522364 59.6845601,30.4525041 59.6846527,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540811 59.684801,30.454116 59.6848031,30.4541545 59.6848057,30.4541808 59.6848075,30.4542309 59.6848107,30.4542641 59.6848127,30.4548047 59.6848466,30.4554062 59.6848883,30.4554276 59.6847972,30.4555787 59.6847942,30.4556183 59.6848013,30.45566 59.6848082,30.4556602 59.6848033,30.4557245 59.6848039,30.4557241 59.6848115,30.4558924 59.6848132,30.4558927 59.6848058,30.4559591 59.6848066,30.455968 59.6848067,30.456132 59.6848104,30.4563276 59.6848162,30.4565276 59.684828,30.4567174 59.6848433,30.4568173 59.684855,30.4569112 59.6848679,30.4569916 59.6848814,30.4570788 59.684897,30.4572191 59.6849255,30.4573068 59.6849471,30.4574034 59.6849722,30.4575415 59.6850067,30.4576796 59.6850473,30.4580243 59.6851495,30.458385 59.6852544,30.4585262 59.6852893,30.4586586 59.685316,30.4588062 59.6853451,30.4589376 59.6853682,30.4590725 59.6853866,30.4592621 59.685404,30.4596014 59.6854347,30.4597372 59.6854816,30.4597703 59.6854795,30.4598067 59.6854769,30.4598237 59.6854755,30.4598214 59.6854687,30.4598497 59.6854668,30.4598516 59.685473,30.4598851 59.6854707,30.4599237 59.6854678,30.4599217 59.6854614,30.4599499 59.6854595,30.4599522 59.6854659,30.4599714 59.6854643,30.4600087 59.6854612,30.4600147 59.6854607,30.4600534 59.6854572,30.4601985 59.6854128,30.4638062 59.6851903,30.4654915 59.6850838,30.4656498 59.6850784,30.4657732 59.6850771,30.4659129 59.6850764,30.4672032 59.6851174,30.4675083 59.6851283,30.4688128 59.6851701,30.4688678 59.6851408,30.4688852 59.6851413,30.4688871 59.6851311,30.4689262 59.6851323,30.4689682 59.6851335,30.468967 59.6851443,30.4689863 59.685145,30.4690455 59.6851751,30.4692529 59.685186,30.4712661 59.6852555,30.4717998 59.6852713,30.4721192 59.6852787,30.4728281 59.6852957,30.4729388 59.6852984,30.4730017 59.6852996,30.4730645 59.6853009,30.4731491 59.685303,30.4731729 59.6853036,30.4731946 59.6853042,30.4732094 59.6853046,30.473248 59.6853064,30.4732627 59.685307,30.4733131 59.6853083,30.4735532 59.6853155,30.4738186 59.6853234,30.4747194 59.6853502,30.4760058 59.6853884,30.4760711 59.6853899,30.4767032 59.6854063,30.4769946 59.6854145,30.4770841 59.685417,30.4772286 59.6854211,30.477324 59.6854237,30.4775836 59.6854311,30.4776272 59.6854323,30.4777058 59.6854345,30.477722 59.6854131,30.4778064 59.6854131,30.4778267 59.6854376,30.4782629 59.6854511,30.4803314 59.6855148,30.4804972 59.6855157,30.4806957 59.6855035,30.4809866 59.6854778,30.4813563 59.6854413,30.4816887 59.6854084,30.4829592 59.6852829,30.484201 59.6851595,30.4851027 59.68507,30.4856157 59.685019,30.4859321 59.6849876,30.4860003 59.6849808,30.4860486 59.6850662,30.4861646 59.6852711,30.4863078 59.6855173,30.4864369 59.6857523,30.4864761 59.6858216,30.4866222 59.6860742,30.486646 59.6861155,30.4870343 59.686796,30.4871407 59.6869901,30.4872588 59.6872054,30.4877195 59.6880454,30.487808 59.688202,30.4878204 59.6882235,30.4878635 59.6883002,30.48787 59.6883117,30.4878916 59.6883487,30.4879075 59.6883812,30.4879153 59.6883977,30.4879246 59.6884174,30.4879765 59.6885128,30.4880116 59.6885763,30.4880581 59.6885694,30.4881086 59.6885618,30.4881355 59.6885578,30.4882292 59.6885456,30.4888791 59.6896373,30.489701 59.6924953,30.4896786 59.6925163,30.4908925 59.6968416,30.4908907 59.6969219,30.4908693 59.696978,30.4908278 59.6970308,30.488341 59.6991065,30.4878952 59.6994664,30.4876552 59.6996701,30.4838245 59.7028735,30.4794807 59.706361,30.479376 59.7064476,30.4793425 59.7064936,30.479321 59.7065348,30.4793143 59.7065707,30.479136 59.7066397,30.4791105 59.7067926,30.4790216 59.7067947,30.478967 59.7068115,30.4789214 59.706846,30.4788959 59.7068683,30.4788395 59.706903,30.4787806 59.7069259,30.4787363 59.7069386,30.4786216 59.7069479,30.4779183 59.7069596,30.4736783 59.7070303,30.473675 59.7069867,30.4736739 59.7069694,30.4736706 59.7069389,30.4732464 59.7069452,30.4729689 59.7069493,30.4697965 59.7069962,30.4687773 59.7070136,30.4663413 59.7070601,30.4662337 59.7070622,30.4660736 59.7070633,30.4660557 59.707042,30.4660408 59.7070243,30.4659974 59.7069726,30.4659835 59.7069561,30.4659791 59.7069508,30.4659686 59.7069384,30.4659531 59.70692,30.4658816 59.7068348,30.4656818 59.7065821,30.4655355 59.7065546,30.4652621 59.7065033,30.4651239 59.7064784,30.4650726 59.706474,30.4650016 59.7064692,30.4645828 59.706441,30.4644927 59.7064349,30.4640497 59.7064008,30.4639779 59.7064033,30.4639163 59.7064329,30.4638698 59.7064308,30.4638303 59.7064291,30.4637599 59.7064255,30.4637148 59.7064233,30.4636972 59.706296,30.463669 59.7061547,30.4636421 59.7061131,30.4636191 59.7060776,30.4635652 59.7060291,30.4635492 59.7060147,30.4633455 59.7058911,30.4631782 59.7058035,30.4630326 59.7057228,30.4628485 59.7056506,30.4625988 59.7055749,30.4623338 59.7055117,30.462411 59.7054206,30.4625908 59.7051744,30.4627383 59.705012,30.4627387 59.7049841,30.4628295 59.7048848,30.4629347 59.7048106,30.4631495 59.7046592,30.4632413 59.7045664,30.4632815 59.7037822,30.4635147 59.7033885,30.4635704 59.7031913,30.4635837 59.7031547,30.4637313 59.7028432,30.4638334 59.7024501,30.4638456 59.7023972,30.463836 59.7023848,30.4637361 59.7022574,30.4636905 59.7022019,30.4635064 59.7019706,30.4635161 59.7019493,30.4636111 59.701924,30.463635 59.7019182,30.4637511 59.70189,30.4637308 59.7018637,30.4637092 59.7018342,30.4636851 59.701795,30.4636516 59.7017429,30.4636207 59.7016942,30.4635699 59.7016225,30.4635353 59.7015738,30.4635222 59.7014983,30.4635136 59.701428,30.4635319 59.7013361,30.463663 59.7011745,30.4636393 59.7011294,30.4635985 59.701113,30.4635901 59.7011096,30.4634909 59.7010692,30.4633415 59.7009065,30.4632475 59.7008008,30.4633339 59.7007478,30.463267 59.7007226,30.4631688 59.7006856,30.462726 59.7005187,30.4627839 59.700477,30.4629277 59.700364,30.4628712 59.7003463,30.4628406 59.7003375,30.4628018 59.700329,30.4627324 59.7003133,30.4625437 59.700281,30.4624003 59.7002577,30.4623277 59.7002393,30.4622533 59.7002132,30.462183 59.7001817,30.4620452 59.7000972,30.4619642 59.7000527,30.4618883 59.7000085,30.4617881 59.6999591,30.4616936 59.6999188,30.4615834 59.6998886,30.4615415 59.6998816,30.4614913 59.6998733,30.4614085 59.6998641,30.4612464 59.6998574,30.4611217 59.6998541,30.4608263 59.6998478,30.4607558 59.6996967,30.4607155 59.6996206,30.46063 59.6994896,30.4606032 59.6994485,30.4605319 59.6993425,30.4604507 59.6993266,30.4602215 59.6992772,30.4595558 59.699131,30.4592776 59.699072,30.4575016 59.6986865,30.4562393 59.6984033,30.4559187 59.6983348,30.4558203 59.6983605,30.4557987 59.6983662,30.4557686 59.6983735,30.4549679 59.6985899,30.4541981 59.6988205,30.453899 59.6989058,30.4537918 59.6989356,30.4536794 59.6989629,30.4535557 59.6989856,30.4534511 59.6989991,30.4533251 59.6990121,30.4532188 59.6990257,30.4531097 59.6990384,30.4530898 59.6990411,30.4530456 59.6990471,30.4529483 59.6990428,30.452721 59.6990256,30.4526039 59.6990156,30.4523895 59.6989984,30.4522106 59.6989843,30.4520626 59.698971,30.4518814 59.6989585,30.4516574 59.6989473,30.4515079 59.6989512,30.4513576 59.6989647,30.4511257 59.6989833,30.4507033 59.6990189,30.4498045 59.699093,30.4495902 59.6991095,30.449288 59.6991349,30.4489705 59.699163,30.4487787 59.6991832,30.4486594 59.6992042,30.4485816 59.6992218,30.4483804 59.6992665,30.4483134 59.6992807,30.4482261 59.6992991,30.4480734 59.6993207,30.4478922 59.6993369,30.4476348 59.6993534,30.4474175 59.6993579,30.4472213 59.6993549,30.4470849 59.6993484,30.4469099 59.6993315,30.4465807 59.6992943,30.4463005 59.699266,30.4460455 59.6992334,30.445784 59.6991949,30.4455453 59.6991481,30.4453367 59.6991061,30.4450934 59.6990399,30.4448113 59.6989579,30.4445865 59.6988843,30.4443921 59.6988221,30.4441572 59.6987421,30.4439038 59.6986557,30.4434519 59.6984884,30.4429811 59.6983056,30.4420431 59.6979399,30.4418559 59.6978726,30.4416695 59.6977994,30.441534 59.6977474,30.4414482 59.6977149,30.4413649 59.6976776,30.4412699 59.6976303,30.4411831 59.6975862,30.4411089 59.6975484,30.4410289 59.697504,30.4409815 59.6974727,30.4409212 59.6974328,30.4408374 59.6973571,30.4405993 59.6971268,30.4404411 59.6969686,30.4402828 59.6968116,30.4397464 59.6962404,30.4395909 59.6960983,30.439434 59.6959641,30.4393118 59.695876,30.4392419 59.6958321,30.439177 59.6957928,30.4390738 59.6957339,30.4388879 59.6956351,30.4385161 59.6954393,30.4384468 59.695404,30.438361 59.6953709,30.4382459 59.6953424,30.4380981 59.695312,30.4379144 59.6952822,30.4375067 59.6952213,30.4372801 59.6951739,30.4371808 59.695153,30.4370661 59.695126,30.4369099 59.6950805,30.4367611 59.6950291,30.4366176 59.6949682,30.4364949 59.6948934,30.4362637 59.6947112,30.4359055 59.6944268,30.4355501 59.6941622,30.4351531 59.6938841,30.4347532 59.6936305,30.4346998 59.6935975,30.4346849 59.693577,30.4346174 59.6935301,30.4346147 59.6935224,30.4346086 59.6935129,30.4345932 59.6935014,30.4344744 59.6934215,30.4344752 59.6934118,30.4344684 59.6934032,30.4343048 59.693294,30.4335858 59.6928433,30.4335672 59.6928378,30.4335491 59.692831,30.4335344 59.6928246,30.4335169 59.6928158,30.4334908 59.6928019,30.4334747 59.6927935,30.4334378 59.6927735,30.4334063 59.6927569,30.4333486 59.6927221,30.4332896 59.6926848,30.4333366 59.6926751,30.4332748 59.6926368,30.4332052 59.6925918,30.4331186 59.6925354,30.4330442 59.6924832,30.4329739 59.6924321,30.432891 59.6923692,30.4328383 59.6923262,30.432786 59.6922862,30.4327464 59.6922518,30.4327224 59.6922281,30.4327002 59.692202,30.4326801 59.6921654,30.4326563 59.6921265,30.4326325 59.6920866,30.4326077 59.6920372,30.4325876 59.6920054,30.4325715 59.6919759,30.4325473 59.691936,30.4325252 59.6918893,30.4325105 59.6918548,30.4324944 59.6918145,30.4324776 59.6917472,30.4324681 59.6916959,30.4324608 59.6916494,30.4324568 59.6916037)),((30.4459925 59.6840515,30.4465029 59.6838166,30.4469327 59.6836721,30.4472874 59.6834226,30.4479163 59.6832392,30.4483415 59.6832476,30.4484247 59.6832514,30.4484595 59.6832547,30.4484884 59.6832585,30.4485108 59.6832641,30.4489705 59.6834352,30.4489993 59.6834563,30.4490069 59.6834636,30.4492468 59.6836887,30.4491255 59.6840718,30.4490543 59.6840686,30.4483928 59.684035,30.4478277 59.6840459,30.4469355 59.6841321,30.4462744 59.6842068,30.4459925 59.6840515)))', 'relation', 17990902, '{"name": "Государственный музей-заповедник «Павловск»", "note": "граница имущественного комплекса организации, не граница парка", "boundary": "protected_area", "operator": "Государственный музей-заповедник «Павловск»", "wikidata": "Q405637"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4524973 59.6846698,30.4525041 59.6846527,30.4525156 59.684624,30.4525454 59.684611,30.4525859 59.6846153,30.45286 59.6846392,30.4528639 59.6846231,30.4530942 59.6846416,30.4530887 59.6846582,30.4535793 59.6847014,30.4536048 59.6847154,30.4535894 59.6847601,30.4535811 59.6847595,30.4534913 59.6847521,30.4529615 59.6847082,30.4525675 59.6846756,30.4524973 59.6846698)))', 'relation', 17786995, '{"landuse": "construction", "start_date": "06.204", "description": "реставрация Павильона Трех граций"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522477 59.6858088,30.4522705 59.6857319,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4527091 59.6855042,30.4528709 59.6855164,30.4529043 59.6855189,30.4529835 59.685525,30.4530542 59.6855302,30.4530286 59.6856166,30.4529796 59.6857822,30.4529559 59.6858622,30.4528897 59.6858572,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088)))', 'relation', 6636658, '{"height": "19.650", "architect": "Чарльз Камерон", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2.45", "building:part": "yes", "building:colour": "#FFE19C", "source:building:part": "http://pancer.ru/images/project/012/2.jpg"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4530216 59.6854636,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.453064 59.6855044,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 6636659, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528709 59.6855164,30.4528746 59.6855048,30.4528788 59.6854915,30.4529122 59.6854936,30.4529942 59.6854993,30.4529881 59.6855114,30.4529835 59.685525,30.4529043 59.6855189,30.4528709 59.6855164)))', 'relation', 14572596, '{"height": "6.65", "roof:shape": "flat", "roof:colour": "gray", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4533818 59.6852214,30.453417 59.6852162,30.4534578 59.6852115,30.4535038 59.6852069,30.4535289 59.6853164,30.4535075 59.6853177,30.4534847 59.6853198,30.4534688 59.6853212,30.4534368 59.6853262,30.453436 59.6853248,30.4534146 59.6852887,30.4533878 59.6852355,30.4533818 59.6852214)))', 'relation', 17755881, '{"height": "13", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.453436 59.6853248,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533268 59.6853074,30.4532684 59.6852465)))', 'relation', 17755882, '{"height": "13", "min_height": "10", "roof:shape": "gabled", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529542 59.6853912,30.4529724 59.685378,30.4530012 59.685359,30.4530217 59.6853466,30.4530456 59.6853334,30.4530682 59.6853211,30.4530897 59.6853096,30.4531138 59.6852988,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533878 59.6852355,30.4534146 59.6852887,30.4533836 59.6852944,30.4533532 59.6853009,30.4533268 59.6853074,30.4532946 59.6853162,30.4532665 59.6853249,30.4532343 59.6853363,30.4532132 59.6853445,30.4531881 59.6853553,30.453164 59.6853668,30.4531411 59.6853788,30.4531158 59.6853933,30.4530954 59.6854062,30.4530746 59.6854199,30.4530552 59.6854344,30.4530382 59.6854491,30.4530216 59.6854636,30.4530079 59.6854761,30.4530004 59.6854886,30.4529942 59.6854993,30.4529122 59.6854936,30.4528788 59.6854915)))', 'relation', 17904735, '{"height": "10", "roof:shape": "flat", "building:part": "yes", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4522278 59.6851794,30.4526025 59.6847092,30.4524973 59.6846698,30.4525184 59.6846577,30.4525251 59.684634,30.4525331 59.6846279,30.4525466 59.6846232,30.4525626 59.6846222,30.4525841 59.6846239,30.4527677 59.6846399,30.4528579 59.6846477,30.4528469 59.6846817,30.452843 59.684694,30.4529628 59.6847041,30.4530706 59.6847131,30.4530752 59.684699,30.4530859 59.6846667,30.4535555 59.6847085,30.4535698 59.6847103,30.4535807 59.6847121,30.4535886 59.6847164,30.4535925 59.6847224,30.4535923 59.6847296,30.4535863 59.6847456,30.4535811 59.6847595,30.4535894 59.6847601,30.4536067 59.6847614,30.4536193 59.6847624,30.4536402 59.684764,30.4535302 59.6851198,30.4535229 59.6851437,30.4535137 59.6851734,30.4535124 59.6851786,30.4535038 59.6852069,30.4534979 59.6851951,30.4534914 59.6851874,30.4534811 59.6851808,30.4534678 59.6851758,30.4534524 59.6851728,30.453436 59.6851719,30.4534196 59.6851732,30.4534028 59.6851772,30.4533891 59.6851835,30.4533796 59.6851915,30.4533752 59.6852006,30.4533763 59.68521,30.4533818 59.6852214,30.4533524 59.685227,30.4533302 59.6852316,30.453297 59.6852393,30.4532684 59.6852465,30.4532391 59.6852543,30.4531809 59.6852727,30.453156 59.6852825,30.4531357 59.6852905,30.453128 59.6852882,30.4531198 59.6852866,30.4531113 59.6852855,30.4531024 59.685285,30.4530936 59.6852852,30.4530849 59.6852859,30.4530765 59.6852873,30.4530685 59.6852893,30.4530612 59.6852918,30.4530559 59.6852942,30.4530511 59.6852969,30.453047 59.6852998,30.4530436 59.6853029,30.4530408 59.6853062,30.4530389 59.6853097,30.4530377 59.6853132,30.4530373 59.6853168,30.4530377 59.6853204,30.4530387 59.6853245,30.4530402 59.6853274,30.4530424 59.6853304,30.4530456 59.6853334,30.4530217 59.6853466,30.4530053 59.6853403,30.4529809 59.6853554,30.4529707 59.6853538,30.4529621 59.6853543,30.452955 59.6853567,30.4529297 59.6853727,30.4529266 59.6853774,30.4529284 59.6853815,30.4529349 59.6853856,30.4529136 59.685403,30.4529312 59.685409,30.4529147 59.685423,30.4529045 59.6854337,30.4529242 59.6854401,30.452909 59.6854545,30.4528993 59.6854656,30.4528865 59.6854815,30.4528788 59.6854915,30.4528746 59.6855048,30.4527686 59.6854977,30.452777 59.6854654,30.4527565 59.685464,30.4527224 59.6854618,30.4526841 59.6854592,30.4526646 59.6854579,30.4526564 59.6854895,30.4525812 59.6854845,30.4525787 59.6854944,30.452497 59.6854882,30.4524943 59.6854502,30.4524845 59.6854195,30.4524735 59.685401,30.4524616 59.6853789,30.4524395 59.6853504,30.4524088 59.6853175,30.4523836 59.685295,30.4523534 59.6852701,30.4523333 59.6852571,30.452307 59.6852409,30.4522692 59.6852184,30.4522695 59.6851929,30.4522474 59.6851858,30.4522278 59.6851794)))', 'relation', 4274530, '{"fee": "yes", "ref": "IIIа", "name": "Собственный сад", "leisure": "garden", "name:fr": "Jardin privé", "ref:okn": "781620399040366", "tourism": "attraction", "alt_name": "Собственный садик", "boundary": "protected_area", "heritage": "2", "wikidata": "Q118122043", "start_date": "1803", "garden:style": "french", "opening_hours": "Mo-Su 09:00-21:00; May 08 - Aug 31", "heritage:website": "https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6518/"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4521745 59.6857248,30.4521808 59.6857036,30.4522002 59.685638,30.4522191 59.6855742,30.4522258 59.6855515,30.4522802 59.6855556,30.4523217 59.6855588,30.452346 59.6854768,30.452497 59.6854882,30.4525787 59.6854944,30.4525812 59.6854845,30.4526564 59.6854895,30.4526646 59.6854579,30.4526841 59.6854592,30.4527224 59.6854618,30.4527565 59.685464,30.452777 59.6854654,30.4527686 59.6854977,30.4528746 59.6855048,30.4528788 59.6854915,30.4528865 59.6854815,30.4528993 59.6854656,30.452909 59.6854545,30.4529242 59.6854401,30.4529045 59.6854337,30.4529147 59.685423,30.4529312 59.685409,30.4529136 59.685403,30.4529349 59.6853856,30.4529284 59.6853815,30.4529266 59.6853774,30.4529297 59.6853727,30.452955 59.6853567,30.4529621 59.6853543,30.4529707 59.6853538,30.4529809 59.6853554,30.4530053 59.6853403,30.4530217 59.6853466,30.4530456 59.6853334,30.4530424 59.6853304,30.4530402 59.6853274,30.4530387 59.6853245,30.4530377 59.6853204,30.4530373 59.6853168,30.4530377 59.6853132,30.4530389 59.6853097,30.4530408 59.6853062,30.4530436 59.6853029,30.453047 59.6852998,30.4530511 59.6852969,30.4530559 59.6852942,30.4530612 59.6852918,30.4530685 59.6852893,30.4530765 59.6852873,30.4530849 59.6852859,30.4530936 59.6852852,30.4531024 59.685285,30.4531113 59.6852855,30.4531198 59.6852866,30.453128 59.6852882,30.4531357 59.6852905,30.453156 59.6852825,30.4531809 59.6852727,30.4532391 59.6852543,30.4532684 59.6852465,30.453297 59.6852393,30.4533302 59.6852316,30.4533524 59.685227,30.4533818 59.6852214,30.4533763 59.68521,30.4533752 59.6852006,30.4533796 59.6851915,30.4533891 59.6851835,30.4534028 59.6851772,30.4534196 59.6851732,30.453436 59.6851719,30.4534524 59.6851728,30.4534678 59.6851758,30.4534811 59.6851808,30.4534914 59.6851874,30.4534979 59.6851951,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540229 59.6848667,30.4540358 59.6848708,30.454047 59.6848759,30.4540561 59.6848821,30.454063 59.6848889,30.4540674 59.6848962,30.4540691 59.6849039,30.454068 59.6849115,30.4540643 59.6849189,30.454058 59.6849259,30.4540493 59.6849322,30.4540386 59.6849376,30.4540261 59.684942,30.4540122 59.6849452,30.4539975 59.684947,30.4539823 59.6849475,30.4539763 59.6849646,30.453965 59.6849637,30.4539277 59.6849606,30.4538688 59.6849558,30.4538059 59.6849506,30.4537818 59.6849487,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537483 59.6850789,30.4538612 59.6850876,30.4539247 59.6850925,30.4539406 59.6850424,30.4539786 59.6850519,30.4540221 59.685063,30.4540417 59.6850686,30.4540646 59.6850751,30.4541059 59.6850881,30.4541472 59.6851025,30.4541871 59.685118,30.4542254 59.6851343,30.4542622 59.6851516,30.4542942 59.6851377,30.4544115 59.6852076,30.4543838 59.6852203,30.4544141 59.6852392,30.4544426 59.6852588,30.4544691 59.6852791,30.4544972 59.6853031,30.4545225 59.6853279,30.4545451 59.6853534,30.4545829 59.6853462,30.4546442 59.6854282,30.4546081 59.6854351,30.4546263 59.6854611,30.4546407 59.6854917,30.4546513 59.6855211,30.4546577 59.6855509,30.4545667 59.6855569,30.4545695 59.6855677,30.4545502 59.6855689,30.4545521 59.6855762,30.454475 59.6855814,30.454473 59.685574,30.4544524 59.6855754,30.4544496 59.6855646,30.4544349 59.6855656,30.4543687 59.68557,30.4543619 59.6855441,30.4543522 59.6855184,30.4543439 59.6854971,30.4543247 59.685468,30.454307 59.6854434,30.4542866 59.6854194,30.4542636 59.6853959,30.4542381 59.6853732,30.4542062 59.685347,30.4541753 59.6853248,30.4541426 59.6853062,30.4541083 59.6852876,30.4540689 59.6852681,30.4540273 59.6852498,30.4539837 59.6852328,30.4539382 59.685217,30.4538908 59.6852026,30.4538877 59.6852126,30.4539316 59.6852158,30.4539299 59.6852218,30.4539248 59.68524,30.453923 59.6852463,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536921 59.6853643,30.4536766 59.6853631,30.453626 59.6853592,30.4536111 59.6853581,30.4536187 59.6853329,30.4534688 59.6853212,30.4534368 59.6853262,30.4533983 59.6853338,30.4533609 59.6853429,30.4533196 59.6853548,30.4532989 59.6853612,30.4532797 59.6853674,30.4532663 59.6853726,30.4532524 59.6853786,30.4532824 59.685393,30.4532679 59.6854007,30.4532019 59.6854356,30.4531881 59.6854429,30.4531582 59.6854285,30.453148 59.6854347,30.4531265 59.6854489,30.4531071 59.6854639,30.4530899 59.6854797,30.4530765 59.6854926,30.4530668 59.6855046,30.45306 59.6855156,30.4530542 59.6855302,30.4530286 59.6856166,30.4530752 59.6856201,30.4531272 59.685624,30.4531226 59.6856395,30.4531 59.6857159,30.4530826 59.6857747,30.4530781 59.6857896,30.4530261 59.6857857,30.4529796 59.6857822,30.4529559 59.6858622,30.4529512 59.6858765,30.4529486 59.6858896,30.4529478 59.6859011,30.4529482 59.6859112,30.452952 59.685926,30.4529569 59.6859385,30.4529638 59.6859523,30.4529718 59.6859649,30.4529791 59.6859757,30.4529856 59.6859841,30.4530246 59.6859742,30.4530338 59.6859834,30.4530767 59.6860278,30.4530861 59.6860371,30.4530482 59.6860471,30.4530568 59.6860536,30.4530663 59.6860602,30.4530779 59.6860674,30.4530898 59.6860742,30.4531018 59.6860809,30.4531136 59.6860871,30.4531293 59.6860946,30.453148 59.6861029,30.4531695 59.6861116,30.4532167 59.6861306,30.4533686 59.6861421,30.453376 59.6861189,30.4533898 59.68612,30.4534436 59.6861244,30.453457 59.6861255,30.4534496 59.6861487,30.4536027 59.6861615,30.4535556 59.6863114,30.4535958 59.6863065,30.4536563 59.6862959,30.4537014 59.6862868,30.4537731 59.6862682,30.4538342 59.6862493,30.453879 59.6862345,30.4539364 59.686214,30.4539768 59.686198,30.45402 59.6861768,30.4540703 59.686148,30.4541119 59.6861223,30.4541469 59.6860952,30.4541742 59.6860729,30.4541995 59.6860505,30.4542215 59.6860272,30.4542918 59.6860451,30.4543031 59.6860479,30.4543127 59.6860386,30.45433 59.6860429,30.4543365 59.6860363,30.4544062 59.6860538,30.4543997 59.6860604,30.4544185 59.6860651,30.4544086 59.6860746,30.4544964 59.6860973,30.4544728 59.6861239,30.4544395 59.686154,30.4544059 59.686181,30.4543849 59.6861942,30.4544137 59.6862059,30.4542999 59.6862773,30.4542705 59.6862654,30.4542363 59.6862844,30.4541965 59.6863041,30.4541887 59.6863078,30.4542091 59.6863195,30.4542 59.6863235,30.4541696 59.6863371,30.4541607 59.6863411,30.4541407 59.6863296,30.4541297 59.6863344,30.4540887 59.6863495,30.4540549 59.6863624,30.4540219 59.6863729,30.4540399 59.6863883,30.4540005 59.6863999,30.4540172 59.6864141,30.4540057 59.6864176,30.4539576 59.686432,30.4539454 59.6864356,30.4539287 59.6864214,30.4538817 59.6864353,30.453863 59.6864194,30.4538212 59.6864281,30.4537814 59.6864354,30.4537376 59.6864434,30.4536952 59.6864492,30.4536556 59.6864553,30.4536188 59.68646,30.4535812 59.6864636,30.453575 59.6864544,30.4534768 59.6864467,30.4533659 59.6864383,30.4533611 59.6864525,30.4533485 59.6864515,30.4533248 59.6864494,30.4532998 59.6864473,30.4532869 59.6864462,30.4532916 59.686432,30.4532725 59.6864305,30.4532826 59.6863983,30.4531363 59.6863866,30.453138 59.686381,30.4531642 59.6862975,30.4531215 59.686294,30.4531372 59.6862455,30.4531795 59.686249,30.453196 59.6861992,30.4531704 59.6862175,30.4531608 59.6862141,30.453137 59.6862056,30.4531278 59.6862023,30.4531534 59.686184,30.4530963 59.6861616,30.4530418 59.6861992,30.4530167 59.6861897,30.4529804 59.6861727,30.4529497 59.6861561,30.4529175 59.6861373,30.4528879 59.6861175,30.4528659 59.6861008,30.4528406 59.6860793,30.4528174 59.6860572,30.4527956 59.6860336,30.4527791 59.6860133,30.4527643 59.6859927,30.4527472 59.6859643,30.4527383 59.6859422,30.4527314 59.6859191,30.4527279 59.6859036,30.4528174 59.6858982,30.4528205 59.685852,30.4526832 59.6858416,30.4526091 59.6858361,30.4525803 59.6858339,30.4522804 59.6858113,30.4522477 59.6858088,30.4522705 59.6857319,30.4522289 59.6857289,30.4521745 59.6857248)))', 'relation', 1759666, '{"name": "Павловский дворец", "name:ca": "Palau Pàvlovsk", "name:en": "Pavlovsk Palace", "name:fi": "Pavlovskin_palatsi", "name:fr": "Palais de Pavlovsk", "name:pt": "Palácio de Pavlovsk", "name:uz": "Pavlovsk saroyi", "name:zh": "巴甫洛夫斯克的宫殿", "ref:okn": "781610399040316", "tourism": "museum", "building": "palace", "historic": "yes", "int_name": "Palais de Pavlovsk", "wikidata": "Q118121947", "wikipedia": "ru:Павловский дворец", "start_date": "1782", "addr:street": "Садовая улица", "roof:colour": "#DADDE2", "building:colour": "#FFE19C", "addr:housenumber": "20 литА"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534688 59.6853212,30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4538454 59.6853506,30.4536997 59.6853392,30.4536666 59.6853366,30.4536187 59.6853329,30.4534688 59.6853212)))', 'relation', 6636665, '{"name": "Южный корпус", "height": "15", "roof:shape": "pyramidal", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4534995 59.6852209,30.4535038 59.6852069,30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536141 59.6851263,30.4537003 59.685133,30.4539076 59.685149,30.4538908 59.6852026,30.4538877 59.6852126,30.4538783 59.6852431,30.4538761 59.6852503,30.4534995 59.6852209)))', 'relation', 14572597, '{"height": "15", "roof:shape": "gabled", "start_date": "1782", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C", "roof:orientation": "across"}', NULL),
('SRID=4326;MULTIPOLYGON(((30.4535124 59.6851786,30.4535137 59.6851734,30.4535229 59.6851437,30.4535302 59.6851198,30.4536402 59.684764,30.4536417 59.6847593,30.4536451 59.6847596,30.4538117 59.6847727,30.4538368 59.6847747,30.4538611 59.6847766,30.4540318 59.6847901,30.4540295 59.6847972,30.4540145 59.684846,30.4540088 59.6848638,30.4540054 59.6848752,30.4537854 59.6848579,30.4537579 59.6849467,30.4537377 59.6850123,30.4537178 59.6850766,30.4537003 59.685133,30.453682 59.6851921,30.4535124 59.6851786)))', 'relation', 18019154, '{"height": "13", "roof:shape": "hipped", "roof:colour": "#DADDE2", "roof:height": "2", "building:part": "yes", "roof:material": "metal", "building:colour": "#FFE19C"}', NULL);
--Testcase 402:
SELECT count(*) FROM json_osm_test;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 404: オーク / Sồi
SELECT * FROM json_osm_test WHERE t->>'genus' = 'Quercus';
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 406:
SELECT * FROM json_osm_test WHERE (t->>'height')::float = 15;
--Testcase 407:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 408: 落葉性 / Cây rụng lá
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'deciduous';
--Testcase 409:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 410: 常緑植物 / Cây thường xanh
SELECT * FROM json_osm_test WHERE t->>'leaf_cycle' = 'evergreen';
--Testcase 411:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 412: XVIII cent.
SELECT * FROM json_osm_test WHERE t->>'start_date' = 'C18';
--Testcase 413:
DELETE FROM json_osm_test;
--Testcase 500:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/macaddr.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR"( "i" int OPTIONS (key 'true'), "m" macaddr) SERVER sqlite_svr OPTIONS (table 'type_MACADDR');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (1, '08:00:2b:01:02:03');
--Testcase 012:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (2, '08-00-2b-01-02-03');
--Testcase 013:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (3, '08002b:010203');
--Testcase 014:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (4, '08002b-010203');
--Testcase 015:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (5, '0800.2b01.0203');
--Testcase 016:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (6, '0800-2b01-0203');
--Testcase 017:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (7, '08002b010203');
--Testcase 018:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (8, '08:00:2F:01:02:03');
--Testcase 019:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (9, '08-00-2F-01-02-03');
--Testcase 020:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (10, '08002F:010203');
--Testcase 021:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (11, '08002F-010203');
--Testcase 022:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (12, '0800.2F01.0203');
--Testcase 023:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (13, '0800-2F01-0203');
--Testcase 024:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (14, '08002F010203');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (15, decode('08002F010203', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (16, decode('08002b010203', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" TYPE macaddr;
--Testcase 029:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (17, '08:00:2b:01:02:03');
--Testcase 030:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (18, '08-00-2b-01-02-03');
--Testcase 031:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (19, '08002b:010203');
--Testcase 032:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (20, '08002b-010203');
--Testcase 033:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (21, '0800.2b01.0203');
--Testcase 034:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (22, '0800-2b01-0203');
--Testcase 035:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (23, '08002b010203');
--Testcase 036:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (24, '08:00:2F:01:02:03');
--Testcase 037:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (25, '08-00-2F-01-02-03');
--Testcase 038:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (26, '08002F:010203');
--Testcase 039:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (27, '08002F-010203');
--Testcase 040:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (28, '0800.2F01.0203');
--Testcase 041:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (29, '0800-2F01-0203');
--Testcase 042:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (30, '08002F010203');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (31, '08:00:2b:01:02:03');
--Testcase 046:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (32, '08-00-2b-01-02-03');
--Testcase 047:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (33, '08002b:010203');
--Testcase 048:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (34, '08002b-010203');
--Testcase 049:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (35, '0800.2b01.0203');
--Testcase 050:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (36, '0800-2b01-0203');
--Testcase 051:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (37, '08002b010203');
--Testcase 052:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (38, '08:00:2F:01:02:03');
--Testcase 053:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (39, '08-00-2F-01-02-03');
--Testcase 054:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (40, '08002F:010203');
--Testcase 055:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (41, '08002F-010203');
--Testcase 056:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (42, '0800.2F01.0203');
--Testcase 057:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (43, '0800-2F01-0203');
--Testcase 058:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (44, '08002F010203');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (45, '08:00:2b:01:02:03');
--Testcase 062:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (46, '08-00-2b-01-02-03');
--Testcase 063:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (47, '08002b:010203');
--Testcase 064:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (48, '08002b-010203');
--Testcase 065:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (49, '0800.2b01.0203');
--Testcase 066:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (50, '0800-2b01-0203');
--Testcase 067:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (51, '08002b010203');
--Testcase 068:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (52, '08:00:2F:01:02:03');
--Testcase 069:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (53, '08-00-2F-01-02-03');
--Testcase 070:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (54, '08002F:010203');
--Testcase 071:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (55, '08002F-010203');
--Testcase 072:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (56, '0800.2F01.0203');
--Testcase 073:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (57, '0800-2F01-0203');
--Testcase 074:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR" ("i", "m") VALUES (58, '08002F010203');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR+"( "i" int OPTIONS (key 'true'), "m" macaddr, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR+');
--Testcase 077:
SELECT * FROM "type_MACADDR+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 084:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2b:01:02:03';
--Testcase 088:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR+" where "m" = '08:00:2F:01:02:03';
--Testcase 091:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17; -- 9527026057731
--Testcase 098:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR" WHERE "m" = '08:00:2F:01:02:03';
--Testcase 106:
SELECT * FROM "type_MACADDR+";
--Testcase 107:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (59, '08:AA:2F:01:02:04');
--Testcase 108:
SELECT * FROM "type_MACADDR+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:05' WHERE "m" = '08:AA:2F:01:02:04';
--Testcase 111:
SELECT * FROM "type_MACADDR+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:03' WHERE "m" = '08:AA:2F:01:02:05';
--Testcase 115:
SELECT * FROM "type_MACADDR+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR" SET "m" = '08:AA:2F:01:02:02' WHERE "m" = '08:AA:2F:01:02:03';
--Testcase 119:
SELECT * FROM "type_MACADDR+";
--Testcase 120:
DELETE FROM "type_MACADDR";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (60, '01:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (61, '02:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (62, '03:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (63, '00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (64, '00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (65, '00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (66, '00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (67, '00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR" ("i", "m") VALUES (68, '00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDRpk" (col macaddr OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDRpk" VALUES ('01:02:03:04:05:06');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDRpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDRpk" VALUES ('01-02-03-04-05-06');
--Testcase 159:
SELECT * FROM "type_MACADDRpk";
--Testcase 160:
DELETE FROM "type_MACADDRpk";
--no macaddr operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06' FROM "type_MACADDR";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/macaddr8.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_MACADDR8"( "i" int OPTIONS (key 'true'), "m" macaddr8) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8');
--Testcase 010:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE text;
--Testcase 011:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (1, '08:00:2b:01:02:03:04:05');
--Testcase 012:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (2, '08-00-2b-01-02-03-04-05');
--Testcase 013:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (3, '08002b01:02030405');
--Testcase 014:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (4, '08002b01-02030405');
--Testcase 015:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (5, '0800.2b01.0203.0405');
--Testcase 016:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (6, '0800-2b01-0203-0405');
--Testcase 017:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (7, '08002b0102030405');
--Testcase 018:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (8, '08:00:2F:01:02:03:04:05');
--Testcase 019:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (9, '08-00-2F-01-02-03-04-05');
--Testcase 020:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (10, '08002F01:02030405');
--Testcase 021:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (11, '08002F01-02030405');
--Testcase 022:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (12, '0800.2F01.0203.0405');
--Testcase 023:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (13, '0800-2F01-0203-0405');
--Testcase 024:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (14, '08002F0102030405');
--Testcase 025:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE bytea;
--Testcase 026:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (15, decode('08002F0102030405', 'hex'));
--Testcase 027:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (16, decode('08002b0102030405', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" TYPE macaddr8;
--Testcase 029:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (17, '08:00:2b:01:02:03:04:05');
--Testcase 030:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (18, '08-00-2b-01-02-03-04-05');
--Testcase 031:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (19, '08002b01:02030405');
--Testcase 032:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (20, '08002b01-02030405');
--Testcase 033:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (21, '0800.2b01.0203.0405');
--Testcase 034:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (22, '0800-2b01-0203-0405');
--Testcase 035:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (23, '08002b0102030405');
--Testcase 036:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (24, '08:00:2F:01:02:03:04:05');
--Testcase 037:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (25, '08-00-2F-01-02-03-04-05');
--Testcase 038:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (26, '08002F01:02030405');
--Testcase 039:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (27, '08002F01-02030405');
--Testcase 040:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (28, '0800.2F01.0203.0405');
--Testcase 041:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (29, '0800-2F01-0203-0405');
--Testcase 042:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 043:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (30, '08002F0102030405');
--Testcase 044:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (ADD column_type 'BLOB');
--Testcase 045:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (31, '08:00:2b:01:02:03:04:05');
--Testcase 046:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (32, '08-00-2b-01-02-03-04-05');
--Testcase 047:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (33, '08002b01:02030405');
--Testcase 048:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (34, '08002b01-02030405');
--Testcase 049:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (35, '0800.2b01.0203.0405');
--Testcase 050:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (36, '0800-2b01-0203-0405');
--Testcase 051:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (37, '08002b0102030405');
--Testcase 052:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (38, '08:00:2F:01:02:03:04:05');
--Testcase 053:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (39, '08-00-2F-01-02-03-04-05');
--Testcase 054:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (40, '08002F01:02030405');
--Testcase 055:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (41, '08002F01-02030405');
--Testcase 056:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (42, '0800.2F01.0203.0405');
--Testcase 057:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (43, '0800-2F01-0203-0405');
--Testcase 058:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 059:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (44, '08002F0102030405');
--Testcase 060:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'text');
--Testcase 061:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (45, '08:00:2b:01:02:03:04:05');
--Testcase 062:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (46, '08-00-2b-01-02-03-04-05');
--Testcase 063:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (47, '08002b01:02030405');
--Testcase 064:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (48, '08002b01-02030405');
--Testcase 065:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (49, '0800.2b01.0203.0405');
--Testcase 066:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (50, '0800-2b01-0203-0405');
--Testcase 067:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (51, '08002b0102030405');
--Testcase 068:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (52, '08:00:2F:01:02:03:04:05');
--Testcase 069:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (53, '08-00-2F-01-02-03-04-05');
--Testcase 070:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (54, '08002F01:02030405');
--Testcase 071:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (55, '08002F01-02030405');
--Testcase 072:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (56, '0800.2F01.0203.0405');
--Testcase 073:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (57, '0800-2F01-0203-0405');
--Testcase 074:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 075:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (58, '08002F0102030405');
--Testcase 076:
CREATE FOREIGN TABLE "type_MACADDR8+"( "i" int OPTIONS (key 'true'), "m" macaddr8, "t" text, "l" smallint, "tx" varchar(64)) SERVER sqlite_svr OPTIONS (table 'type_MACADDR8+');
--Testcase 077:
SELECT * FROM "type_MACADDR8+";
--Testcase 078:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 079:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 080:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 081:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 082:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 083:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 084:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 085:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 086:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 087:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2b:01:02:03:04:05';
--Testcase 088:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 089:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 090:
SELECT * FROM "type_MACADDR8+" where "m" = '08:00:2F:01:02:03:04:05';
--Testcase 091:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 092:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 15;
--Testcase 093:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 094:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 095:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 16;
--Testcase 096:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 098:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "i" = 17;
--Testcase 099:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 100:
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 102:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'integer');
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 104:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_MACADDR8" WHERE "m" = '08:00:2F:01:02:03:04:05';
--Testcase 106:
SELECT * FROM "type_MACADDR8+";
--Testcase 107:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (59, '08:AA:2F:01:02:04:04:05');
--Testcase 108:
SELECT * FROM "type_MACADDR8+" WHERE "i" = 59;
--Testcase 109:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 110: -- text
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:05:04:05' WHERE "m" = '08:AA:2F:01:02:04:04:05';
--Testcase 111:
SELECT * FROM "type_MACADDR8+";
--Testcase 112:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 113:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 114: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:03:04:05' WHERE "m" = '08:AA:2F:01:02:05:04:05';
--Testcase 115:
SELECT * FROM "type_MACADDR8+";
--Testcase 116:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 117:
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 118: -- BLOB
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_MACADDR8" SET "m" = '08:AA:2F:01:02:02:04:05' WHERE "m" = '08:AA:2F:01:02:03:04:05';
--Testcase 119:
SELECT * FROM "type_MACADDR8+";
--Testcase 120:
DELETE FROM "type_MACADDR8";
--Testcase 121: -- sort test
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 122:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (60, '01:00:00:00:00:00:00:00');
--Testcase 123:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 124:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (61, '02:00:00:00:00:00:00:00');
--Testcase 125:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 126:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (62, '03:00:00:00:00:00:00:00');
--Testcase 127:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 128:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (63, '00:00:00:00:00:00:00:01');
--Testcase 129:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 130:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (64, '00:00:00:00:00:00:00:02');
--Testcase 131:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 132:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (65, '00:00:00:00:00:00:00:03');
--Testcase 133:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'TEXT');
--Testcase 134:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (66, '00:00:00:00:01:00:00:00');
--Testcase 135:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'BLOB');
--Testcase 136:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (67, '00:00:00:00:02:00:00:00');
--Testcase 137:
ALTER FOREIGN TABLE "type_MACADDR8" ALTER COLUMN "m" OPTIONS (SET column_type 'int');
--Testcase 138:
INSERT INTO "type_MACADDR8" ("i", "m") VALUES (68, '00:00:00:00:03:00:00:00');
--Testcase 139:
SELECT * FROM "type_MACADDR8" ORDER BY "m" ASC;
--Testcase 140:
SELECT * FROM "type_MACADDR8" ORDER BY "m" DESC;
--Testcase 150:
CREATE FOREIGN TABLE "type_MACADDR8pk" (col macaddr8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 151:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 152:
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 153:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'int');
--Testcase 154: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 155:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (SET column_type 'text');
--Testcase 156: NO ERR, but the same semantics!
INSERT INTO "type_MACADDR8pk" VALUES ('01:02:03:04:05:06:07:08');
--Testcase 157:
ALTER FOREIGN TABLE "type_MACADDR8pk" ALTER COLUMN col OPTIONS (ADD column_type 'BLOB');
--Testcase 158: ERR - primary key
INSERT INTO "type_MACADDR8pk" VALUES ('01-02-03-04-05-06-07-08');
--Testcase 159:
SELECT * FROM "type_MACADDR8pk";
--Testcase 160:
DELETE FROM "type_MACADDR8pk";
--no macaddr8 operators pushing down
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" | '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" & '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT ~"m" FROM "type_MACADDR8";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" > '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" < '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" = '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" >= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" <= '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "m" != '01:02:03:04:05:06:07:08' FROM "type_MACADDR8";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/numeric.sql
================================================
--
-- NUMERIC
--
--Testcase 567:
CREATE EXTENSION sqlite_fdw;
--Testcase 568:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 569:
CREATE FOREIGN TABLE num_data (id int4 OPTIONS (key 'true'), val numeric(210,10)) SERVER sqlite_svr;
--Testcase 570:
CREATE FOREIGN TABLE num_exp_add (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 571:
CREATE FOREIGN TABLE num_exp_sub (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 572:
CREATE FOREIGN TABLE num_exp_div (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 573:
CREATE FOREIGN TABLE num_exp_mul (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 574:
CREATE FOREIGN TABLE num_exp_sqrt (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 575:
CREATE FOREIGN TABLE num_exp_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 576:
CREATE FOREIGN TABLE num_exp_log10 (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 577:
CREATE FOREIGN TABLE num_exp_power_10_ln (id int4 OPTIONS (key 'true'), expected numeric(210,10)) SERVER sqlite_svr;
--Testcase 1556:
CREATE FOREIGN TABLE num_variance (a numeric) SERVER sqlite_svr;
--Testcase 578:
CREATE FOREIGN TABLE num_result (id1 int4 OPTIONS (key 'true'), id2 int4 OPTIONS (key 'true'), result numeric(210,10)) SERVER sqlite_svr;
-- ******************************
-- * The following EXPECTED results are computed by bc(1)
-- * with a scale of 200
-- ******************************
BEGIN TRANSACTION;
--Testcase 1:
INSERT INTO num_exp_add VALUES (0,0,'0');
--Testcase 2:
INSERT INTO num_exp_sub VALUES (0,0,'0');
--Testcase 3:
INSERT INTO num_exp_mul VALUES (0,0,'0');
--Testcase 4:
INSERT INTO num_exp_div VALUES (0,0,'NaN');
--Testcase 5:
INSERT INTO num_exp_add VALUES (0,1,'0');
--Testcase 6:
INSERT INTO num_exp_sub VALUES (0,1,'0');
--Testcase 7:
INSERT INTO num_exp_mul VALUES (0,1,'0');
--Testcase 8:
INSERT INTO num_exp_div VALUES (0,1,'NaN');
--Testcase 9:
INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047');
--Testcase 10:
INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047');
--Testcase 11:
INSERT INTO num_exp_mul VALUES (0,2,'0');
--Testcase 12:
INSERT INTO num_exp_div VALUES (0,2,'0');
--Testcase 13:
INSERT INTO num_exp_add VALUES (0,3,'4.31');
--Testcase 14:
INSERT INTO num_exp_sub VALUES (0,3,'-4.31');
--Testcase 15:
INSERT INTO num_exp_mul VALUES (0,3,'0');
--Testcase 16:
INSERT INTO num_exp_div VALUES (0,3,'0');
--Testcase 17:
INSERT INTO num_exp_add VALUES (0,4,'7799461.4119');
--Testcase 18:
INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119');
--Testcase 19:
INSERT INTO num_exp_mul VALUES (0,4,'0');
--Testcase 20:
INSERT INTO num_exp_div VALUES (0,4,'0');
--Testcase 21:
INSERT INTO num_exp_add VALUES (0,5,'16397.038491');
--Testcase 22:
INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491');
--Testcase 23:
INSERT INTO num_exp_mul VALUES (0,5,'0');
--Testcase 24:
INSERT INTO num_exp_div VALUES (0,5,'0');
--Testcase 25:
INSERT INTO num_exp_add VALUES (0,6,'93901.57763026');
--Testcase 26:
INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026');
--Testcase 27:
INSERT INTO num_exp_mul VALUES (0,6,'0');
--Testcase 28:
INSERT INTO num_exp_div VALUES (0,6,'0');
--Testcase 29:
INSERT INTO num_exp_add VALUES (0,7,'-83028485');
--Testcase 30:
INSERT INTO num_exp_sub VALUES (0,7,'83028485');
--Testcase 31:
INSERT INTO num_exp_mul VALUES (0,7,'0');
--Testcase 32:
INSERT INTO num_exp_div VALUES (0,7,'0');
--Testcase 33:
INSERT INTO num_exp_add VALUES (0,8,'74881');
--Testcase 34:
INSERT INTO num_exp_sub VALUES (0,8,'-74881');
--Testcase 35:
INSERT INTO num_exp_mul VALUES (0,8,'0');
--Testcase 36:
INSERT INTO num_exp_div VALUES (0,8,'0');
--Testcase 37:
INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420');
--Testcase 38:
INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420');
--Testcase 39:
INSERT INTO num_exp_mul VALUES (0,9,'0');
--Testcase 40:
INSERT INTO num_exp_div VALUES (0,9,'0');
--Testcase 41:
INSERT INTO num_exp_add VALUES (1,0,'0');
--Testcase 42:
INSERT INTO num_exp_sub VALUES (1,0,'0');
--Testcase 43:
INSERT INTO num_exp_mul VALUES (1,0,'0');
--Testcase 44:
INSERT INTO num_exp_div VALUES (1,0,'NaN');
--Testcase 45:
INSERT INTO num_exp_add VALUES (1,1,'0');
--Testcase 46:
INSERT INTO num_exp_sub VALUES (1,1,'0');
--Testcase 47:
INSERT INTO num_exp_mul VALUES (1,1,'0');
--Testcase 48:
INSERT INTO num_exp_div VALUES (1,1,'NaN');
--Testcase 49:
INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047');
--Testcase 50:
INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047');
--Testcase 51:
INSERT INTO num_exp_mul VALUES (1,2,'0');
--Testcase 52:
INSERT INTO num_exp_div VALUES (1,2,'0');
--Testcase 53:
INSERT INTO num_exp_add VALUES (1,3,'4.31');
--Testcase 54:
INSERT INTO num_exp_sub VALUES (1,3,'-4.31');
--Testcase 55:
INSERT INTO num_exp_mul VALUES (1,3,'0');
--Testcase 56:
INSERT INTO num_exp_div VALUES (1,3,'0');
--Testcase 57:
INSERT INTO num_exp_add VALUES (1,4,'7799461.4119');
--Testcase 58:
INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119');
--Testcase 59:
INSERT INTO num_exp_mul VALUES (1,4,'0');
--Testcase 60:
INSERT INTO num_exp_div VALUES (1,4,'0');
--Testcase 61:
INSERT INTO num_exp_add VALUES (1,5,'16397.038491');
--Testcase 62:
INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491');
--Testcase 63:
INSERT INTO num_exp_mul VALUES (1,5,'0');
--Testcase 64:
INSERT INTO num_exp_div VALUES (1,5,'0');
--Testcase 65:
INSERT INTO num_exp_add VALUES (1,6,'93901.57763026');
--Testcase 66:
INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026');
--Testcase 67:
INSERT INTO num_exp_mul VALUES (1,6,'0');
--Testcase 68:
INSERT INTO num_exp_div VALUES (1,6,'0');
--Testcase 69:
INSERT INTO num_exp_add VALUES (1,7,'-83028485');
--Testcase 70:
INSERT INTO num_exp_sub VALUES (1,7,'83028485');
--Testcase 71:
INSERT INTO num_exp_mul VALUES (1,7,'0');
--Testcase 72:
INSERT INTO num_exp_div VALUES (1,7,'0');
--Testcase 73:
INSERT INTO num_exp_add VALUES (1,8,'74881');
--Testcase 74:
INSERT INTO num_exp_sub VALUES (1,8,'-74881');
--Testcase 75:
INSERT INTO num_exp_mul VALUES (1,8,'0');
--Testcase 76:
INSERT INTO num_exp_div VALUES (1,8,'0');
--Testcase 77:
INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420');
--Testcase 78:
INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420');
--Testcase 79:
INSERT INTO num_exp_mul VALUES (1,9,'0');
--Testcase 80:
INSERT INTO num_exp_div VALUES (1,9,'0');
--Testcase 81:
INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047');
--Testcase 82:
INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047');
--Testcase 83:
INSERT INTO num_exp_mul VALUES (2,0,'0');
--Testcase 84:
INSERT INTO num_exp_div VALUES (2,0,'NaN');
--Testcase 85:
INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047');
--Testcase 86:
INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047');
--Testcase 87:
INSERT INTO num_exp_mul VALUES (2,1,'0');
--Testcase 88:
INSERT INTO num_exp_div VALUES (2,1,'NaN');
--Testcase 89:
INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094');
--Testcase 90:
INSERT INTO num_exp_sub VALUES (2,2,'0');
--Testcase 91:
INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209');
--Testcase 92:
INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000');
--Testcase 93:
INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047');
--Testcase 94:
INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047');
--Testcase 95:
INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257');
--Testcase 96:
INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266');
--Testcase 97:
INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047');
--Testcase 98:
INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047');
--Testcase 99:
INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593');
--Testcase 100:
INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685');
--Testcase 101:
INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047');
--Testcase 102:
INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047');
--Testcase 103:
INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077');
--Testcase 104:
INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429');
--Testcase 105:
INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787');
--Testcase 106:
INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307');
--Testcase 107:
INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222');
--Testcase 108:
INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940');
--Testcase 109:
INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047');
--Testcase 110:
INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953');
--Testcase 111:
INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795');
--Testcase 112:
INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518');
--Testcase 113:
INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047');
--Testcase 114:
INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047');
--Testcase 115:
INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407');
--Testcase 116:
INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476');
--Testcase 117:
INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467');
--Testcase 118:
INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627');
--Testcase 119:
INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740');
--Testcase 120:
INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811');
--Testcase 121:
INSERT INTO num_exp_add VALUES (3,0,'4.31');
--Testcase 122:
INSERT INTO num_exp_sub VALUES (3,0,'4.31');
--Testcase 123:
INSERT INTO num_exp_mul VALUES (3,0,'0');
--Testcase 124:
INSERT INTO num_exp_div VALUES (3,0,'NaN');
--Testcase 125:
INSERT INTO num_exp_add VALUES (3,1,'4.31');
--Testcase 126:
INSERT INTO num_exp_sub VALUES (3,1,'4.31');
--Testcase 127:
INSERT INTO num_exp_mul VALUES (3,1,'0');
--Testcase 128:
INSERT INTO num_exp_div VALUES (3,1,'NaN');
--Testcase 129:
INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047');
--Testcase 130:
INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047');
--Testcase 131:
INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257');
--Testcase 132:
INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352');
--Testcase 133:
INSERT INTO num_exp_add VALUES (3,3,'8.62');
--Testcase 134:
INSERT INTO num_exp_sub VALUES (3,3,'0');
--Testcase 135:
INSERT INTO num_exp_mul VALUES (3,3,'18.5761');
--Testcase 136:
INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000');
--Testcase 137:
INSERT INTO num_exp_add VALUES (3,4,'7799465.7219');
--Testcase 138:
INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019');
--Testcase 139:
INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289');
--Testcase 140:
INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552');
--Testcase 141:
INSERT INTO num_exp_add VALUES (3,5,'16401.348491');
--Testcase 142:
INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491');
--Testcase 143:
INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621');
--Testcase 144:
INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504');
--Testcase 145:
INSERT INTO num_exp_add VALUES (3,6,'93905.88763026');
--Testcase 146:
INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026');
--Testcase 147:
INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206');
--Testcase 148:
INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595');
--Testcase 149:
INSERT INTO num_exp_add VALUES (3,7,'-83028480.69');
--Testcase 150:
INSERT INTO num_exp_sub VALUES (3,7,'83028489.31');
--Testcase 151:
INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35');
--Testcase 152:
INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240');
--Testcase 153:
INSERT INTO num_exp_add VALUES (3,8,'74885.31');
--Testcase 154:
INSERT INTO num_exp_sub VALUES (3,8,'-74876.69');
--Testcase 155:
INSERT INTO num_exp_mul VALUES (3,8,'322737.11');
--Testcase 156:
INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553');
--Testcase 157:
INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420');
--Testcase 158:
INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420');
--Testcase 159:
INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020');
--Testcase 160:
INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854');
--Testcase 161:
INSERT INTO num_exp_add VALUES (4,0,'7799461.4119');
--Testcase 162:
INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119');
--Testcase 163:
INSERT INTO num_exp_mul VALUES (4,0,'0');
--Testcase 164:
INSERT INTO num_exp_div VALUES (4,0,'NaN');
--Testcase 165:
INSERT INTO num_exp_add VALUES (4,1,'7799461.4119');
--Testcase 166:
INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119');
--Testcase 167:
INSERT INTO num_exp_mul VALUES (4,1,'0');
--Testcase 168:
INSERT INTO num_exp_div VALUES (4,1,'NaN');
--Testcase 169:
INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047');
--Testcase 170:
INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047');
--Testcase 171:
INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593');
--Testcase 172:
INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385');
--Testcase 173:
INSERT INTO num_exp_add VALUES (4,3,'7799465.7219');
--Testcase 174:
INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019');
--Testcase 175:
INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289');
--Testcase 176:
INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883');
--Testcase 177:
INSERT INTO num_exp_add VALUES (4,4,'15598922.8238');
--Testcase 178:
INSERT INTO num_exp_sub VALUES (4,4,'0');
--Testcase 179:
INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161');
--Testcase 180:
INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000');
--Testcase 181:
INSERT INTO num_exp_add VALUES (4,5,'7815858.450391');
--Testcase 182:
INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409');
--Testcase 183:
INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429');
--Testcase 184:
INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061');
--Testcase 185:
INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026');
--Testcase 186:
INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974');
--Testcase 187:
INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094');
--Testcase 188:
INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606');
--Testcase 189:
INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881');
--Testcase 190:
INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119');
--Testcase 191:
INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715');
--Testcase 192:
INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637');
--Testcase 193:
INSERT INTO num_exp_add VALUES (4,8,'7874342.4119');
--Testcase 194:
INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119');
--Testcase 195:
INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839');
--Testcase 196:
INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143');
--Testcase 197:
INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420');
--Testcase 198:
INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420');
--Testcase 199:
INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980');
--Testcase 200:
INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409');
--Testcase 201:
INSERT INTO num_exp_add VALUES (5,0,'16397.038491');
--Testcase 202:
INSERT INTO num_exp_sub VALUES (5,0,'16397.038491');
--Testcase 203:
INSERT INTO num_exp_mul VALUES (5,0,'0');
--Testcase 204:
INSERT INTO num_exp_div VALUES (5,0,'NaN');
--Testcase 205:
INSERT INTO num_exp_add VALUES (5,1,'16397.038491');
--Testcase 206:
INSERT INTO num_exp_sub VALUES (5,1,'16397.038491');
--Testcase 207:
INSERT INTO num_exp_mul VALUES (5,1,'0');
--Testcase 208:
INSERT INTO num_exp_div VALUES (5,1,'NaN');
--Testcase 209:
INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047');
--Testcase 210:
INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047');
--Testcase 211:
INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077');
--Testcase 212:
INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446');
--Testcase 213:
INSERT INTO num_exp_add VALUES (5,3,'16401.348491');
--Testcase 214:
INSERT INTO num_exp_sub VALUES (5,3,'16392.728491');
--Testcase 215:
INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621');
--Testcase 216:
INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584');
--Testcase 217:
INSERT INTO num_exp_add VALUES (5,4,'7815858.450391');
--Testcase 218:
INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409');
--Testcase 219:
INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429');
--Testcase 220:
INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192');
--Testcase 221:
INSERT INTO num_exp_add VALUES (5,5,'32794.076982');
--Testcase 222:
INSERT INTO num_exp_sub VALUES (5,5,'0');
--Testcase 223:
INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081');
--Testcase 224:
INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000');
--Testcase 225:
INSERT INTO num_exp_add VALUES (5,6,'110298.61612126');
--Testcase 226:
INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926');
--Testcase 227:
INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766');
--Testcase 228:
INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689');
--Testcase 229:
INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509');
--Testcase 230:
INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491');
--Testcase 231:
INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135');
--Testcase 232:
INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710');
--Testcase 233:
INSERT INTO num_exp_add VALUES (5,8,'91278.038491');
--Testcase 234:
INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509');
--Testcase 235:
INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571');
--Testcase 236:
INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228');
--Testcase 237:
INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420');
--Testcase 238:
INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420');
--Testcase 239:
INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220');
--Testcase 240:
INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427');
--Testcase 241:
INSERT INTO num_exp_add VALUES (6,0,'93901.57763026');
--Testcase 242:
INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026');
--Testcase 243:
INSERT INTO num_exp_mul VALUES (6,0,'0');
--Testcase 244:
INSERT INTO num_exp_div VALUES (6,0,'NaN');
--Testcase 245:
INSERT INTO num_exp_add VALUES (6,1,'93901.57763026');
--Testcase 246:
INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026');
--Testcase 247:
INSERT INTO num_exp_mul VALUES (6,1,'0');
--Testcase 248:
INSERT INTO num_exp_div VALUES (6,1,'NaN');
--Testcase 249:
INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787');
--Testcase 250:
INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307');
--Testcase 251:
INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222');
--Testcase 252:
INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823');
--Testcase 253:
INSERT INTO num_exp_add VALUES (6,3,'93905.88763026');
--Testcase 254:
INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026');
--Testcase 255:
INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206');
--Testcase 256:
INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907');
--Testcase 257:
INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026');
--Testcase 258:
INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974');
--Testcase 259:
INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094');
--Testcase 260:
INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469');
--Testcase 261:
INSERT INTO num_exp_add VALUES (6,5,'110298.61612126');
--Testcase 262:
INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926');
--Testcase 263:
INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766');
--Testcase 264:
INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679');
--Testcase 265:
INSERT INTO num_exp_add VALUES (6,6,'187803.15526052');
--Testcase 266:
INSERT INTO num_exp_sub VALUES (6,6,'0');
--Testcase 267:
INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676');
--Testcase 268:
INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000');
--Testcase 269:
INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974');
--Testcase 270:
INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026');
--Testcase 271:
INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610');
--Testcase 272:
INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980');
--Testcase 273:
INSERT INTO num_exp_add VALUES (6,8,'168782.57763026');
--Testcase 274:
INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026');
--Testcase 275:
INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906');
--Testcase 276:
INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184');
--Testcase 277:
INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160');
--Testcase 278:
INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680');
--Testcase 279:
INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920');
--Testcase 280:
INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789');
--Testcase 281:
INSERT INTO num_exp_add VALUES (7,0,'-83028485');
--Testcase 282:
INSERT INTO num_exp_sub VALUES (7,0,'-83028485');
--Testcase 283:
INSERT INTO num_exp_mul VALUES (7,0,'0');
--Testcase 284:
INSERT INTO num_exp_div VALUES (7,0,'NaN');
--Testcase 285:
INSERT INTO num_exp_add VALUES (7,1,'-83028485');
--Testcase 286:
INSERT INTO num_exp_sub VALUES (7,1,'-83028485');
--Testcase 287:
INSERT INTO num_exp_mul VALUES (7,1,'0');
--Testcase 288:
INSERT INTO num_exp_div VALUES (7,1,'NaN');
--Testcase 289:
INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047');
--Testcase 290:
INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953');
--Testcase 291:
INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795');
--Testcase 292:
INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700');
--Testcase 293:
INSERT INTO num_exp_add VALUES (7,3,'-83028480.69');
--Testcase 294:
INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31');
--Testcase 295:
INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35');
--Testcase 296:
INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974');
--Testcase 297:
INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881');
--Testcase 298:
INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119');
--Testcase 299:
INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715');
--Testcase 300:
INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686');
--Testcase 301:
INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509');
--Testcase 302:
INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491');
--Testcase 303:
INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135');
--Testcase 304:
INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574');
--Testcase 305:
INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974');
--Testcase 306:
INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026');
--Testcase 307:
INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610');
--Testcase 308:
INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294');
--Testcase 309:
INSERT INTO num_exp_add VALUES (7,7,'-166056970');
--Testcase 310:
INSERT INTO num_exp_sub VALUES (7,7,'0');
--Testcase 311:
INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225');
--Testcase 312:
INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000');
--Testcase 313:
INSERT INTO num_exp_add VALUES (7,8,'-82953604');
--Testcase 314:
INSERT INTO num_exp_sub VALUES (7,8,'-83103366');
--Testcase 315:
INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285');
--Testcase 316:
INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118');
--Testcase 317:
INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420');
--Testcase 318:
INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580');
--Testcase 319:
INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700');
--Testcase 320:
INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382');
--Testcase 321:
INSERT INTO num_exp_add VALUES (8,0,'74881');
--Testcase 322:
INSERT INTO num_exp_sub VALUES (8,0,'74881');
--Testcase 323:
INSERT INTO num_exp_mul VALUES (8,0,'0');
--Testcase 324:
INSERT INTO num_exp_div VALUES (8,0,'NaN');
--Testcase 325:
INSERT INTO num_exp_add VALUES (8,1,'74881');
--Testcase 326:
INSERT INTO num_exp_sub VALUES (8,1,'74881');
--Testcase 327:
INSERT INTO num_exp_mul VALUES (8,1,'0');
--Testcase 328:
INSERT INTO num_exp_div VALUES (8,1,'NaN');
--Testcase 329:
INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047');
--Testcase 330:
INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047');
--Testcase 331:
INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407');
--Testcase 332:
INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615');
--Testcase 333:
INSERT INTO num_exp_add VALUES (8,3,'74885.31');
--Testcase 334:
INSERT INTO num_exp_sub VALUES (8,3,'74876.69');
--Testcase 335:
INSERT INTO num_exp_mul VALUES (8,3,'322737.11');
--Testcase 336:
INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410');
--Testcase 337:
INSERT INTO num_exp_add VALUES (8,4,'7874342.4119');
--Testcase 338:
INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119');
--Testcase 339:
INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839');
--Testcase 340:
INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956');
--Testcase 341:
INSERT INTO num_exp_add VALUES (8,5,'91278.038491');
--Testcase 342:
INSERT INTO num_exp_sub VALUES (8,5,'58483.961509');
--Testcase 343:
INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571');
--Testcase 344:
INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456');
--Testcase 345:
INSERT INTO num_exp_add VALUES (8,6,'168782.57763026');
--Testcase 346:
INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026');
--Testcase 347:
INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906');
--Testcase 348:
INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424');
--Testcase 349:
INSERT INTO num_exp_add VALUES (8,7,'-82953604');
--Testcase 350:
INSERT INTO num_exp_sub VALUES (8,7,'83103366');
--Testcase 351:
INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285');
--Testcase 352:
INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172');
--Testcase 353:
INSERT INTO num_exp_add VALUES (8,8,'149762');
--Testcase 354:
INSERT INTO num_exp_sub VALUES (8,8,'0');
--Testcase 355:
INSERT INTO num_exp_mul VALUES (8,8,'5607164161');
--Testcase 356:
INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000');
--Testcase 357:
INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420');
--Testcase 358:
INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420');
--Testcase 359:
INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020');
--Testcase 360:
INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735');
--Testcase 361:
INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420');
--Testcase 362:
INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420');
--Testcase 363:
INSERT INTO num_exp_mul VALUES (9,0,'0');
--Testcase 364:
INSERT INTO num_exp_div VALUES (9,0,'NaN');
--Testcase 365:
INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420');
--Testcase 366:
INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420');
--Testcase 367:
INSERT INTO num_exp_mul VALUES (9,1,'0');
--Testcase 368:
INSERT INTO num_exp_div VALUES (9,1,'NaN');
--Testcase 369:
INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467');
--Testcase 370:
INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627');
--Testcase 371:
INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740');
--Testcase 372:
INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526');
--Testcase 373:
INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420');
--Testcase 374:
INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420');
--Testcase 375:
INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020');
--Testcase 376:
INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677');
--Testcase 377:
INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420');
--Testcase 378:
INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420');
--Testcase 379:
INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980');
--Testcase 380:
INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484');
--Testcase 381:
INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420');
--Testcase 382:
INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420');
--Testcase 383:
INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220');
--Testcase 384:
INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807');
--Testcase 385:
INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160');
--Testcase 386:
INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680');
--Testcase 387:
INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920');
--Testcase 388:
INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280');
--Testcase 389:
INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420');
--Testcase 390:
INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580');
--Testcase 391:
INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700');
--Testcase 392:
INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689');
--Testcase 393:
INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420');
--Testcase 394:
INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420');
--Testcase 395:
INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020');
--Testcase 396:
INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748');
--Testcase 397:
INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840');
--Testcase 398:
INSERT INTO num_exp_sub VALUES (9,9,'0');
--Testcase 399:
INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400');
--Testcase 400:
INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 401:
INSERT INTO num_exp_sqrt VALUES (0,'0');
--Testcase 402:
INSERT INTO num_exp_sqrt VALUES (1,'0');
--Testcase 403:
INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505');
--Testcase 404:
INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396');
--Testcase 405:
INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923');
--Testcase 406:
INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473');
--Testcase 407:
INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406');
--Testcase 408:
INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230');
--Testcase 409:
INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542');
--Testcase 410:
INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 411:
INSERT INTO num_exp_ln VALUES (0,'NaN');
--Testcase 412:
INSERT INTO num_exp_ln VALUES (1,'NaN');
--Testcase 413:
INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514');
--Testcase 414:
INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971');
--Testcase 415:
INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464');
--Testcase 416:
INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038');
--Testcase 417:
INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127');
--Testcase 418:
INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991');
--Testcase 419:
INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668');
--Testcase 420:
INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 421:
INSERT INTO num_exp_log10 VALUES (0,'NaN');
--Testcase 422:
INSERT INTO num_exp_log10 VALUES (1,'NaN');
--Testcase 423:
INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459');
--Testcase 424:
INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075');
--Testcase 425:
INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345');
--Testcase 426:
INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626');
--Testcase 427:
INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671');
--Testcase 428:
INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914');
--Testcase 429:
INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138');
--Testcase 430:
INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 431:
INSERT INTO num_exp_power_10_ln VALUES (0,'NaN');
--Testcase 432:
INSERT INTO num_exp_power_10_ln VALUES (1,'NaN');
--Testcase 433:
INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184');
--Testcase 434:
INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393');
--Testcase 435:
INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636');
--Testcase 436:
INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098');
--Testcase 437:
INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067');
--Testcase 438:
INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627');
--Testcase 439:
INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952');
--Testcase 440:
INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457');
COMMIT TRANSACTION;
BEGIN TRANSACTION;
--Testcase 441:
INSERT INTO num_data VALUES (0, '0');
--Testcase 442:
INSERT INTO num_data VALUES (1, '0');
--Testcase 443:
INSERT INTO num_data VALUES (2, '-34338492.215397047');
--Testcase 444:
INSERT INTO num_data VALUES (3, '4.31');
--Testcase 445:
INSERT INTO num_data VALUES (4, '7799461.4119');
--Testcase 446:
INSERT INTO num_data VALUES (5, '16397.038491');
--Testcase 447:
INSERT INTO num_data VALUES (6, '93901.57763026');
--Testcase 448:
INSERT INTO num_data VALUES (7, '-83028485');
--Testcase 449:
INSERT INTO num_data VALUES (8, '74881');
--Testcase 450:
INSERT INTO num_data VALUES (9, '-24926804.045047420');
COMMIT TRANSACTION;
-- ******************************
-- * Create indices for faster checks
-- ******************************
-- Skip these setting, creating foreign table with primary key already covered.
--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
-- ******************************
--Testcase 451:
DELETE FROM num_result;
--Testcase 452:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val
FROM num_data t1, num_data t2;
--Testcase 453:
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;
--Testcase 454:
DELETE FROM num_result;
--Testcase 455:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10)
FROM num_data t1, num_data t2;
--Testcase 456:
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
-- ******************************
--Testcase 457:
DELETE FROM num_result;
--Testcase 458:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val
FROM num_data t1, num_data t2;
--Testcase 459:
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;
--Testcase 460:
DELETE FROM num_result;
--Testcase 461:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40)
FROM num_data t1, num_data t2;
--Testcase 462:
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
-- ******************************
--Testcase 463:
DELETE FROM num_result;
--Testcase 464:
INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val
FROM num_data t1, num_data t2;
--Testcase 465:
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;
--Testcase 466:
DELETE FROM num_result;
--Testcase 467:
INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30)
FROM num_data t1, num_data t2;
--Testcase 468:
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
-- ******************************
--Testcase 469:
DELETE FROM num_result;
--Testcase 470:
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';
--Testcase 471:
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;
--Testcase 472:
DELETE FROM num_result;
--Testcase 473:
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';
--Testcase 474:
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
-- ******************************
--Testcase 475:
DELETE FROM num_result;
--Testcase 476:
INSERT INTO num_result SELECT id, 0, SQRT(ABS(val))
FROM num_data;
--Testcase 477:
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
-- ******************************
--Testcase 478:
DELETE FROM num_result;
--Testcase 479:
INSERT INTO num_result SELECT id, 0, LN(ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 480:
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
-- ******************************
--Testcase 481:
DELETE FROM num_result;
--Testcase 482:
INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val))
FROM num_data
WHERE val != '0.0';
--Testcase 483:
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
-- ******************************
--Testcase 484:
DELETE FROM num_result;
--Testcase 485:
INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
FROM num_data
WHERE val != '0.0';
--Testcase 486:
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.
-- ******************************
--Testcase 1451:
CREATE FOREIGN TABLE v (id int4 OPTIONS (key 'true'), x numeric, val float8) SERVER sqlite_svr;
BEGIN;
--Testcase 1452:
DELETE FROM v;
--Testcase 1453:
INSERT INTO v(x) VALUES ('0'::float8),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan');
--Testcase 1454:
SELECT x1, x2,
x1::numeric + x2::numeric AS sum,
x1::numeric - x2::numeric AS diff,
x1::numeric * x2::numeric AS prod
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1455:
SELECT x1, x2,
x1::numeric / x2::numeric AS quot,
x1::numeric % x2::numeric AS mod,
div(x1::numeric, x2::numeric) AS div
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x2 != 0;
ROLLBACK;
BEGIN;
--Testcase 1286:
DELETE FROM v;
--Testcase 1287:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1288:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1289:
DELETE FROM v;
--Testcase 1290:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1291:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1292:
DELETE FROM v;
--Testcase 1293:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1294:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1295:
DELETE FROM v;
--Testcase 1296:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1297:
SELECT x::numeric / '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1298:
DELETE FROM v;
--Testcase 1299:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1300:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1301:
DELETE FROM v;
--Testcase 1302:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1303:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1304:
DELETE FROM v;
--Testcase 1305:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1306:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1307:
DELETE FROM v;
--Testcase 1308:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1309:
SELECT x::numeric % '0' FROM v;
ROLLBACK;
BEGIN;
--Testcase 1310:
DELETE FROM v;
--Testcase 1311:
INSERT INTO v(x) VALUES ('inf':: float8);
--Testcase 1312:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1313:
DELETE FROM v;
--Testcase 1314:
INSERT INTO v(x) VALUES ('-inf':: float8);
--Testcase 1315:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1316:
DELETE FROM v;
--Testcase 1317:
INSERT INTO v(x) VALUES ('nan':: float8);
--Testcase 1318:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1319:
DELETE FROM v;
--Testcase 1320:
INSERT INTO v(x) VALUES ('0':: float8);
--Testcase 1321:
SELECT div(x::numeric, '0') FROM v;
ROLLBACK;
BEGIN;
--Testcase 1456:
DELETE FROM v;
--Testcase 1457:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1458:
SELECT x, -x as minusx, abs(x::numeric), floor(x::numeric), ceil(x::numeric), sign(x::numeric), numeric_inc(x::numeric) as inc
FROM v;
ROLLBACK;
BEGIN;
--Testcase 1459:
DELETE FROM v;
--Testcase 1460:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan');
--Testcase 1461:
SELECT x, round(x::numeric), round(x::numeric,1) as round1, trunc(x::numeric), trunc(x::numeric,1) as trunc1
FROM v;
ROLLBACK;
-- the large values fall into the numeric abbreviation code's maximal classes
BEGIN;
--Testcase 1462:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),
('inf'),('-inf'),('nan'),
('inf'),('-inf'),('nan');
--Testcase 1463:
SELECT substring(x::text, 1, 32) FROM v ORDER BY x;
ROLLBACK;
--Testcase 1464:
DELETE FROM v;
--Testcase 1465:
INSERT INTO v(x) VALUES('0'::numeric),('1'),('4.2'),('inf'),('nan');
--Testcase 1466:
SELECT x, sqrt(x) FROM v;
--Testcase 1333:
DELETE FROM v;
--Testcase 1334:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1335:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1336:
DELETE FROM v;
--Testcase 1337:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1338:
SELECT sqrt(x::numeric) FROM v;
--Testcase 1467:
DELETE FROM v;
--Testcase 1468:
INSERT INTO v(x) VALUES ('1'::numeric),('4.2'),('inf'),('nan');
--Testcase 1469:
SELECT x,
log(x::numeric),
log10(x::numeric),
ln(x::numeric)
FROM v;
--Testcase 1342:
DELETE FROM v;
--Testcase 1343:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1344:
SELECT ln(x::numeric) FROM v;
--Testcase 1345:
DELETE FROM v;
--Testcase 1346:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1347:
SELECT ln(x::numeric) FROM v;
--Testcase 1348:
DELETE FROM v;
--Testcase 1349:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1350:
SELECT ln(x::numeric) FROM v;
--Testcase 1470:
DELETE FROM v;
--Testcase 1471:
INSERT INTO v(x) VALUES ('2'::numeric),('4.2'),('inf'),('nan');
--Testcase 1472:
SELECT x1, x2,
log(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2);
--Testcase 1354:
DELETE FROM v;
--Testcase 1355:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1356:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1357:
DELETE FROM v;
--Testcase 1358:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1359:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1360:
DELETE FROM v;
--Testcase 1361:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1362:
SELECT log(x::numeric, '10') FROM v;
--Testcase 1363:
DELETE FROM v;
--Testcase 1364:
INSERT INTO v(x) VALUES ('10'::float8);
--Testcase 1365:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1366:
DELETE FROM v;
--Testcase 1367:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1368:
SELECT log(x::numeric, '0') FROM v;
--Testcase 1369:
DELETE FROM v;
--Testcase 1370:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1371:
SELECT log(x::numeric, '-inf') FROM v;
--Testcase 1372:
DELETE FROM v;
--Testcase 1373:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1374:
SELECT log(x::numeric, 'inf') FROM v;
--Testcase 1473:
DELETE FROM v;
--Testcase 1474:
INSERT INTO v(x) VALUES ('0'::numeric),('1'),('2'),('4.2'),('inf'),('nan');
--Testcase 1475:
SELECT x1, x2,
power(x1::numeric, x2::numeric)
FROM v AS v1(id, x1), v AS v2(id, x2) WHERE x1 != 0 OR x2 >= 0;
--Testcase 1378:
DELETE FROM v;
--Testcase 1379:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1380:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1381:
DELETE FROM v;
--Testcase 1382:
INSERT INTO v(x) VALUES ('0'::float8);
--Testcase 1383:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1384:
DELETE FROM v;
--Testcase 1385:
INSERT INTO v(x) VALUES ('-1'::float8);
--Testcase 1386:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1387:
DELETE FROM v;
--Testcase 1388:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1389:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1390:
DELETE FROM v;
--Testcase 1391:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1392:
SELECT power(x::numeric, '3.3') FROM v;
--Testcase 1393:
DELETE FROM v;
--Testcase 1394:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1395:
SELECT power(x::numeric, '-1') FROM v;
--Testcase 1396:
DELETE FROM v;
--Testcase 1397:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1398:
SELECT power(x::numeric, '-1.5') FROM v;
--Testcase 1399:
DELETE FROM v;
--Testcase 1400:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1401:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1402:
DELETE FROM v;
--Testcase 1403:
INSERT INTO v(x) VALUES ('-2'::float8);
--Testcase 1404:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1405:
DELETE FROM v;
--Testcase 1406:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1407:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1408:
DELETE FROM v;
--Testcase 1409:
INSERT INTO v(x) VALUES ('inf'::float8);
--Testcase 1410:
SELECT power(x::numeric, '-inf') FROM v;
--Testcase 1411:
DELETE FROM v;
--Testcase 1412:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1413:
SELECT power(x::numeric, '2') FROM v;
--Testcase 1414:
DELETE FROM v;
--Testcase 1415:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1416:
SELECT power(x::numeric, '3') FROM v;
--Testcase 1417:
DELETE FROM v;
--Testcase 1418:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1419:
SELECT power(x::numeric, '4.5') FROM v;
--Testcase 1420:
DELETE FROM v;
--Testcase 1421:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1422:
SELECT power(x::numeric, '-2') FROM v;
--Testcase 1423:
DELETE FROM v;
--Testcase 1424:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1425:
SELECT power(x::numeric, '-3') FROM v;
--Testcase 1426:
DELETE FROM v;
--Testcase 1427:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1428:
SELECT power(x::numeric, '0') FROM v;
--Testcase 1429:
DELETE FROM v;
--Testcase 1430:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1431:
SELECT power(x::numeric, 'inf') FROM v;
--Testcase 1432:
DELETE FROM v;
--Testcase 1433:
INSERT INTO v(x) VALUES ('-inf'::float8);
--Testcase 1434:
SELECT power(x::numeric, '-inf') FROM v;
-- ******************************
-- * miscellaneous checks for things that have been broken in the past...
-- ******************************
-- numeric AVG used to fail on some platforms
--Testcase 487:
SELECT AVG(val) FROM num_data;
--Testcase 1137:
SELECT MAX(val) FROM num_data;
--Testcase 1138:
SELECT MIN(val) FROM num_data;
--Testcase 488:
SELECT STDDEV(val) FROM num_data;
--Testcase 489:
SELECT VARIANCE(val) FROM num_data;
-- Check for appropriate rounding and overflow
--Testcase 579:
CREATE FOREIGN TABLE fract_only (id int, val numeric(4,4)) SERVER sqlite_svr;
--Testcase 490:
INSERT INTO fract_only VALUES (1, '0.0');
--Testcase 491:
INSERT INTO fract_only VALUES (2, '0.1');
--Testcase 492:
INSERT INTO fract_only VALUES (3, '1.0'); -- should fail
--Testcase 493:
INSERT INTO fract_only VALUES (4, '-0.9999');
--Testcase 494:
INSERT INTO fract_only VALUES (5, '0.99994');
--Testcase 495:
INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail
--Testcase 496:
INSERT INTO fract_only VALUES (7, '0.00001');
--Testcase 497:
INSERT INTO fract_only VALUES (8, '0.00017');
--Testcase 1139:
INSERT INTO fract_only VALUES (9, 'NaN');
--Testcase 1140:
INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail
--Testcase 1141:
INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail
--Testcase 498:
SELECT * FROM fract_only;
--Testcase 580:
DROP FOREIGN TABLE fract_only;
-- Check conversion to integers
-- SQLite promises to preserve the first 15 significant decimal digits of the floating point value.
-- However, it makes no guarantees about the accuracy of computations on floating point values, as no such guarantees are possible.
-- A floating-point value as written in an SQL statement may not be the same as the value represented internally.
-- Actual result is different from expected result.
--Testcase 1485:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 1486:
DELETE FROM num_tmp;
--Testcase 1487:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.5);
--Testcase 1488:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1489:
DELETE FROM num_tmp;
--Testcase 1490:
INSERT INTO num_tmp(n1) VALUES (-9223372036854775808.4);
--Testcase 1491:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1492:
DELETE FROM num_tmp;
--Testcase 1493:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.4);
--Testcase 1494:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1495:
DELETE FROM num_tmp;
--Testcase 1496:
INSERT INTO num_tmp(n1) VALUES (9223372036854775807.5);
--Testcase 1497:
SELECT n1::int8 FROM num_tmp; -- should fail
--Testcase 1498:
DELETE FROM num_tmp;
--Testcase 1499:
INSERT INTO num_tmp(n1) VALUES (-2147483648.5);
--Testcase 1500:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1501:
DELETE FROM num_tmp;
--Testcase 1502:
INSERT INTO num_tmp(n1) VALUES (-2147483648.4);
--Testcase 1503:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1504:
DELETE FROM num_tmp;
--Testcase 1505:
INSERT INTO num_tmp(n1) VALUES (2147483647.4);
--Testcase 1506:
SELECT n1::int4 FROM num_tmp; -- ok
--Testcase 1507:
DELETE FROM num_tmp;
--Testcase 1508:
INSERT INTO num_tmp(n1) VALUES (2147483647.5);
--Testcase 1509:
SELECT n1::int4 FROM num_tmp; -- should fail
--Testcase 1510:
DELETE FROM num_tmp;
--Testcase 1511:
INSERT INTO num_tmp(n1) VALUES (-32768.5);
--Testcase 1512:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1513:
DELETE FROM num_tmp;
--Testcase 1514:
INSERT INTO num_tmp(n1) VALUES (-32768.4);
--Testcase 1515:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1516:
DELETE FROM num_tmp;
--Testcase 1517:
INSERT INTO num_tmp(n1) VALUES (32767.4);
--Testcase 1518:
SELECT n1::int2 FROM num_tmp; -- ok
--Testcase 1519:
DELETE FROM num_tmp;
--Testcase 1520:
INSERT INTO num_tmp(n1) VALUES (32767.5);
--Testcase 1521:
SELECT n1::int2 FROM num_tmp; -- should fail
--Testcase 1555:
DELETE FROM num_tmp;
--Testcase 1555:
DROP FOREIGN TABLE num_tmp;
-- Check inf/nan conversion behavior
--Testcase 581:
CREATE FOREIGN TABLE FLOAT8_TMP(f1 float8, f2 float8, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 582:
DELETE FROM FLOAT8_TMP;
--Testcase 583:
INSERT INTO FLOAT8_TMP VALUES ('NaN');
--Testcase 584:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 585:
DELETE FROM FLOAT8_TMP;
--Testcase 586:
INSERT INTO FLOAT8_TMP VALUES ('Infinity');
--Testcase 587:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 588:
DELETE FROM FLOAT8_TMP;
--Testcase 589:
INSERT INTO FLOAT8_TMP VALUES ('-Infinity');
--Testcase 590:
SELECT f1::numeric FROM FLOAT8_TMP;
--Testcase 1142:
CREATE FOREIGN TABLE NUMERIC_TMP(f1 numeric, f2 numeric, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 1143:
DELETE FROM NUMERIC_TMP;
--Testcase 1144:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1145:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1146:
DELETE FROM NUMERIC_TMP;
--Testcase 1147:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1148:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 1149:
DELETE FROM NUMERIC_TMP;
--Testcase 1150:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1151:
SELECT f1::float8 FROM NUMERIC_TMP;
--Testcase 591:
CREATE FOREIGN TABLE FLOAT4_TMP(f1 float4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 592:
DELETE FROM FLOAT4_TMP;
--Testcase 593:
INSERT INTO FLOAT4_TMP VALUES ('NaN');
--Testcase 594:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 595:
DELETE FROM FLOAT4_TMP;
--Testcase 596:
INSERT INTO FLOAT4_TMP VALUES ('Infinity');
--Testcase 597:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 598:
DELETE FROM FLOAT4_TMP;
--Testcase 599:
INSERT INTO FLOAT4_TMP VALUES ('-Infinity');
--Testcase 600:
SELECT f1::numeric FROM FLOAT4_TMP;
--Testcase 1152:
DELETE FROM NUMERIC_TMP;
--Testcase 1153:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1154:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1155:
DELETE FROM NUMERIC_TMP;
--Testcase 1156:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1157:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1158:
DELETE FROM NUMERIC_TMP;
--Testcase 1159:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1160:
SELECT f1::float4 FROM NUMERIC_TMP;
--Testcase 1161:
DELETE FROM NUMERIC_TMP;
--Testcase 1162:
INSERT INTO NUMERIC_TMP VALUES ('42'::int2);
--Testcase 1163:
SELECT f1::numeric FROM NUMERIC_TMP;
--Testcase 1164:
DELETE FROM NUMERIC_TMP;
--Testcase 1165:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1166:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1167:
DELETE FROM NUMERIC_TMP;
--Testcase 1168:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1169:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1170:
DELETE FROM NUMERIC_TMP;
--Testcase 1171:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1172:
SELECT f1::int2 FROM NUMERIC_TMP;
--Testcase 1173:
DELETE FROM NUMERIC_TMP;
--Testcase 1174:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1175:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1176:
DELETE FROM NUMERIC_TMP;
--Testcase 1177:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1178:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1179:
DELETE FROM NUMERIC_TMP;
--Testcase 1180:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1181:
SELECT f1::int4 FROM NUMERIC_TMP;
--Testcase 1182:
DELETE FROM NUMERIC_TMP;
--Testcase 1183:
INSERT INTO NUMERIC_TMP VALUES ('NaN');
--Testcase 1184:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1185:
DELETE FROM NUMERIC_TMP;
--Testcase 1186:
INSERT INTO NUMERIC_TMP VALUES ('Infinity');
--Testcase 1187:
SELECT f1::int8 FROM NUMERIC_TMP;
--Testcase 1188:
DELETE FROM NUMERIC_TMP;
--Testcase 1189:
INSERT INTO NUMERIC_TMP VALUES ('-Infinity');
--Testcase 1190:
SELECT f1::int8 FROM NUMERIC_TMP;
-- Simple check that ceil(), floor(), and round() work correctly
--Testcase 601:
CREATE FOREIGN TABLE ceil_floor_round (a numeric OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 499:
INSERT INTO ceil_floor_round VALUES ('-5.5');
--Testcase 500:
INSERT INTO ceil_floor_round VALUES ('-5.499999');
--Testcase 501:
INSERT INTO ceil_floor_round VALUES ('9.5');
--Testcase 502:
INSERT INTO ceil_floor_round VALUES ('9.4999999');
--Testcase 503:
INSERT INTO ceil_floor_round VALUES ('0.0');
--Testcase 504:
INSERT INTO ceil_floor_round VALUES ('0.0000001');
--Testcase 505:
INSERT INTO ceil_floor_round VALUES ('-0.000001');
--Testcase 506:
SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round ORDER BY a;
-- Check rounding, it should round ties away from zero.
--Testcase 602:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 603:
DELETE FROM INT4_TMP;
--Testcase 604:
INSERT INTO INT4_TMP SELECT a FROM generate_series(-5,5) a;
--Testcase 605:
SELECT f1 as pow,
round((-2.5 * 10 ^ f1)::numeric, -f1),
round((-1.5 * 10 ^ f1)::numeric, -f1),
round((-0.5 * 10 ^ f1)::numeric, -f1),
round((0.5 * 10 ^ f1)::numeric, -f1),
round((1.5 * 10 ^ f1)::numeric, -f1),
round((2.5 * 10 ^ f1)::numeric, -f1)
FROM INT4_TMP;
-- These cases contain out of range value for type double precision, cannot insert into foreign table.
-- -- Check limits of rounding before the decimal point
-- SELECT round(4.4e131071, -131071) = 4e131071;
-- SELECT round(4.5e131071, -131071) = 5e131071;
-- SELECT round(4.5e131071, -131072); -- loses all digits
-- SELECT round(5.5e131071, -131072); -- rounds up and overflows
-- SELECT round(5.5e131071, -131073); -- loses all digits
-- SELECT round(5.5e131071, -1000000); -- loses all digits
-- -- Check limits of rounding after the decimal point
-- SELECT round(5e-16383, 1000000) = 5e-16383;
-- SELECT round(5e-16383, 16383) = 5e-16383;
-- SELECT round(5e-16383, 16382) = 1e-16382;
-- SELECT round(5e-16383, 16381) = 0;
-- -- Check limits of trunc() before the decimal point
-- SELECT trunc(9.9e131071, -131071) = 9e131071;
-- SELECT trunc(9.9e131071, -131072); -- loses all digits
-- SELECT trunc(9.9e131071, -131073); -- loses all digits
-- SELECT trunc(9.9e131071, -1000000); -- loses all digits
-- -- Check limits of trunc() after the decimal point
-- SELECT trunc(5e-16383, 1000000) = 5e-16383;
-- SELECT trunc(5e-16383, 16383) = 5e-16383;
-- SELECT trunc(5e-16383, 16382) = 0;
-- Testing for width_bucket(). For convenience, we test both the
-- numeric and float8 versions of the function in this file.
-- errors
--Testcase 606:
CREATE FOREIGN TABLE width_bucket_tbl (
id1 numeric,
id2 numeric,
id3 numeric,
id4 int,
id int OPTIONS (key 'true')
) SERVER sqlite_svr;
--Testcase 607:
DELETE FROM width_bucket_tbl;
--Testcase 608:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 609:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 610:
DELETE FROM width_bucket_tbl;
--Testcase 611:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 612:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 613:
DELETE FROM width_bucket_tbl;
--Testcase 614:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 615:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 616:
DELETE FROM width_bucket_tbl;
--Testcase 617:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, 0);
--Testcase 618:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 619:
DELETE FROM width_bucket_tbl;
--Testcase 620:
INSERT INTO width_bucket_tbl VALUES (5.0, 3.0, 4.0, -5);
--Testcase 621:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 622:
DELETE FROM width_bucket_tbl;
--Testcase 623:
INSERT INTO width_bucket_tbl VALUES (3.5, 3.0, 3.0, 888);
--Testcase 624:
SELECT width_bucket(id1::float8, id2::float8, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 625:
DELETE FROM width_bucket_tbl;
--Testcase 626:
INSERT INTO width_bucket_tbl VALUES ('NaN'::numeric, 3.0, 4.0, 888);
--Testcase 627:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 628:
DELETE FROM width_bucket_tbl;
--Testcase 629:
INSERT INTO width_bucket_tbl VALUES (0, 'NaN'::numeric, 4.0, 888);
--Testcase 630:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
--Testcase 1191:
DELETE FROM width_bucket_tbl;
--Testcase 1192:
INSERT INTO width_bucket_tbl VALUES (2.0, 3.0, '-inf'::numeric, 888);
--Testcase 1193:
SELECT width_bucket(id1, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 1194:
DELETE FROM width_bucket_tbl;
--Testcase 1195:
INSERT INTO width_bucket_tbl VALUES (0, '-inf'::numeric, 4.0 , 888);
--Testcase 1196:
SELECT width_bucket(id1::float8, id2, id3::float8, id4) FROM width_bucket_tbl;
-- normal operation
--Testcase 631:
CREATE FOREIGN TABLE width_bucket_test (
operand_num numeric OPTIONS (key 'true'),
operand_f8 float8
) SERVER sqlite_svr;
--COPY width_bucket_test (operand_num) FROM stdin;
--Testcase 507:
INSERT INTO width_bucket_test (operand_num) 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);
--Testcase 508:
UPDATE width_bucket_test SET operand_f8 = operand_num::float8;
--Testcase 509:
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
--Testcase 1197:
DELETE FROM width_bucket_tbl;
--Testcase 1198:
INSERT INTO width_bucket_tbl VALUES (0.0, 'Infinity'::numeric , 5, 10);
--Testcase 1199:
SELECT width_bucket(id1::numeric, 'Infinity'::numeric, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 1200:
DELETE FROM width_bucket_tbl;
--Testcase 1201:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, '-Infinity'::numeric, 20);
--Testcase 1202:
SELECT width_bucket(id1::numeric, id2, '-Infinity'::numeric, id4) FROM width_bucket_tbl; -- error
--Testcase 1203:
DELETE FROM width_bucket_tbl;
--Testcase 1204:
INSERT INTO width_bucket_tbl VALUES ('Infinity'::numeric, 1, 10, 10), ('-Infinity'::numeric, 1, 10, 10);
--Testcase 1205:
SELECT width_bucket(id1::numeric, id2, id3, id4) FROM width_bucket_tbl;
--Testcase 510:
DELETE FROM width_bucket_tbl;
-- postgres does not support insert 'Infinity' and '-Infinity' as numeric.
--Testcase 632:
INSERT INTO width_bucket_tbl VALUES (0.0, 0.0, 5, 10);
--Testcase 633:
SELECT width_bucket(id1::float8, 'Infinity'::float8, id3, id4) FROM width_bucket_tbl; -- error
--Testcase 511:
DELETE FROM width_bucket_tbl;
--Testcase 634:
INSERT INTO width_bucket_tbl VALUES (0.0, 5, 0.0, 20);
--Testcase 635:
SELECT width_bucket(id1::float8, id2, 'Infinity'::float8, id4) FROM width_bucket_tbl; -- error
--Testcase 512:
DELETE FROM width_bucket_tbl;
--Testcase 636:
INSERT INTO width_bucket_tbl VALUES (0.0, 1, 10, 10);
--Testcase 637:
SELECT width_bucket('Infinity'::float8, id2, id3, id4), width_bucket('-Infinity'::float8, id2, id3, id4) FROM width_bucket_tbl;
-- Simple test for roundoff error when results should be exact
--Testcase 1445:
DELETE FROM width_bucket_tbl;
--Testcase 1446:
INSERT INTO width_bucket_tbl SELECT x, 10, 100, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1447:
SELECT id1, width_bucket(id1::float8, id2, id3, id4) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
--Testcase 1448:
DELETE FROM width_bucket_tbl;
--Testcase 1449:
INSERT INTO width_bucket_tbl SELECT x, 100, 10, 9 FROM generate_series(0, 110, 10) x;
--Testcase 1450:
SELECT id1, width_bucket(id1::float8, 100, 10, 9) as flt,
width_bucket(id1::numeric, id2, id3, id4) as num FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(0, -1e100::numeric, 1, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(0, -1e100::float8, 1, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(1, 1e100::numeric, 0, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
DELETE FROM width_bucket_tbl;
INSERT INTO width_bucket_tbl VALUES(1, 1e100::float8, 0, 10);
SELECT width_bucket(id1, id2::numeric, id3, id4) FROM width_bucket_tbl;
-- Check cases that could trigger overflow or underflow within the calculation
SELECT oper, low, high, cnt, width_bucket(oper, low, high, cnt)
FROM
(SELECT 1.797e+308::float8 AS big, 5e-324::float8 AS tiny) as v,
LATERAL (VALUES
(10.5::float8, -big, big, 1),
(10.5::float8, -big, big, 2),
(10.5::float8, -big, big, 3),
(big / 4, -big / 2, big / 2, 10),
(10.5::float8, big, -big, 1),
(10.5::float8, big, -big, 2),
(10.5::float8, big, -big, 3),
(big / 4, big / 2, -big / 2, 10),
(0, 0, tiny, 4),
(tiny, 0, tiny, 4),
(0, 0, 1, 2147483647),
(1, 1, 0, 2147483647)
) as sample(oper, low, high, cnt);
-- These fail because the result would be out of int32 range:
-- Do not convert to check right.
SELECT width_bucket(1::float8, 0, 1, 2147483647);
SELECT width_bucket(0::float8, 1, 0, 2147483647);
--Testcase 638:
DROP FOREIGN TABLE width_bucket_test;
-- TO_CHAR()
--
--Testcase 513:
SELECT to_char(val, '9G999G999G999G999G999')
FROM num_data;
--Testcase 514:
SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999')
FROM num_data;
--Testcase 515:
SELECT to_char(val, '9999999999999999.999999999999999PR')
FROM num_data;
--Testcase 516:
SELECT to_char(val, '9999999999999999.999999999999999S')
FROM num_data;
--Testcase 517:
SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data;
--Testcase 518:
SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data;
--Testcase 519:
SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data;
--Testcase 520:
SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data;
--Testcase 521:
SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data;
--Testcase 522:
SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data;
--Testcase 523:
SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data;
--Testcase 524:
SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data;
--Testcase 525:
SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data;
--Testcase 526:
SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data;
--Testcase 527:
SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data;
--Testcase 528:
SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data;
--Testcase 529:
SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data;
--Testcase 530:
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;
--Testcase 531:
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;
--Testcase 532:
SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data;
--Testcase 533:
SELECT to_char(val, '999999SG9999999999') FROM num_data;
--Testcase 534:
SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data;
--Testcase 535:
SELECT to_char(val, '9.999EEEE') FROM num_data;
--Testcase 1476:
DELETE FROM v;
--Testcase 1477:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1478:
SELECT x,
to_char(x, '9.999EEEE') as numeric,
to_char(x::float8, '9.999EEEE') as float8,
to_char(x::float4, '9.999EEEE') as float4
FROM v;
--Testcase 1522:
DELETE FROM v;
--Testcase 1523:
INSERT INTO v(x) VALUES (-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0),
(1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071);
--Testcase 1524:
SELECT x,
to_char(('1.2345e'||x)::numeric, '9.999EEEE') as numeric
FROM v;
--Testcase 1479:
DELETE FROM v;
--Testcase 1480:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1481:
SELECT x,
to_char(x, 'MI9999999999.99') as numeric,
to_char(x::float8, 'MI9999999999.99') as float8,
to_char(x::float4, 'MI9999999999.99') as float4
FROM v;
--Testcase 1482:
DELETE FROM v;
--Testcase 1483:
INSERT INTO v(x) VALUES ('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan');
--Testcase 1484:
SELECT x,
to_char(x, 'MI99.99') as numeric,
to_char(x::float8, 'MI99.99') as float8,
to_char(x::float4, 'MI99.99') as float4
FROM v;
--Testcase 536:
DELETE FROM ceil_floor_round;
--Testcase 537:
INSERT INTO ceil_floor_round VALUES ('100'::numeric);
--Testcase 538:
SELECT to_char(a, 'FM999.9') FROM ceil_floor_round;
--Testcase 539:
SELECT to_char(a, 'FM999.') FROM ceil_floor_round;
--Testcase 540:
SELECT to_char(a, 'FM999') FROM ceil_floor_round;
CREATE FOREIGN TABLE ceil_round_float8(a float8) SERVER sqlite_svr;
INSERT INTO ceil_round_float8 VALUES ('12345678901'::float8);
SELECT to_char(a, 'FM9999999999D9999900000000000000000') FROM ceil_round_float8;
-- Check parsing of literal text in a format string
--Testcase 541:
SELECT to_char(a, 'foo999') FROM ceil_floor_round;
--Testcase 542:
SELECT to_char(a, 'f\oo999') FROM ceil_floor_round;
--Testcase 543:
SELECT to_char(a, 'f\\oo999') FROM ceil_floor_round;
--Testcase 544:
SELECT to_char(a, 'f\"oo999') FROM ceil_floor_round;
--Testcase 545:
SELECT to_char(a, 'f\\"oo999') FROM ceil_floor_round;
--Testcase 546:
SELECT to_char(a, 'f"ool"999') FROM ceil_floor_round;
--Testcase 547:
SELECT to_char(a, 'f"\ool"999') FROM ceil_floor_round;
--Testcase 548:
SELECT to_char(a, 'f"\\ool"999') FROM ceil_floor_round;
--Testcase 549:
SELECT to_char(a, 'f"ool\"999') FROM ceil_floor_round;
--Testcase 550:
SELECT to_char(a, 'f"ool\\"999') FROM ceil_floor_round;
-- TO_NUMBER()
--
--Testcase 639:
create foreign table to_number_tbl (a text, id int options (key 'true')) server sqlite_svr;
--Testcase 1211:
SET lc_numeric = 'C';
--Testcase 640:
DELETE FROM to_number_tbl;
--Testcase 641:
INSERT INTO to_number_tbl VALUES ('-34,338,492');
--Testcase 642:
SELECT to_number(a, '99G999G999') FROM to_number_tbl;
--Testcase 643:
DELETE FROM to_number_tbl;
--Testcase 644:
INSERT INTO to_number_tbl VALUES ('-34,338,492.654,878');
--Testcase 645:
SELECT to_number(a, '99G999G999D999G999') FROM to_number_tbl;
--Testcase 646:
DELETE FROM to_number_tbl;
--Testcase 647:
INSERT INTO to_number_tbl VALUES ('<564646.654564>');
--Testcase 648:
SELECT to_number(a, '999999.999999PR') FROM to_number_tbl;
--Testcase 649:
DELETE FROM to_number_tbl;
--Testcase 650:
INSERT INTO to_number_tbl VALUES ('0.00001-');
--Testcase 651:
SELECT to_number(a, '9.999999S') FROM to_number_tbl;
--Testcase 652:
DELETE FROM to_number_tbl;
--Testcase 653:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 654:
SELECT to_number(a, 'FM9.999999S') FROM to_number_tbl;
--Testcase 655:
DELETE FROM to_number_tbl;
--Testcase 656:
INSERT INTO to_number_tbl VALUES ('5.01-');
--Testcase 657:
SELECT to_number(a, 'FM9.999999MI') FROM to_number_tbl;
--Testcase 658:
DELETE FROM to_number_tbl;
--Testcase 659:
INSERT INTO to_number_tbl VALUES ('5 4 4 4 4 8 . 7 8');
--Testcase 660:
SELECT to_number(a, '9 9 9 9 9 9 . 9 9') FROM to_number_tbl;
--Testcase 661:
DELETE FROM to_number_tbl;
--Testcase 662:
INSERT INTO to_number_tbl VALUES ('.01');
--Testcase 663:
SELECT to_number(a, 'FM9.99') FROM to_number_tbl;
--Testcase 664:
DELETE FROM to_number_tbl;
--Testcase 665:
INSERT INTO to_number_tbl VALUES ('.0');
--Testcase 666:
SELECT to_number(a, '99999999.99999999') FROM to_number_tbl;
--Testcase 667:
DELETE FROM to_number_tbl;
--Testcase 668:
INSERT INTO to_number_tbl VALUES ('0');
--Testcase 669:
SELECT to_number(a, '99.99') FROM to_number_tbl;
--Testcase 670:
DELETE FROM to_number_tbl;
--Testcase 671:
INSERT INTO to_number_tbl VALUES ('.-01');
--Testcase 672:
SELECT to_number(a, 'S99.99') FROM to_number_tbl;
--Testcase 673:
DELETE FROM to_number_tbl;
--Testcase 674:
INSERT INTO to_number_tbl VALUES ('.01-');
--Testcase 675:
SELECT to_number(a, '99.99S') FROM to_number_tbl;
--Testcase 676:
DELETE FROM to_number_tbl;
--Testcase 677:
INSERT INTO to_number_tbl VALUES (' . 0 1-');
--Testcase 678:
SELECT to_number(a, ' 9 9 . 9 9 S') FROM to_number_tbl;
--Testcase 679:
DELETE FROM to_number_tbl;
--Testcase 680:
INSERT INTO to_number_tbl VALUES ('34,50');
--Testcase 681:
SELECT to_number(a,'999,99') FROM to_number_tbl;
--Testcase 682:
DELETE FROM to_number_tbl;
--Testcase 683:
INSERT INTO to_number_tbl VALUES ('123,000');
--Testcase 684:
SELECT to_number(a,'999G') FROM to_number_tbl;
--Testcase 685:
DELETE FROM to_number_tbl;
--Testcase 686:
INSERT INTO to_number_tbl VALUES ('123456');
--Testcase 687:
SELECT to_number(a,'999G999') FROM to_number_tbl;
--Testcase 688:
DELETE FROM to_number_tbl;
--Testcase 689:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 690:
SELECT to_number(a,'L9,999.99') FROM to_number_tbl;
--Testcase 691:
DELETE FROM to_number_tbl;
--Testcase 692:
INSERT INTO to_number_tbl VALUES ('$1234.56');
--Testcase 693:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 694:
DELETE FROM to_number_tbl;
--Testcase 695:
INSERT INTO to_number_tbl VALUES ('$1,234.56');
--Testcase 696:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 697:
DELETE FROM to_number_tbl;
--Testcase 698:
INSERT INTO to_number_tbl VALUES ('1234.56');
--Testcase 699:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 700:
DELETE FROM to_number_tbl;
--Testcase 701:
INSERT INTO to_number_tbl VALUES ('1,234.56');
--Testcase 702:
SELECT to_number(a,'L99,999.99') FROM to_number_tbl;
--Testcase 703:
DELETE FROM to_number_tbl;
--Testcase 704:
INSERT INTO to_number_tbl VALUES ('42nd');
--Testcase 705:
SELECT to_number(a, '99th') FROM to_number_tbl;
--Testcase 1212:
RESET lc_numeric;
--
-- Input syntax
--
--Testcase 706:
CREATE FOREIGN TABLE num_input_test (n1 numeric) SERVER sqlite_svr;
-- good inputs
--Testcase 551:
INSERT INTO num_input_test(n1) VALUES (' 123');
--Testcase 552:
INSERT INTO num_input_test(n1) VALUES (' 3245874 ');
--Testcase 553:
INSERT INTO num_input_test(n1) VALUES (' -93853');
--Testcase 554:
INSERT INTO num_input_test(n1) VALUES ('555.50');
--Testcase 555:
INSERT INTO num_input_test(n1) VALUES ('-555.50');
--Testcase 556:
INSERT INTO num_input_test(n1) VALUES ('NaN ');
--Testcase 557:
INSERT INTO num_input_test(n1) VALUES (' nan');
--Testcase 1213:
INSERT INTO num_input_test(n1) VALUES (' inf ');
--Testcase 1214:
INSERT INTO num_input_test(n1) VALUES (' +inf ');
--Testcase 1215:
INSERT INTO num_input_test(n1) VALUES (' -inf ');
--Testcase 1216:
INSERT INTO num_input_test(n1) VALUES (' Infinity ');
--Testcase 1217:
INSERT INTO num_input_test(n1) VALUES (' +inFinity ');
--Testcase 1218:
INSERT INTO num_input_test(n1) VALUES (' -INFINITY ');
INSERT INTO num_input_test(n1) VALUES ('12_000_000_000');
INSERT INTO num_input_test(n1) VALUES ('12_000.123_456');
INSERT INTO num_input_test(n1) VALUES ('23_000_000_000e-1_0');
INSERT INTO num_input_test(n1) VALUES ('.000_000_000_123e1_0');
INSERT INTO num_input_test(n1) VALUES ('.000_000_000_123e+1_1');
INSERT INTO num_input_test(n1) VALUES ('0b10001110111100111100001001010');
INSERT INTO num_input_test(n1) VALUES (' -0B_1010_1011_0101_0100_1010_1001_1000_1100_1110_1011_0001_1111_0000_1010_1101_0010 ');
INSERT INTO num_input_test(n1) VALUES (' +0o112402761777 ');
INSERT INTO num_input_test(n1) VALUES ('-0O0012_5524_5230_6334_3167_0261');
INSERT INTO num_input_test(n1) VALUES ('-0x0000000000000000000000000deadbeef');
INSERT INTO num_input_test(n1) VALUES (' 0X_30b1_F33a_6DF0_bD4E_64DF_9BdA_7D15 ');
-- bad inputs
--Testcase 558:
INSERT INTO num_input_test(n1) VALUES (' ');
--Testcase 559:
INSERT INTO num_input_test(n1) VALUES (' 1234 %');
--Testcase 560:
INSERT INTO num_input_test(n1) VALUES ('xyz');
--Testcase 561:
INSERT INTO num_input_test(n1) VALUES ('- 1234');
--Testcase 562:
INSERT INTO num_input_test(n1) VALUES ('5 . 0');
--Testcase 563:
INSERT INTO num_input_test(n1) VALUES ('5. 0 ');
--Testcase 564:
INSERT INTO num_input_test(n1) VALUES ('');
--Testcase 565:
INSERT INTO num_input_test(n1) VALUES (' N aN ');
INSERT INTO num_input_test(n1) VALUES ('+NaN');
INSERT INTO num_input_test(n1) VALUES ('-NaN');
--Testcase 1219:
INSERT INTO num_input_test(n1) VALUES ('+ infinity');
INSERT INTO num_input_test(n1) VALUES ('_123');
INSERT INTO num_input_test(n1) VALUES ('123_');
INSERT INTO num_input_test(n1) VALUES ('12__34');
INSERT INTO num_input_test(n1) VALUES ('123_.456');
INSERT INTO num_input_test(n1) VALUES ('123._456');
INSERT INTO num_input_test(n1) VALUES ('1.2e_34');
INSERT INTO num_input_test(n1) VALUES ('1.2e34_');
INSERT INTO num_input_test(n1) VALUES ('1.2e3__4');
INSERT INTO num_input_test(n1) VALUES ('0b1112');
INSERT INTO num_input_test(n1) VALUES ('0c1112');
INSERT INTO num_input_test(n1) VALUES ('0o12345678');
INSERT INTO num_input_test(n1) VALUES ('0x1eg');
INSERT INTO num_input_test(n1) VALUES ('0x12.34');
INSERT INTO num_input_test(n1) VALUES ('0x__1234');
INSERT INTO num_input_test(n1) VALUES ('0x1234_');
INSERT INTO num_input_test(n1) VALUES ('0x12__34');
--Testcase 566:
SELECT * FROM num_input_test;
-- Also try it with non-error-throwing API
CREATE FOREIGN TABLE NON_ERROR_THROWING_API_INT4_NUMERIC(f1 text, id serial OPTIONS (key 'true')) SERVER sqlite_svr;
INSERT INTO NON_ERROR_THROWING_API_INT4_NUMERIC VALUES ('34.5', 1), ('34xyz', 2), ('1e400000', 3);
SELECT pg_input_is_valid(f1, 'numeric') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 1;
SELECT pg_input_is_valid(f1, 'numeric') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 2;
SELECT pg_input_is_valid(f1, 'numeric') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 3;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 3), 'numeric');
INSERT INTO NON_ERROR_THROWING_API_INT4_NUMERIC VALUES ('1234.567', 4), ('0x1234.567', 5);
SELECT pg_input_is_valid(f1, 'numeric(8,4)') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 4;
SELECT pg_input_is_valid(f1, 'numeric(7,4)') FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 4;
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 4), 'numeric(7,4)');
SELECT * FROM pg_input_error_info((SELECT f1 FROM NON_ERROR_THROWING_API_INT4_NUMERIC WHERE id = 5), 'numeric');
--
-- Test precision and scale typemods
--
--Testcase 1557:
CREATE FOREIGN TABLE num_typemod_test (
millions numeric(3, -6),
thousands numeric(3, -3),
units numeric(3, 0),
thousandths numeric(3, 3),
millionths numeric(3, 6)
) SERVER sqlite_svr;
--Testcase 1558:
\d num_typemod_test
-- rounding of valid inputs
--Testcase 1559:
INSERT INTO num_typemod_test VALUES (123456, 123, 0.123, 0.000123, 0.000000123);
--Testcase 1560:
INSERT INTO num_typemod_test VALUES (654321, 654, 0.654, 0.000654, 0.000000654);
--Testcase 1561:
INSERT INTO num_typemod_test VALUES (2345678, 2345, 2.345, 0.002345, 0.000002345);
--Testcase 1562:
INSERT INTO num_typemod_test VALUES (7654321, 7654, 7.654, 0.007654, 0.000007654);
--Testcase 1563:
INSERT INTO num_typemod_test VALUES (12345678, 12345, 12.345, 0.012345, 0.000012345);
--Testcase 1564:
INSERT INTO num_typemod_test VALUES (87654321, 87654, 87.654, 0.087654, 0.000087654);
--Testcase 1565:
INSERT INTO num_typemod_test VALUES (123456789, 123456, 123.456, 0.123456, 0.000123456);
--Testcase 1566:
INSERT INTO num_typemod_test VALUES (987654321, 987654, 987.654, 0.987654, 0.000987654);
--Testcase 1567:
INSERT INTO num_typemod_test VALUES ('NaN', 'NaN', 'NaN', 'NaN', 'NaN');
--Testcase 1568:
SELECT scale(millions), * FROM num_typemod_test ORDER BY millions;
-- invalid inputs
--Testcase 1569:
INSERT INTO num_typemod_test (millions) VALUES ('inf');
--Testcase 1570:
INSERT INTO num_typemod_test (millions) VALUES (999500000);
--Testcase 1571:
INSERT INTO num_typemod_test (thousands) VALUES (999500);
--Testcase 1572:
INSERT INTO num_typemod_test (units) VALUES (999.5);
--Testcase 1573:
INSERT INTO num_typemod_test (thousandths) VALUES (0.9995);
--Testcase 1574:
INSERT INTO num_typemod_test (millionths) VALUES (0.0009995);
--
-- Test some corner cases for multiplication
--
--Testcase 707:
CREATE FOREIGN TABLE num_tmp (n1 numeric, n2 numeric, id int options (key 'true')) SERVER sqlite_svr;
--Testcase 708:
INSERT INTO num_tmp VALUES (4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 709:
SELECT n1 * n2 FROM num_tmp;
--Testcase 710:
DELETE FROM num_tmp;
--Testcase 711:
INSERT INTO num_tmp VALUES (4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 712:
SELECT n1 * n2 FROM num_tmp;
--Testcase 713:
DELETE FROM num_tmp;
--Testcase 714:
INSERT INTO num_tmp VALUES (4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 715:
SELECT n1 * n2 FROM num_tmp;
--Testcase 716:
DELETE FROM num_tmp;
--Testcase 717:
INSERT INTO num_tmp VALUES (4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999, 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
--Testcase 718:
SELECT n1 * n2 FROM num_tmp;
--Testcase 1525:
DELETE FROM num_tmp;
--Testcase 1526:
INSERT INTO num_tmp VALUES ((0.1 - 2e-16383), (0.1 - 3e-16383));
--Testcase 1527:
SELECT trim_scale(n1 * n2) FROM num_tmp;
--
-- Test some corner cases for division
--
--Testcase 719:
DELETE FROM num_tmp;
--Testcase 720:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 721:
SELECT n1::numeric / n2 FROM num_tmp;
--Testcase 722:
DELETE FROM num_tmp;
--Testcase 723:
INSERT INTO num_tmp VALUES (999999999999999999999, 1000000000000000000000);
--Testcase 724:
SELECT div(n1::numeric, n2) FROM num_tmp;
--Testcase 725:
SELECT mod(n1::numeric, n2) FROM num_tmp;
--Testcase 726:
SELECT div(-n1::numeric, n2) FROM num_tmp;
--Testcase 727:
SELECT mod(-n1::numeric, n2) FROM num_tmp;
--Testcase 728:
select div(-n1::numeric,n2)*n2 + mod(-n1::numeric,n2) FROM num_tmp;
--Testcase 729:
DELETE FROM num_tmp;
--Testcase 730:
INSERT INTO num_tmp VALUES (70.0,70);
--Testcase 731:
select mod (n1, n2) FROM num_tmp;
--Testcase 732:
select div (n1, n2) FROM num_tmp;
--Testcase 733:
select n1 / n2 FROM num_tmp;
--Testcase 734:
DELETE FROM num_tmp;
--Testcase 735:
INSERT INTO num_tmp VALUES (12345678901234567890, 123);
--Testcase 736:
select n1 % n2 FROM num_tmp;
--Testcase 737:
select n1 / n2 FROM num_tmp;
--Testcase 738:
select div(n1, n2) FROM num_tmp;
--Testcase 739:
select div(n1, n2) * n2 + n1 % n2 FROM num_tmp;
--
-- Test some corner cases for square root
--
--Testcase 740:
DELETE FROM num_tmp;
--Testcase 741:
INSERT INTO num_tmp VALUES (1.000000000000003::numeric);
--Testcase 742:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 743:
DELETE FROM num_tmp;
--Testcase 744:
INSERT INTO num_tmp VALUES (1.000000000000004::numeric);
--Testcase 745:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 746:
DELETE FROM num_tmp;
--Testcase 747:
INSERT INTO num_tmp VALUES (96627521408608.56340355805::numeric);
--Testcase 748:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 749:
DELETE FROM num_tmp;
--Testcase 750:
INSERT INTO num_tmp VALUES (96627521408608.56340355806::numeric);
--Testcase 751:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 752:
DELETE FROM num_tmp;
--Testcase 753:
INSERT INTO num_tmp VALUES (515549506212297735.073688290367::numeric);
--Testcase 754:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 755:
DELETE FROM num_tmp;
--Testcase 756:
INSERT INTO num_tmp VALUES (515549506212297735.073688290368::numeric);
--Testcase 757:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 758:
DELETE FROM num_tmp;
--Testcase 759:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900306::numeric);
--Testcase 760:
SELECT sqrt(n1) FROM num_tmp;
--Testcase 761:
DELETE FROM num_tmp;
--Testcase 762:
INSERT INTO num_tmp VALUES (8015491789940783531003294973900307::numeric);
--Testcase 763:
SELECT sqrt(n1) FROM num_tmp;
--
-- Test code path for raising to integer powers
--
--Testcase 764:
DELETE FROM num_tmp;
--Testcase 765:
INSERT INTO num_tmp VALUES (10.0, -2147483648);
--Testcase 766:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 767:
DELETE FROM num_tmp;
--Testcase 768:
INSERT INTO num_tmp VALUES (10.0, -2147483647);
--Testcase 769:
SELECT n1 ^ n2 as rounds_to_zero FROM num_tmp;
--Testcase 770:
DELETE FROM num_tmp;
--Testcase 771:
INSERT INTO num_tmp VALUES (10.0, 2147483647);
--Testcase 772:
SELECT n1 ^ n2 as overflows FROM num_tmp;
--Testcase 773:
DELETE FROM num_tmp;
--Testcase 774:
INSERT INTO num_tmp VALUES (117743296169.0, -1000000000);
--Testcase 775:
SELECT n1 ^ n2 as overflows FROM num_tmp;
-- cases that used to return inaccurate results
--Testcase 776:
DELETE FROM num_tmp;
--Testcase 777:
INSERT INTO num_tmp VALUES (3.789, 21.0000000000000000);
--Testcase 778:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 779:
DELETE FROM num_tmp;
--Testcase 780:
INSERT INTO num_tmp VALUES (3.789, 35.0000000000000000);
--Testcase 781:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 782:
DELETE FROM num_tmp;
--Testcase 783:
INSERT INTO num_tmp VALUES (1.2, 345);
--Testcase 784:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 785:
DELETE FROM num_tmp;
--Testcase 786:
INSERT INTO num_tmp VALUES (0.12, (-20));
--Testcase 787:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1220:
DELETE FROM num_tmp;
--Testcase 1221:
INSERT INTO num_tmp VALUES (1.000000000123, (-2147483648));
--Testcase 1222:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1528:
DELETE FROM num_tmp;
--Testcase 1529:
INSERT INTO num_tmp VALUES (0.9999999999, 23300000000000);
--Testcase 1530:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
--Testcase 1575:
DELETE FROM num_tmp;
--Testcase 1576:
INSERT INTO num_tmp VALUES ((1 - 1.500012345678e-1000), 1.45e1003);
--Testcase 1577:
SELECT round(((1 - 1.500012345678e-1000) ^ 1.45e1003) * 1e1000) FROM num_tmp;
-- cases that used to error out
--Testcase 788:
DELETE FROM num_tmp;
--Testcase 789:
INSERT INTO num_tmp VALUES (0.12, (-25));
--Testcase 790:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 791:
DELETE FROM num_tmp;
--Testcase 792:
INSERT INTO num_tmp VALUES (0.5678, (-85));
--Testcase 793:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1531:
DELETE FROM num_tmp;
--Testcase 1532:
INSERT INTO num_tmp VALUES (0.9999999999, 70000000000000);
--Testcase 1533:
SELECT coalesce(nullif(n1 ^ n2, 0), 0) FROM num_tmp;
-- negative base to integer powers
--Testcase 1534:
DELETE FROM num_tmp;
--Testcase 1535:
INSERT INTO num_tmp VALUES ((-1.0), 2147483646);
--Testcase 1536:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1537:
DELETE FROM num_tmp;
--Testcase 1538:
INSERT INTO num_tmp VALUES ((-1.0), 2147483647);
--Testcase 1539:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1540:
DELETE FROM num_tmp;
--Testcase 1541:
INSERT INTO num_tmp VALUES ((-1.0), 2147483648);
--Testcase 1542:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1543:
DELETE FROM num_tmp;
--Testcase 1544:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000000);
--Testcase 1545:
SELECT n1 ^ n2 FROM num_tmp;
--Testcase 1546:
DELETE FROM num_tmp;
--Testcase 1547:
INSERT INTO num_tmp VALUES ((-1.0), 1000000000000001);
--Testcase 1548:
SELECT n1 ^ n2 FROM num_tmp;
-- integer powers of 10
DELETE FROM num_tmp;
INSERT INTO num_tmp(n1) SELECT n FROM generate_series(-20,20) n;
SELECT n1, 10.0 ^ n1 as "10^n", (10.0 ^ n1) * (10.0 ^ (-n1)) = 1 as ok FROM num_tmp;
--
-- Tests for raising to non-integer powers
--
-- special cases
--Testcase 794:
DELETE FROM num_tmp;
--Testcase 795:
INSERT INTO num_tmp VALUES (0.0, 0.0);
--Testcase 796:
select n1 ^ n2 FROM num_tmp;
--Testcase 797:
DELETE FROM num_tmp;
--Testcase 798:
INSERT INTO num_tmp VALUES ((-12.34), 0.0);
--Testcase 799:
select n1 ^ n2 FROM num_tmp;
--Testcase 800:
DELETE FROM num_tmp;
--Testcase 801:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 802:
select n1 ^ n2 FROM num_tmp;
--Testcase 803:
DELETE FROM num_tmp;
--Testcase 804:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 805:
select n1 ^ n2 FROM num_tmp;
-- NaNs
--Testcase 806:
DELETE FROM num_tmp;
--Testcase 807:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 'NaN'::numeric);
--Testcase 808:
select n1 ^ n2 FROM num_tmp;
--Testcase 809:
DELETE FROM num_tmp;
--Testcase 810:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 0);
--Testcase 811:
select n1 ^ n2 FROM num_tmp;
--Testcase 812:
DELETE FROM num_tmp;
--Testcase 813:
INSERT INTO num_tmp VALUES ('NaN'::numeric, 1);
--Testcase 814:
select n1 ^ n2 FROM num_tmp;
--Testcase 815:
DELETE FROM num_tmp;
--Testcase 816:
INSERT INTO num_tmp VALUES (0, 'NaN'::numeric);
--Testcase 817:
select n1 ^ n2 FROM num_tmp;
--Testcase 818:
DELETE FROM num_tmp;
--Testcase 819:
INSERT INTO num_tmp VALUES (1, 'NaN'::numeric);
--Testcase 820:
select n1 ^ n2 FROM num_tmp;
-- invalid inputs
--Testcase 821:
DELETE FROM num_tmp;
--Testcase 822:
INSERT INTO num_tmp VALUES (0.0, (-12.34));
--Testcase 823:
select n1 ^ n2 FROM num_tmp;
--Testcase 824:
DELETE FROM num_tmp;
--Testcase 825:
INSERT INTO num_tmp VALUES ((-12.34), 1.2);
--Testcase 826:
select n1 ^ n2 FROM num_tmp;
-- cases that used to generate inaccurate results
--Testcase 827:
DELETE FROM num_tmp;
--Testcase 828:
INSERT INTO num_tmp VALUES (32.1, 9.8);
--Testcase 829:
select n1 ^ n2 FROM num_tmp;
--Testcase 830:
DELETE FROM num_tmp;
--Testcase 831:
INSERT INTO num_tmp VALUES (32.1, (-9.8));
--Testcase 832:
select n1 ^ n2 FROM num_tmp;
--Testcase 833:
DELETE FROM num_tmp;
--Testcase 834:
INSERT INTO num_tmp VALUES (12.3, 45.6);
--Testcase 835:
select n1 ^ n2 FROM num_tmp;
--Testcase 836:
DELETE FROM num_tmp;
--Testcase 837:
INSERT INTO num_tmp VALUES (12.3, (-45.6));
--Testcase 838:
select n1 ^ n2 FROM num_tmp;
-- big test
--Testcase 839:
DELETE FROM num_tmp;
--Testcase 840:
INSERT INTO num_tmp VALUES (1.234, 5678);
--Testcase 841:
select n1 ^ n2 FROM num_tmp;
--
-- Tests for EXP()
--
-- special cases
--Testcase 842:
DELETE FROM num_tmp;
--Testcase 843:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 844:
select exp(n1) from num_tmp;
--Testcase 845:
DELETE FROM num_tmp;
--Testcase 846:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 847:
select exp(n1) from num_tmp;
--Testcase 848:
DELETE FROM num_tmp;
--Testcase 849:
INSERT INTO num_tmp VALUES (1.0::numeric(71,70));
--Testcase 850:
select exp(n1) from num_tmp;
--Testcase 1223:
DELETE FROM num_tmp;
--Testcase 1224:
INSERT INTO num_tmp VALUES ('nan'::numeric);
--Testcase 1225:
select exp(n1) from num_tmp;
--Testcase 1226:
DELETE FROM num_tmp;
--Testcase 1227:
INSERT INTO num_tmp VALUES ('inf'::numeric);
--Testcase 1228:
select exp(n1) from num_tmp;
--Testcase 1229:
DELETE FROM num_tmp;
--Testcase 1230:
INSERT INTO num_tmp VALUES ('-inf'::numeric);
--Testcase 1231:
select exp(n1) from num_tmp;
--Testcase 1549:
DELETE FROM num_tmp;
--Testcase 1550:
INSERT INTO num_tmp VALUES ('-5000'::numeric);
--Testcase 1551:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
--Testcase 1552:
DELETE FROM num_tmp;
--Testcase 1553:
INSERT INTO num_tmp VALUES ('-10000'::numeric);
--Testcase 1554:
select coalesce(nullif(exp(n1), 0), 0) from num_tmp;
-- cases that used to generate inaccurate results
--Testcase 851:
DELETE FROM num_tmp;
--Testcase 852:
INSERT INTO num_tmp VALUES (32.999);
--Testcase 853:
select exp(n1) from num_tmp;
--Testcase 854:
DELETE FROM num_tmp;
--Testcase 855:
INSERT INTO num_tmp VALUES (-32.999);
--Testcase 856:
select exp(n1) from num_tmp;
--Testcase 857:
DELETE FROM num_tmp;
--Testcase 858:
INSERT INTO num_tmp VALUES (123.456);
--Testcase 859:
select exp(n1) from num_tmp;
--Testcase 860:
DELETE FROM num_tmp;
--Testcase 861:
INSERT INTO num_tmp VALUES (-123.456);
--Testcase 862:
select exp(n1) from num_tmp;
-- big test
--Testcase 863:
DELETE FROM num_tmp;
--Testcase 864:
INSERT INTO num_tmp VALUES (1234.5678);
--Testcase 865:
select exp(n1) from num_tmp;
--
-- Tests for generate_series
--
--Testcase 866:
DELETE FROM num_tmp;
--Testcase 867:
INSERT INTO num_tmp select * from generate_series(0.0::numeric, 4.0::numeric);
--Testcase 868:
SELECT n1 FROM num_tmp;
--Testcase 869:
DELETE FROM num_tmp;
--Testcase 870:
INSERT INTO num_tmp select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric);
--Testcase 871:
SELECT n1 FROM num_tmp;
--Testcase 872:
DELETE FROM num_tmp;
--Testcase 873:
INSERT INTO num_tmp select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric);
--Testcase 874:
SELECT n1 FROM num_tmp;
-- Trigger errors
--Testcase 875:
DELETE FROM num_tmp;
--Testcase 876:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 0::numeric);
--Testcase 877:
SELECT n1 FROM num_tmp;
--Testcase 878:
DELETE FROM num_tmp;
--Testcase 879:
INSERT INTO num_tmp select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric);
--Testcase 880:
SELECT n1 FROM num_tmp;
--Testcase 881:
DELETE FROM num_tmp;
--Testcase 882:
INSERT INTO num_tmp select * from generate_series('nan'::numeric, 100::numeric, 10::numeric);
--Testcase 883:
SELECT n1 FROM num_tmp;
--Testcase 884:
DELETE FROM num_tmp;
--Testcase 885:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric);
--Testcase 886:
SELECT n2 FROM num_tmp;
--Testcase 1232:
DELETE FROM num_tmp;
--Testcase 1233:
INSERT INTO num_tmp select * from generate_series('inf'::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1234:
SELECT n2 FROM num_tmp;
--Testcase 1235:
DELETE FROM num_tmp;
--Testcase 1236:
INSERT INTO num_tmp select * from generate_series(0::numeric, 'inf'::numeric, 10::numeric);
--Testcase 1237:
SELECT n2 FROM num_tmp;
--Testcase 1238:
DELETE FROM num_tmp;
--Testcase 1239:
INSERT INTO num_tmp select * from generate_series(0::numeric, '42'::numeric, '-inf'::numeric);
--Testcase 1240:
SELECT n2 FROM num_tmp;
-- Checks maximum, output is truncated
--Testcase 887:
DELETE FROM num_tmp;
--Testcase 888:
INSERT INTO num_tmp select (i / (10::numeric ^ 131071))::numeric(1,0)
from generate_series(6 * (10::numeric ^ 131071),
9 * (10::numeric ^ 131071),
10::numeric ^ 131071) i;
--Testcase 889:
SELECT n1 FROM num_tmp;
-- Check usage with variables
--Testcase 890:
DELETE FROM num_tmp;
--Testcase 891:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
--Testcase 892:
SELECT n1, n2 FROM num_tmp;
--Testcase 893:
DELETE FROM num_tmp;
--Testcase 894:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
--Testcase 895:
SELECT n1, n2 FROM num_tmp;
--Testcase 896:
DELETE FROM num_tmp;
--Testcase 897:
INSERT INTO num_tmp select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
--Testcase 898:
SELECT n1, n2 FROM num_tmp;
--
-- Tests for LN()
--
-- Invalid inputs
--Testcase 899:
DELETE FROM num_tmp;
--Testcase 900:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 901:
select ln(n1) from num_tmp;
--Testcase 902:
DELETE FROM num_tmp;
--Testcase 903:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 904:
select ln(n1) from num_tmp;
-- Some random tests
--Testcase 905:
DELETE FROM num_tmp;
--Testcase 906:
INSERT INTO num_tmp VALUES (1.2345678e-28);
--Testcase 907:
select ln(n1) from num_tmp;
--Testcase 908:
DELETE FROM num_tmp;
--Testcase 909:
INSERT INTO num_tmp VALUES (0.0456789);
--Testcase 910:
select ln(n1) from num_tmp;
--Testcase 911:
DELETE FROM num_tmp;
--Testcase 912:
INSERT INTO num_tmp VALUES (0.349873948359354029493948309745709580730482050975);
--Testcase 913:
select ln(n1) from num_tmp;
--Testcase 914:
DELETE FROM num_tmp;
--Testcase 915:
INSERT INTO num_tmp VALUES (0.99949452);
--Testcase 916:
select ln(n1) from num_tmp;
--Testcase 917:
DELETE FROM num_tmp;
--Testcase 918:
INSERT INTO num_tmp VALUES (1.00049687395);
--Testcase 919:
select ln(n1) from num_tmp;
--Testcase 920:
DELETE FROM num_tmp;
--Testcase 921:
INSERT INTO num_tmp VALUES (1234.567890123456789);
--Testcase 922:
select ln(n1) from num_tmp;
--Testcase 923:
DELETE FROM num_tmp;
--Testcase 924:
INSERT INTO num_tmp VALUES (5.80397490724e5);
--Testcase 925:
select ln(n1) from num_tmp;
--Testcase 926:
DELETE FROM num_tmp;
--Testcase 927:
INSERT INTO num_tmp VALUES (9.342536355e34);
--Testcase 928:
select ln(n1) from num_tmp;
--
-- Tests for LOG() (base 10)
--
-- invalid inputs
--Testcase 929:
DELETE FROM num_tmp;
--Testcase 930:
INSERT INTO num_tmp VALUES (-12.34);
--Testcase 931:
select log(n1) from num_tmp;
--Testcase 932:
DELETE FROM num_tmp;
--Testcase 933:
INSERT INTO num_tmp VALUES (0.0);
--Testcase 934:
select log(n1) from num_tmp;
-- some random tests
--Testcase 935:
DELETE FROM num_tmp;
--Testcase 936:
INSERT INTO num_tmp VALUES (1.234567e-89);
--Testcase 937:
select log(n1) from num_tmp;
--Testcase 938:
DELETE FROM num_tmp;
--Testcase 939:
INSERT INTO num_tmp VALUES (3.4634998359873254962349856073435545);
--Testcase 940:
select log(n1) from num_tmp;
--Testcase 941:
DELETE FROM num_tmp;
--Testcase 942:
INSERT INTO num_tmp VALUES (9.999999999999999999);
--Testcase 943:
select log(n1) from num_tmp;
--Testcase 944:
DELETE FROM num_tmp;
--Testcase 945:
INSERT INTO num_tmp VALUES (10.00000000000000000);
--Testcase 946:
select log(n1) from num_tmp;
--Testcase 947:
DELETE FROM num_tmp;
--Testcase 948:
INSERT INTO num_tmp VALUES (10.00000000000000001);
--Testcase 949:
select log(n1) from num_tmp;
--Testcase 950:
DELETE FROM num_tmp;
--Testcase 951:
INSERT INTO num_tmp VALUES (590489.45235237);
--Testcase 952:
select log(n1) from num_tmp;
--
-- Tests for LOG() (arbitrary base)
--
-- invalid inputs
--Testcase 953:
DELETE FROM num_tmp;
--Testcase 954:
INSERT INTO num_tmp VALUES (-12.34, 56.78);
--Testcase 955:
select log(n1, n2) from num_tmp;
--Testcase 956:
DELETE FROM num_tmp;
--Testcase 957:
INSERT INTO num_tmp VALUES (-12.34, -56.78);
--Testcase 958:
select log(n1, n2) from num_tmp;
--Testcase 959:
DELETE FROM num_tmp;
--Testcase 960:
INSERT INTO num_tmp VALUES (12.34, -56.78);
--Testcase 961:
select log(n1, n2) from num_tmp;
--Testcase 962:
DELETE FROM num_tmp;
--Testcase 963:
INSERT INTO num_tmp VALUES (0.0, 12.34);
--Testcase 964:
select log(n1, n2) from num_tmp;
--Testcase 965:
DELETE FROM num_tmp;
--Testcase 966:
INSERT INTO num_tmp VALUES (12.34, 0.0);
--Testcase 967:
select log(n1, n2) from num_tmp;
--Testcase 968:
DELETE FROM num_tmp;
--Testcase 969:
INSERT INTO num_tmp VALUES (.0, 12.34);
--Testcase 970:
select log(n1, n2) from num_tmp;
-- some random tests
--Testcase 971:
DELETE FROM num_tmp;
--Testcase 972:
INSERT INTO num_tmp VALUES (1.23e-89, 6.4689e45);
--Testcase 973:
select log(n1, n2) from num_tmp;
--Testcase 974:
DELETE FROM num_tmp;
--Testcase 975:
INSERT INTO num_tmp VALUES (0.99923, 4.58934e34);
--Testcase 976:
select log(n1, n2) from num_tmp;
--Testcase 977:
DELETE FROM num_tmp;
--Testcase 978:
INSERT INTO num_tmp VALUES (1.000016, 8.452010e18);
--Testcase 979:
select log(n1, n2) from num_tmp;
--Testcase 980:
DELETE FROM num_tmp;
--Testcase 981:
INSERT INTO num_tmp VALUES (3.1954752e47, 9.4792021e-73);
--Testcase 982:
select log(n1, n2) from num_tmp;
--
-- Tests for scale()
--
--Testcase 983:
DELETE FROM num_tmp;
--Testcase 984:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 985:
select scale(n1) from num_tmp;
--Testcase 1241:
DELETE FROM num_tmp;
--Testcase 1242:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1243:
select scale(n1) from num_tmp;
--Testcase 986:
DELETE FROM num_tmp;
--Testcase 987:
INSERT INTO num_tmp VALUES (NULL::numeric);
--Testcase 988:
select scale(n1) from num_tmp;
--Testcase 989:
DELETE FROM num_tmp;
--Testcase 990:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 991:
select scale(n1) from num_tmp;
--Testcase 992:
DELETE FROM num_tmp;
--Testcase 993:
INSERT INTO num_tmp VALUES (0);
--Testcase 994:
select scale(n1) from num_tmp;
--Testcase 995:
DELETE FROM num_tmp;
--Testcase 996:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 997:
select scale(n1) from num_tmp;
--Testcase 998:
DELETE FROM num_tmp;
--Testcase 999:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1000:
select scale(n1) from num_tmp;
--Testcase 1001:
DELETE FROM num_tmp;
--Testcase 1002:
INSERT INTO num_tmp VALUES (110123.12475871856128);
--Testcase 1003:
select scale(n1) from num_tmp;
--Testcase 1004:
DELETE FROM num_tmp;
--Testcase 1005:
INSERT INTO num_tmp VALUES (-1123.12471856128);
--Testcase 1006:
select scale(n1) from num_tmp;
--Testcase 1007:
DELETE FROM num_tmp;
--Testcase 1008:
INSERT INTO num_tmp VALUES (-13.000000000000000);
--Testcase 1009:
select scale(n1) from num_tmp;
--
-- Tests for min_scale()
--
--Testcase 1010:
DELETE FROM num_tmp;
--Testcase 1011:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1012:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1244:
DELETE FROM num_tmp;
--Testcase 1245:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1246:
select min_scale(n1) is NULL from num_tmp; -- should be true
--Testcase 1013:
DELETE FROM num_tmp;
--Testcase 1014:
INSERT INTO num_tmp VALUES (0);
--Testcase 1015:
select min_scale(n1) from num_tmp; -- no digits
--Testcase 1016:
DELETE FROM num_tmp;
--Testcase 1017:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1018:
select min_scale(n1) from num_tmp; -- no digits again
--Testcase 1019:
DELETE FROM num_tmp;
--Testcase 1020:
INSERT INTO num_tmp VALUES (1.0);
--Testcase 1021:
select min_scale(n1) from num_tmp; -- no scale
--Testcase 1022:
DELETE FROM num_tmp;
--Testcase 1023:
INSERT INTO num_tmp VALUES (1.1);
--Testcase 1024:
select min_scale(n1) from num_tmp; -- scale 1
--Testcase 1025:
DELETE FROM num_tmp;
--Testcase 1026:
INSERT INTO num_tmp VALUES (1.12);
--Testcase 1027:
select min_scale(n1) from num_tmp; -- scale 2
--Testcase 1028:
DELETE FROM num_tmp;
--Testcase 1029:
INSERT INTO num_tmp VALUES (1.123);
--Testcase 1030:
select min_scale(n1) from num_tmp; -- scale 3
--Testcase 1031:
DELETE FROM num_tmp;
--Testcase 1032:
INSERT INTO num_tmp VALUES (1.1234);
--Testcase 1033:
select min_scale(n1) from num_tmp; -- scale 4, filled digit
--Testcase 1034:
DELETE FROM num_tmp;
--Testcase 1035:
INSERT INTO num_tmp VALUES (1.12345);
--Testcase 1036:
select min_scale(n1) from num_tmp; -- scale 5, 2 NDIGITS
--Testcase 1037:
DELETE FROM num_tmp;
--Testcase 1038:
INSERT INTO num_tmp VALUES (1.1000);
--Testcase 1039:
select min_scale(n1) from num_tmp; -- 1 pos in NDIGITS
--Testcase 1040:
DELETE FROM num_tmp;
--Testcase 1041:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1042:
select min_scale(n1) from num_tmp; -- very big number
--
-- Tests for trim_scale()
--
--Testcase 1043:
DELETE FROM num_tmp;
--Testcase 1044:
INSERT INTO num_tmp VALUES (numeric 'NaN');
--Testcase 1045:
select trim_scale(n1) from num_tmp;
--Testcase 1247:
DELETE FROM num_tmp;
--Testcase 1248:
INSERT INTO num_tmp VALUES (numeric 'inf');
--Testcase 1249:
select trim_scale(n1) from num_tmp;
--Testcase 1046:
DELETE FROM num_tmp;
--Testcase 1047:
INSERT INTO num_tmp VALUES (1.120);
--Testcase 1048:
select trim_scale(n1) from num_tmp;
--Testcase 1049:
DELETE FROM num_tmp;
--Testcase 1050:
INSERT INTO num_tmp VALUES (0);
--Testcase 1051:
select trim_scale(n1) from num_tmp;
--Testcase 1052:
DELETE FROM num_tmp;
--Testcase 1053:
INSERT INTO num_tmp VALUES (0.00);
--Testcase 1054:
select trim_scale(n1) from num_tmp;
--Testcase 1055:
DELETE FROM num_tmp;
--Testcase 1056:
INSERT INTO num_tmp VALUES (1.1234500);
--Testcase 1057:
select trim_scale(n1) from num_tmp;
--Testcase 1058:
DELETE FROM num_tmp;
--Testcase 1059:
INSERT INTO num_tmp VALUES (110123.12475871856128000);
--Testcase 1060:
select trim_scale(n1) from num_tmp;
--Testcase 1061:
DELETE FROM num_tmp;
--Testcase 1062:
INSERT INTO num_tmp VALUES (-123.124718561280000000);
--Testcase 1063:
select trim_scale(n1) from num_tmp;
--Testcase 1064:
DELETE FROM num_tmp;
--Testcase 1065:
INSERT INTO num_tmp VALUES (-13.00000000000000000000);
--Testcase 1066:
select trim_scale(n1) from num_tmp;
--Testcase 1067:
DELETE FROM num_tmp;
--Testcase 1068:
INSERT INTO num_tmp VALUES (1e100);
--Testcase 1069:
select trim_scale(n1) from num_tmp;
--
-- Tests for SUM()
--
-- cases that need carry propagation
--Testcase 1070:
DELETE FROM num_tmp;
--Testcase 1071:
INSERT INTO num_tmp SELECT * FROM generate_series(1, 100000);
--Testcase 1072:
SELECT SUM(9999::numeric) FROM num_tmp;
--Testcase 1073:
SELECT SUM((-9999)::numeric) FROM num_tmp;
--
-- Tests for VARIANCE()
--
--Testcase 1578:
INSERT INTO num_variance VALUES (0);
--Testcase 1579:
INSERT INTO num_variance VALUES (3e-500);
--Testcase 1580:
INSERT INTO num_variance VALUES (-3e-500);
--Testcase 1581:
INSERT INTO num_variance VALUES (4e-500 - 1e-16383);
--Testcase 1582:
INSERT INTO num_variance VALUES (-4e-500 + 1e-16383);
-- variance is just under 12.5e-1000 and so should round down to 12e-1000
--Testcase 1583:
SELECT trim_scale(variance(a) * 1e1000) FROM num_variance;
-- check that parallel execution produces the same result
BEGIN;
-- ALTER TABLE num_variance SET (parallel_workers = 4);
SET LOCAL parallel_setup_cost = 0;
SET LOCAL max_parallel_workers_per_gather = 4;
--Testcase 1584:
SELECT trim_scale(variance(a) * 1e1000) FROM num_variance;
ROLLBACK;
-- case where sum of squares would overflow but variance does not
--Testcase 1585:
DELETE FROM num_variance;
--Testcase 1586:
INSERT INTO num_variance SELECT 9e131071 + x FROM generate_series(1, 5) x;
--Testcase 1587:
SELECT variance(a) FROM num_variance;
-- check that parallel execution produces the same result
BEGIN;
-- ALTER TABLE num_variance SET (parallel_workers = 4);
SET LOCAL parallel_setup_cost = 0;
SET LOCAL max_parallel_workers_per_gather = 4;
--Testcase 1588:
SELECT variance(a) FROM num_variance;
ROLLBACK;
--
-- Tests for GCD()
--
--Testcase 1074:
DELETE FROM num_tmp;
--Testcase 1075:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1076:
SELECT n1 as a, n2 as b, gcd(n1, n2), gcd(n1, -n2), gcd(-n2, n1), gcd(-n2, -n1) FROM num_tmp;
--
-- Tests for LCM()
--
--Testcase 1077:
DELETE FROM num_tmp;
--Testcase 1078:
INSERT INTO num_tmp 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),
('Infinity', '0'),
('Infinity', '42'),
('Infinity', 'Infinity');
--Testcase 1079:
SELECT n1 as a, n2 as b, lcm(n1, n2), lcm(n1, -n2), lcm(-n2, n1), lcm(-n2, -n1) FROM num_tmp;
--Testcase 1080:
DELETE FROM num_tmp;
--Testcase 1081:
INSERT INTO num_tmp VALUES (10::numeric, 131068);
--Testcase 1082:
SELECT lcm(9999 * (n1)^n2 + (n1^n2 - 1), 2) FROM num_tmp; -- overflow
--
-- Tests for factorial
--
--Testcase 1250:
DELETE FROM num_tmp;
--Testcase 1251:
INSERT INTO num_tmp VALUES (4);
--Testcase 1252:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1253:
DELETE FROM num_tmp;
--Testcase 1254:
INSERT INTO num_tmp VALUES (15);
--Testcase 1255:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1256:
DELETE FROM num_tmp;
--Testcase 1257:
INSERT INTO num_tmp VALUES (100000);
--Testcase 1258:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1259:
DELETE FROM num_tmp;
--Testcase 1260:
INSERT INTO num_tmp VALUES (0);
--Testcase 1261:
SELECT factorial(n1::int4) FROM num_tmp;
--Testcase 1262:
DELETE FROM num_tmp;
--Testcase 1263:
INSERT INTO num_tmp VALUES (-4);
--Testcase 1264:
SELECT factorial(n1::int4) FROM num_tmp;
--
-- Tests for pg_lsn()
--
--Testcase 1265:
DELETE FROM num_tmp;
--Testcase 1266:
INSERT INTO num_tmp VALUES (23783416::numeric);
--Testcase 1267:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1268:
DELETE FROM num_tmp;
--Testcase 1269:
INSERT INTO num_tmp VALUES (0::numeric);
--Testcase 1270:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1271:
DELETE FROM num_tmp;
--Testcase 1272:
INSERT INTO num_tmp VALUES (18446744073709551615::numeric);
--Testcase 1273:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1274:
DELETE FROM num_tmp;
--Testcase 1275:
INSERT INTO num_tmp VALUES (-1::numeric);
--Testcase 1276:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1277:
DELETE FROM num_tmp;
--Testcase 1278:
INSERT INTO num_tmp VALUES (18446744073709551616::numeric);
--Testcase 1279:
SELECT pg_lsn(n1) FROM num_tmp;
--Testcase 1280:
DELETE FROM num_tmp;
--Testcase 1281:
INSERT INTO num_tmp VALUES ('NaN'::numeric);
--Testcase 1282:
SELECT pg_lsn(n1) FROM num_tmp;
DO $d$
declare
l_rec record;
begin
for l_rec in (select foreign_table_schema, foreign_table_name
from information_schema.foreign_tables) loop
execute format('drop foreign table %I.%I cascade;', l_rec.foreign_table_schema, l_rec.foreign_table_name);
end loop;
end;
$d$;
--Testcase 1083:
DROP SERVER sqlite_svr;
--Testcase 1084:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/out_of_range.sql
================================================
--
-- INT4 + INT2
--
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 01:
CREATE FOREIGN TABLE INT4_TBL(f1 int4 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 02:
CREATE FOREIGN TABLE INT4_TMP(f1 int4, f2 int4, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 03:
DELETE FROM INT4_TMP;
--Testcase 04:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 05:
INSERT INTO INT4_TMP VALUES (x'7FFFFFFF'::int8 + 1, 0);
--Testcase 06:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 07:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 08:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 09:
DELETE FROM INT4_TMP;
--Testcase 10:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int8;
--Testcase 11:
INSERT INTO INT4_TMP VALUES (-(x'7FFFFFFF'::int8) - 2, 0);
--Testcase 12:
ALTER FOREIGN TABLE INT4_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 13:
SELECT * FROM INT4_TMP; -- overflow
--Testcase 14:
SELECT f1 FROM INT4_TMP; -- overflow
--Testcase 15:
CREATE FOREIGN TABLE INT2_TBL(f1 int2 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 16:
CREATE FOREIGN TABLE INT2_TMP(f1 int2, f2 int2, id int OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 17:
DELETE FROM INT2_TMP;
--Testcase 18:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 19:
INSERT INTO INT2_TMP VALUES (x'7FFF'::int8 + 1, 0);
--Testcase 20:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 21:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 22:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 23:
DELETE FROM INT2_TMP;
--Testcase 24:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int4;
--Testcase 25:
INSERT INTO INT2_TMP VALUES (-(x'7FFF'::int8) - 2, 0);
--Testcase 26:
ALTER FOREIGN TABLE INT2_TMP ALTER COLUMN f1 TYPE int2;
--Testcase 27:
SELECT * FROM INT2_TMP; -- overflow
--Testcase 28:
SELECT f1 FROM INT2_TMP; -- overflow
--Testcase 29:
CREATE FOREIGN TABLE INT8_TBL(q1 int8 OPTIONS (key 'true'), q2 int8 OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 31:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 32:
INSERT INTO INT8_TBL VALUES (-9223372036854775810, 0);
--Testcase 33:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 34:
SELECT * FROM INT8_TBL; -- NO overflow
--Testcase 35:
SELECT q1 FROM INT8_TBL; -- NO overflow
--Testcase 36:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 37:
DELETE FROM INT8_TBL WHERE q1 = -9223372036854775810;
--Testcase 38:
INSERT INTO INT8_TBL VALUES (9223372036854775809, 0);
--Testcase 39:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 40:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 41:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 42:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 43:
DELETE FROM INT8_TBL WHERE q1 = 9223372036854775809;
--Testcase 44:
INSERT INTO INT8_TBL VALUES (10 * -9223372036854775810, 0);
--Testcase 45:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 46:
SELECT * FROM INT8_TBL; -- overflow
--Testcase 47:
SELECT q1 FROM INT8_TBL; -- overflow
--Testcase 48:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE double precision;
--Testcase 49:
DELETE FROM INT8_TBL WHERE q1 = 10 * -9223372036854775810;
--Testcase 50:
ALTER FOREIGN TABLE INT8_TBL ALTER COLUMN q1 TYPE int8;
--Testcase 003:
DROP SERVER sqlite_svr CASCADE;
--Testcase 004:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/timestamp.sql
================================================
--
-- TIMESTAMP
--
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/core.db');
--Testcase 3:
CREATE FOREIGN TABLE dates1 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number timestamp without time zone OPTIONS (column_type 'INT'))
SERVER sqlite_svr
OPTIONS (table 'dates');
--Testcase 4:
CREATE FOREIGN TABLE dates2 (
name varchar(20),
date_as_text timestamp without time zone,
date_as_number double precision)
SERVER sqlite_svr
OPTIONS (table 'dates');
-- Showing timestamp column from SQLite value as TEXT and as INTEGER/FLOAT has same value
--Testcase 5:
SELECT name,
to_char(date_as_text, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_text,
to_char(date_as_number, 'YYYY-MM-DD HH24:MI:SS.MS') as date_as_number
FROM dates1;
--Testcase 6:
SELECT * FROM dates2;
-- Comparing exact values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 7:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 8:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 9:
SELECT * FROM dates1
WHERE date_as_text = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 10:
SELECT * FROM dates1
WHERE date_as_number = to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
-- Comparing greater values showing same results even comparing to a text source sqlite column or numerical source sqlite column
--Testcase 11:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 12:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 13:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 14:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29.000', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 15:
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 16:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 17:
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--Testcase 18:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > to_timestamp('2020-05-10 10:45:29', 'YYYY-MM-DD HH24:MI:SS.MS');
--- Comparing without using to_timestamp
--Testcase 19:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 20:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 21:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 22:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 23:
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 24:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text = (('2020-05-10 10:45:29')::timestamp);
--Testcase 25:
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
--Testcase 26:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number = (('2020-05-10 10:45:29')::timestamp);
-- Comparing greater values without using to_timestamp
--Testcase 27:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 28:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 29:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 30:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29.000')::timestamp);
--Testcase 31:
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 32:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_text > (('2020-05-10 10:45:29')::timestamp);
--Testcase 33:
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
--Testcase 34:
explain (verbose, costs off)
SELECT * FROM dates1
WHERE date_as_number > (('2020-05-10 10:45:29')::timestamp);
-- test arithmetic with infinite timestamps
--Testcase 39:
CREATE FOREIGN TABLE inf_timestamp (
t1 TIMESTAMP ,
t2 TIMESTAMP,
id int OPTIONS (key 'true'))
SERVER sqlite_svr OPTIONS (table 'infinite_timestamp');;
--Testcase 40:
INSERT INTO inf_timestamp VALUES ('infinity'::timestamp, 'infinity'::timestamp);
--Testcase 41:
SELECT t1 - t2 FROM inf_timestamp;
--Testcase 42:
DELETE FROM inf_timestamp;
--Testcase 43:
INSERT INTO inf_timestamp VALUES ('infinity'::timestamp, '-infinity'::timestamp);
--Testcase 44:
SELECT t1 - t2 FROM inf_timestamp;
--Testcase 45:
DELETE FROM inf_timestamp;
--Testcase 46:
INSERT INTO inf_timestamp VALUES ('-infinity'::timestamp, 'infinity'::timestamp);
--Testcase 47:
SELECT t1 - t2 FROM inf_timestamp;
--Testcase 48:
DELETE FROM inf_timestamp;
--Testcase 49:
INSERT INTO inf_timestamp VALUES ('-infinity'::timestamp, '-infinity'::timestamp);
--Testcase 50:
SELECT t1 - t2 FROM inf_timestamp;
--Testcase 51:
DELETE FROM inf_timestamp;
--Testcase 52:
INSERT INTO inf_timestamp VALUES ('infinity'::timestamp, '1995-08-06 12:12:12'::timestamp);
--Testcase 53:
SELECT t1 - t2 FROM inf_timestamp;
--Testcase 54:
DELETE FROM inf_timestamp;
--Testcase 55:
INSERT INTO inf_timestamp VALUES ('-infinity'::timestamp, '1995-08-06 12:12:12'::timestamp);
--Testcase 56:
SELECT t1 - t2 FROM inf_timestamp;
-- test age() with infinite timestamps
--Testcase 58:
DELETE FROM inf_timestamp;
--Testcase 59:
INSERT INTO inf_timestamp(t1) VALUES ('infinity'::timestamp);
--Testcase 60:
SELECT age(t1) FROM inf_timestamp;
--Testcase 61:
DELETE FROM inf_timestamp;
--Testcase 62:
INSERT INTO inf_timestamp(t1) VALUES ('-infinity'::timestamp);
--Testcase 63:
SELECT age(t1) FROM inf_timestamp;
--Testcase 64:
DELETE FROM inf_timestamp;
--Testcase 65:
INSERT INTO inf_timestamp VALUES ('infinity'::timestamp, 'infinity':: timestamp);
--Testcase 66:
SELECT age(t1, t2) FROM inf_timestamp;
--Testcase 67:
DELETE FROM inf_timestamp;
--Testcase 68:
INSERT INTO inf_timestamp VALUES ('infinity'::timestamp, '-infinity':: timestamp);
--Testcase 69:
SELECT age(t1, t2) FROM inf_timestamp;
--Testcase 70:
DELETE FROM inf_timestamp;
--Testcase 71:
INSERT INTO inf_timestamp VALUES ('-infinity'::timestamp, 'infinity':: timestamp);
--Testcase 72:
SELECT age(t1, t2) FROM inf_timestamp;
--Testcase 73:
DELETE FROM inf_timestamp;
--Testcase 74:
INSERT INTO inf_timestamp VALUES ('-infinity'::timestamp, '-infinity':: timestamp);
--Testcase 75:
SELECT age(t1, t2) FROM inf_timestamp;
--Testcase 35:
DROP FOREIGN TABLE dates1;
--Testcase 36:
DROP FOREIGN TABLE dates2;
--Testcase 57:
DROP FOREIGN TABLE inf_timestamp;
--Testcase 37:
DROP SERVER sqlite_svr;
--Testcase 38:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/types/uuid.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 001:
CREATE EXTENSION sqlite_fdw;
--Testcase 002:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 009:
CREATE FOREIGN TABLE "type_UUID"( "i" int OPTIONS (key 'true'), "u" uuid) SERVER sqlite_svr OPTIONS (table 'type_UUID');
--Testcase 010:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE text;
--Testcase 011:
INSERT INTO "type_UUID" ("i", "u") VALUES (1, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 012:
INSERT INTO "type_UUID" ("i", "u") VALUES (2, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 013:
INSERT INTO "type_UUID" ("i", "u") VALUES (3, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 014:
INSERT INTO "type_UUID" ("i", "u") VALUES (4, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 015:
INSERT INTO "type_UUID" ("i", "u") VALUES (5, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 016:
INSERT INTO "type_UUID" ("i", "u") VALUES (6, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 017:
INSERT INTO "type_UUID" ("i", "u") VALUES (7, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 018:
INSERT INTO "type_UUID" ("i", "u") VALUES (8, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 019:
INSERT INTO "type_UUID" ("i", "u") VALUES (9, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 020:
INSERT INTO "type_UUID" ("i", "u") VALUES (10, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 021:
INSERT INTO "type_UUID" ("i", "u") VALUES (11, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 022:
INSERT INTO "type_UUID" ("i", "u") VALUES (12, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 023:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 024:
INSERT INTO "type_UUID" ("i", "u") VALUES (13, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 025:
INSERT INTO "type_UUID" ("i", "u") VALUES (14, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 026:
INSERT INTO "type_UUID" ("i", "u") VALUES (15, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11', 'hex'));
--Testcase 027:
INSERT INTO "type_UUID" ("i", "u") VALUES (16, decode('b0eebc999c0b4ef8bb6d6bb9bd380a12', 'hex'));
--Testcase 028:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 029:
INSERT INTO "type_UUID" ("i", "u") VALUES (17, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 030:
INSERT INTO "type_UUID" ("i", "u") VALUES (18, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 031:
INSERT INTO "type_UUID" ("i", "u") VALUES (19, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 032:
INSERT INTO "type_UUID" ("i", "u") VALUES (20, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 033:
INSERT INTO "type_UUID" ("i", "u") VALUES (21, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 034:
INSERT INTO "type_UUID" ("i", "u") VALUES (22, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 035:
INSERT INTO "type_UUID" ("i", "u") VALUES (23, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 036:
INSERT INTO "type_UUID" ("i", "u") VALUES (24, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 037:
INSERT INTO "type_UUID" ("i", "u") VALUES (25, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 038:
INSERT INTO "type_UUID" ("i", "u") VALUES (26, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 039:
INSERT INTO "type_UUID" ("i", "u") VALUES (27, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 040:
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 041:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (28, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 042:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (ADD column_type 'BLOB');
--Testcase 043:
INSERT INTO "type_UUID" ("i", "u") VALUES (29, 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
--Testcase 044:
INSERT INTO "type_UUID" ("i", "u") VALUES (30, 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11');
--Testcase 045:
INSERT INTO "type_UUID" ("i", "u") VALUES (31, '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}');
--Testcase 046:
INSERT INTO "type_UUID" ("i", "u") VALUES (32, 'a0eebc999c0b4ef8bb6d6bb9bd380a11');
--Testcase 047:
INSERT INTO "type_UUID" ("i", "u") VALUES (33, 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11');
--Testcase 048:
INSERT INTO "type_UUID" ("i", "u") VALUES (34, '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 049:
INSERT INTO "type_UUID" ("i", "u") VALUES (35, 'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12');
--Testcase 050:
INSERT INTO "type_UUID" ("i", "u") VALUES (36, 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12');
--Testcase 051:
INSERT INTO "type_UUID" ("i", "u") VALUES (37, '{b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12}');
--Testcase 052:
INSERT INTO "type_UUID" ("i", "u") VALUES (38, 'b0eebc999c0b4ef8bb6d6bb9bd380a12');
--Testcase 053:
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 054:
INSERT INTO "type_UUID" ("i", "u") VALUES (40, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 055:
EXPLAIN (VERBOSE, COSTS OFF)
INSERT INTO "type_UUID" ("i", "u") VALUES (39, 'b0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a12');
--Testcase 056:
CREATE FOREIGN TABLE "type_UUID+"( "i" int OPTIONS (key 'true'), "u" uuid, "t" text, "l" smallint) SERVER sqlite_svr OPTIONS (table 'type_UUID+');
--Testcase 057:
SELECT * FROM "type_UUID+";
--Testcase 058:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 059:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 060:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 061:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 062:
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 063:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" where "u" = 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11';
--Testcase 064:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 065:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 066:
SELECT * FROM "type_UUID+" where "u" = 'B0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A12';
--Testcase 067:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 068:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 069:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 070:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "i" = 25;
--Testcase 071:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 072:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 073:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a12';
--Testcase 074:
SELECT * FROM "type_UUID+";
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11';
--Testcase 076:
SELECT * FROM "type_UUID+";
--Testcase 077:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'TEXT');
--Testcase 075:
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 076:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "u" = 'b0eebc999c0b4ef8bb6d6bb9bd380a15';
--Testcase 077:
SELECT * FROM "type_UUID+";
--Testcase 078:
INSERT INTO "type_UUID" ("i", "u") VALUES (41, '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}');
--Testcase 079:
SELECT * FROM "type_UUID+" WHERE "i" = 41;
--Testcase 080:
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 081:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}';
--Testcase 082:
SELECT * FROM "type_UUID+";
--Testcase 083:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" OPTIONS (SET column_type 'BLOB');
--Testcase 084:
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE "type_UUID" SET "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a15}' WHERE "u" = '{b0eebc99-9c0b4ef8-bb6d6bb9-00000a15}';
--Testcase 085:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE bytea;
--Testcase 086:
INSERT INTO "type_UUID" ("i", "u") VALUES (42, decode('a0eebc999c0b4ef8bb6d6bb9bd380a11f1', 'hex'));
--Testcase 087:
INSERT INTO "type_UUID" ("i", "u") VALUES (43, decode('b0eebc999c0b4ef8bb6d6bb9bd380a', 'hex'));
--Testcase 088:
ALTER FOREIGN TABLE "type_UUID" ALTER COLUMN "u" TYPE uuid;
--Testcase 089:
SELECT * FROM "type_UUID+" WHERE "i" = 42;
--Testcase 090:
SELECT * FROM "type_UUID+" WHERE "i" = 43;
--Testcase 091:
EXPLAIN (VERBOSE, COSTS OFF)
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 092:
DELETE FROM "type_UUID" WHERE "i" IN (42, 43);
--Testcase 093:
INSERT INTO "type_UUID" ("i", "u") VALUES (44, NULL);
--Testcase 094:
SELECT * FROM "type_UUID+";
--Testcase 095:
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 096:
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 097:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NULL;
--Testcase 098:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT * FROM "type_UUID+" WHERE "u" IS NOT NULL;
--Testcase 100:
CREATE FOREIGN TABLE "type_UUIDpk" (col uuid OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 101:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (ADD column_type 'TEXT');
--Testcase 102:
INSERT INTO "type_UUIDpk" VALUES ('{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}');
--Testcase 103:
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 104:
SELECT * FROM "type_UUIDpk";
--Testcase 105: ERR - primary key
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 106:
ALTER FOREIGN TABLE "type_UUIDpk" ALTER COLUMN col OPTIONS (SET column_type 'BLOB');
--Testcase 107: NO ERR, but the same semantics!
INSERT INTO "type_UUIDpk" VALUES ('{b0eebc99-9c0b4ef8-bb6d6bb9-bd380a12}');
--Testcase 108:
SELECT * FROM "type_UUIDpk";
--Testcase 109:
DELETE FROM "type_UUIDpk";
--Testcase 200:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/with_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/with_gis_support/postgis.sql
================================================
--Testcase 2:
CREATE EXTENSION sqlite_fdw;
--Testcase 3:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 4:
CREATE EXTENSION IF NOT EXISTS postgis;
--Testcase 5:
CREATE EXTENSION postgis_raster;
--Testcase 6:
CREATE EXTENSION postgis_topology;
-- TEST GIS DATA FROM UNION ASTRONOMIQUE INTERNATIONAL (国際天文学連合): MARS, Olympus mons
--Testcase 11:
CREATE SCHEMA "♂";
--Testcase 12:
CREATE TABLE "♂"."テスト" (
id int4 NULL,
"UAI" varchar(254) NULL,
"⌖" public.geometry(point, 104904) NULL,
geom public.geometry(geometry, 104904) NULL,
"t₀" date NULL,
"class" text NULL,
"URL" varchar(80) NULL
);
--Testcase 13: ETC...
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(991, 'Olympus Mons', 'SRID=104904;POINT (226.19749330952843 18.652758890345698)'::geometry, 'SRID=104904;MULTIPOLYGON (((223.78717231750488 23.3314151763916, 224.22803688049316 23.324007034301758, 224.32436180114746 23.5648136138916, 224.7186985015869 23.593564987182617, 224.79486274719238 23.45737648010254, 225.06530570983887 23.238798141479492, 225.67255210876465 23.437196731567383, 226.2211856842041 23.6611385345459, 226.5472011566162 23.65372657775879, 227.6215763092041 23.435148239135742, 228.19009590148926 23.390283584594727, 228.753023147583 23.24955177307129, 228.90711784362793 23.1943416595459, 229.23219108581543 23.004926681518555, 229.5288143157959 22.75514030456543, 229.87227058410645 22.442903518676758, 230.2469539642334 22.14628028869629, 230.7309169769287 21.927717208862305, 231.30854988098145 21.64670753479004, 231.85495948791504 21.084684371948242, 232.19841957092285 19.88258171081543, 231.88618278503418 18.47752571105957, 231.30854988098145 17.743772506713867, 231.21887397766113 17.218599319458008, 231.17812156677246 16.751802444458008, 230.97346687316895 16.353670120239258, 230.8327350616455 15.947111129760742, 230.62945365905762 15.478002548217773, 230.4574489593506 15.352907180786133, 230.20748329162598 15.29954719543457, 229.99631309509277 15.036508560180664, 229.72586631774902 14.640104293823242, 229.41096305847168 14.377065658569336, 228.98862266540527 14.10291862487793, 228.74040412902832 13.854700088500977, 228.5107135772705 13.83247184753418, 228.31806755065918 13.962137222290039, 227.93990516662598 13.929948806762695, 227.36133766174316 13.883039474487305, 227.04734230041504 13.813947677612305, 226.68895149230957 13.851762771606445, 226.4101276397705 13.839879989624023, 226.06347465515137 13.632848739624023, 225.7766170501709 13.617597579956055, 225.32925987243652 13.481771469116211, 224.76723670959473 13.591054916381836, 224.15838050842285 13.731557846069336, 223.12800407409668 14.106241226196289, 222.39425468444824 14.402864456176758, 221.67611503601074 14.918050765991211, 221.434663772583 15.403280258178711, 221.30129432678223 16.051607131958008, 221.0864200592041 16.410966873168945, 221.09012413024902 16.6591854095459, 221.1975612640381 17.09263801574707, 220.9971103668213 17.32316017150879, 220.75670051574707 17.422361373901367, 220.82338523864746 17.844701766967773, 221.18475532531738 18.073732376098633, 221.3567600250244 18.5584774017334, 221.40367317199707 19.10576820373535, 221.3567600250244 19.90325355529785, 221.42725563049316 20.59361457824707, 221.778959274292 21.40439796447754, 222.34188652038574 22.201879501342773, 223.01658821105957 23.272138595581055, 223.3759479522705 23.668546676635742, 223.3722438812256 23.675954818725586, 223.57600212097168 23.675954818725586, 223.70566749572754 23.542585372924805, 223.78717231750488 23.3314151763916)))'::geometry, '1973-01-01', 'mo', 'http://planetarynames.wr.usgs.gov/Feature/4453');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(248, 'Karzok', 'SRID=104904;POINT (228.262902951161 18.4035270924109)'::geometry, 'SRID=104904;MULTIPOLYGON (((228.269330978394 18.2748584747314, 228.266962051392 18.2748394012451, 228.264589309692 18.2748584747314, 228.26222038269 18.2749156951904, 228.259851455688 18.2750148773193, 228.257482528687 18.2751522064209, 228.255121231079 18.2753276824951, 228.252759933472 18.2755451202393, 228.250402450562 18.2757968902588, 228.248052597046 18.2760906219482, 228.245706558228 18.2764263153076, 228.243368148804 18.2767963409424, 228.241037368774 18.2772083282471, 228.23871421814 18.2776546478271, 228.236398696899 18.2781429290771, 228.234094619751 18.2786655426025, 228.231798171997 18.2792301177979, 228.229513168335 18.2798328399658, 228.227239608765 18.2804698944092, 228.224977493286 18.2811489105225, 228.222726821899 18.2818622589111, 228.220491409302 18.2826137542725, 228.218271255493 18.2833995819092, 228.216066360474 18.2842235565186, 228.213872909546 18.2850856781006, 228.211698532104 18.285982131958, 228.209539413452 18.2869167327881, 228.207399368286 18.2878856658936, 228.205278396606 18.2888889312744, 228.203172683716 18.2899265289307, 228.201089859009 18.2910022735596, 228.199026107788 18.2921085357666, 228.196981430054 18.2932529449463, 228.194959640503 18.2944278717041, 228.192956924438 18.2956371307373, 228.190980911255 18.2968769073486, 228.189023971558 18.2981548309326, 228.187093734741 18.2994594573975, 228.185186386108 18.3007984161377, 228.183305740356 18.3021678924561, 228.181447982788 18.3035678863525, 228.179616928101 18.3050022125244, 228.177812576294 18.3064632415771, 228.176038742065 18.307954788208, 228.174287796021 18.3094730377197, 228.172567367554 18.3110218048096, 228.170873641968 18.3126010894775, 228.16921043396 18.3142032623291, 228.16757774353 18.3158359527588, 228.165975570679 18.3174953460693, 228.164403915405 18.3191814422607, 228.162858963013 18.320894241333, 228.161352157593 18.3226299285889, 228.159872055054 18.3243923187256, 228.158430099487 18.3261775970459, 228.157014846802 18.3279857635498, 228.155637741089 18.3298168182373, 228.154294967651 18.3316707611084, 228.152982711792 18.3335475921631, 228.151708602905 18.3354473114014, 228.150468826294 18.337366104126, 228.149263381958 18.3393039703369, 228.148092269897 18.3412647247314, 228.14695930481 18.343240737915, 228.145864486694 18.3452396392822, 228.144804000854 18.3472537994385, 228.143781661987 18.3492832183838, 228.142793655396 18.3513317108154, 228.141847610474 18.3533954620361, 228.140939712524 18.3554744720459, 228.140066146851 18.3575687408447, 228.139234542847 18.3596782684326, 228.138441085815 18.3617992401123, 228.137685775757 18.3639354705811, 228.136972427368 18.3660831451416, 228.136297225952 18.3682422637939, 228.135660171509 18.3704090118408, 228.135065078735 18.3725872039795, 228.134511947632 18.37477684021, 228.133996963501 18.376974105835, 228.133520126343 18.3791828155518, 228.133085250854 18.3813953399658, 228.132692337036 18.3836154937744, 228.132341384888 18.3858432769775, 228.132028579712 18.3880748748779, 228.131757736206 18.3903102874756, 228.13152885437 18.3925533294678, 228.131341934204 18.39479637146, 228.131196975708 18.3970432281494, 228.131090164185 18.3992938995361, 228.131025314331 18.4015445709229, 228.131002426147 18.4037952423096, 228.131021499634 18.4060459136963, 228.13108253479 18.408296585083, 228.131185531616 18.4105472564697, 228.131326675415 18.4127941131592, 228.131513595581 18.4150371551514, 228.13173866272 18.4172801971436, 228.132005691528 18.4195156097412, 228.132314682007 18.4217510223389, 228.132661819458 18.4239749908447, 228.133054733276 18.4261989593506, 228.13348197937 18.4284114837646, 228.133955001831 18.4306163787842, 228.134466171265 18.4328174591064, 228.135019302368 18.4350070953369, 228.135610580444 18.4371852874756, 228.13624382019 18.4393558502197, 228.136919021606 18.4415149688721, 228.137628555298 18.4436626434326, 228.138380050659 18.4457988739014, 228.13917350769 18.4479236602783, 228.140001296997 18.4500331878662, 228.140871047974 18.452127456665, 228.141775131226 18.4542064666748, 228.142721176147 18.4562740325928, 228.143705368042 18.4583225250244, 228.144723892212 18.460355758667, 228.145784378052 18.4623699188232, 228.146879196167 18.4643688201904, 228.148008346558 18.4663486480713, 228.149175643921 18.4683094024658, 228.150381088257 18.4702472686768, 228.151620864868 18.4721698760986, 228.152894973755 18.4740695953369, 228.154203414917 18.4759464263916, 228.155546188354 18.47780418396, 228.156923294067 18.4796352386475, 228.158334732056 18.4814472198486, 228.159776687622 18.4832363128662, 228.161256790161 18.4849987030029, 228.162763595581 18.4867343902588, 228.164304733276 18.4884471893311, 228.16587638855 18.4901371002197, 228.167478561401 18.4917964935303, 228.169115066528 18.49342918396, 228.170778274536 18.4950351715088, 228.172468185425 18.4966144561768, 228.174192428589 18.4981670379639, 228.175939559937 18.4996891021729, 228.177717208862 18.5011806488037, 228.179521560669 18.5026454925537, 228.181352615356 18.5040760040283, 228.183210372925 18.5054798126221, 228.185094833374 18.5068492889404, 228.187002182007 18.5081920623779, 228.188936233521 18.50950050354, 228.190893173218 18.5107746124268, 228.192869186401 18.5120182037354, 228.194871902466 18.5132274627686, 228.196897506714 18.5144062042236, 228.198942184448 18.5155506134033, 228.201009750366 18.5166568756104, 228.203096389771 18.5177326202393, 228.205202102661 18.5187740325928, 228.207326889038 18.5197811126709, 228.209466934204 18.5207500457764, 228.211629867554 18.5216846466064, 228.213804244995 18.5225811004639, 228.21600151062 18.5234432220459, 228.218210220337 18.5242710113525, 228.220434188843 18.5250568389893, 228.22266960144 18.5258121490479, 228.224924087524 18.5265254974365, 228.227186203003 18.5272045135498, 228.229463577271 18.5278415679932, 228.23175239563 18.5284442901611, 228.234052658081 18.5290088653564, 228.236360549927 18.5295352935791, 228.238679885864 18.5300235748291, 228.241006851196 18.5304698944092, 228.243341445923 18.5308818817139, 228.245683670044 18.5312557220459, 228.248029708862 18.531587600708, 228.250383377075 18.5318813323975, 228.252744674683 18.5321369171143, 228.255109786987 18.5323505401611, 228.257474899292 18.5325298309326, 228.259847640991 18.5326671600342, 228.262216567993 18.5327663421631, 228.26459312439 18.5328235626221, 228.266965866089 18.5328426361084, 228.269342422485 18.5328235626221, 228.271715164185 18.5327625274658, 228.274087905884 18.5326671600342, 228.276456832886 18.5325298309326, 228.278825759888 18.5323505401611, 228.281187057495 18.5321369171143, 228.283548355103 18.5318813323975, 228.285902023315 18.531587600708, 228.288251876831 18.5312519073486, 228.290594100952 18.5308818817139, 228.292928695679 18.5304698944092, 228.295255661011 18.5300197601318, 228.297574996948 18.5295352935791, 228.299882888794 18.5290088653564, 228.302179336548 18.5284442901611, 228.304468154907 18.5278415679932, 228.306745529175 18.5272006988525, 228.309011459351 18.5265254974365, 228.311262130737 18.5258083343506, 228.313501358032 18.5250568389893, 228.315725326538 18.5242671966553, 228.317934036255 18.5234432220459, 228.320127487183 18.5225811004639, 228.322305679321 18.5216808319092, 228.324464797974 18.5207462310791, 228.326608657837 18.5197772979736, 228.328733444214 18.5187702178955, 228.330839157104 18.5177326202393, 228.332925796509 18.5166568756104, 228.334989547729 18.5155467987061, 228.337034225464 18.5144023895264, 228.339059829712 18.5132274627686, 228.341062545776 18.5120143890381, 228.343042373657 18.5107707977295, 228.344995498657 18.5094966888428, 228.346929550171 18.5081882476807, 228.348836898804 18.5068454742432, 228.350721359253 18.5054759979248, 228.352579116821 18.5040721893311, 228.354410171509 18.5026416778564, 228.356214523315 18.5011768341064, 228.357992172241 18.4996852874756, 228.359739303589 18.4981632232666, 228.361463546753 18.4966106414795, 228.363153457642 18.4950313568115, 228.364816665649 18.4934253692627, 228.366449356079 18.491792678833, 228.368055343628 18.4901294708252, 228.369626998901 18.4884433746338, 228.371168136597 18.4867305755615, 228.372674942017 18.4849910736084, 228.374151229858 18.4832286834717, 228.375597000122 18.4814434051514, 228.37700843811 18.4796314239502, 228.378385543823 18.4778003692627, 228.379728317261 18.4759426116943, 228.381036758423 18.4740619659424, 228.38231086731 18.4721660614014, 228.383550643921 18.4702434539795, 228.38475227356 18.4683017730713, 228.385919570923 18.4663410186768, 228.387052536011 18.4643650054932, 228.388147354126 18.462366104126, 228.389204025269 18.4603481292725, 228.390226364136 18.4583187103271, 228.391206741333 18.4562664031982, 228.392152786255 18.4542026519775, 228.393060684204 18.4521198272705, 228.393926620483 18.4500255584717, 228.394758224487 18.4479160308838, 228.395547866821 18.4457950592041, 228.396299362183 18.4436588287354, 228.397012710571 18.4415111541748, 228.39768409729 18.4393520355225, 228.398317337036 18.4371814727783, 228.398908615112 18.4349994659424, 228.399461746216 18.4328098297119, 228.399972915649 18.4306125640869, 228.40044593811 18.4284076690674, 228.400876998901 18.4261913299561, 228.401266098022 18.4239711761475, 228.401613235474 18.4217433929443, 228.401922225952 18.4195117950439, 228.402189254761 18.417272567749, 228.402414321899 18.4150333404541, 228.402597427368 18.4127864837646, 228.402742385864 18.4105396270752, 228.40284538269 18.4082927703857, 228.402902603149 18.406042098999, 228.402921676636 18.403787612915, 228.402898788452 18.4015369415283, 228.402837753296 18.3992862701416, 228.402730941772 18.3970394134521, 228.402585983276 18.3947887420654, 228.402395248413 18.3925457000732, 228.402166366577 18.3903064727783, 228.401895523071 18.3880672454834, 228.401586532593 18.385835647583, 228.401231765747 18.3836116790771, 228.400838851929 18.3813877105713, 228.40040397644 18.3791751861572, 228.399930953979 18.3769702911377, 228.399415969849 18.3747730255127, 228.398859024048 18.3725833892822, 228.398263931274 18.3704051971436, 228.397626876831 18.3682346343994, 228.396951675415 18.3660755157471, 228.396238327026 18.3639316558838, 228.395483016968 18.361795425415, 228.394689559937 18.3596744537354, 228.393857955933 18.3575649261475, 228.392988204956 18.3554706573486, 228.39207649231 18.3533916473389, 228.391130447388 18.3513278961182, 228.390146255493 18.3492794036865, 228.389120101929 18.3472461700439, 228.388063430786 18.3452320098877, 228.386964797974 18.3432369232178, 228.385831832886 18.3412609100342, 228.384660720825 18.3393001556396, 228.383455276489 18.3373622894287, 228.382215499878 18.3354434967041, 228.380941390991 18.3335437774658, 228.379629135132 18.3316669464111, 228.378286361694 18.32981300354, 228.376905441284 18.3279819488525, 228.375494003296 18.3261699676514, 228.374048233032 18.3243846893311, 228.37257194519 18.3226261138916, 228.371061325073 18.3208866119385, 228.369520187378 18.3191776275635, 228.367948532104 18.3174915313721, 228.366346359253 18.3158321380615, 228.364709854126 18.3141994476318, 228.363046646118 18.3125972747803, 228.361356735229 18.3110179901123, 228.359636306763 18.3094692230225, 228.357885360718 18.3079509735107, 228.356107711792 18.3064594268799, 228.354303359985 18.3049983978271, 228.352472305298 18.3035640716553, 228.350618362427 18.3021640777588, 228.348733901978 18.3007946014404, 228.346826553345 18.2994556427002, 228.344896316528 18.2981510162354, 228.342943191528 18.2968769073486, 228.340963363647 18.29563331604, 228.33896446228 18.2944240570068, 228.336938858032 18.293249130249, 228.334897994995 18.2921085357666, 228.332830429077 18.2909984588623, 228.33074760437 18.2899265289307, 228.328645706177 18.2888851165771, 228.3265209198 18.2878818511963, 228.324380874634 18.2869129180908, 228.322221755981 18.285982131958, 228.32004737854 18.2850856781006, 228.31785774231 18.2842235565186, 228.315649032593 18.2833995819092, 228.313428878784 18.2826099395752, 228.311193466187 18.2818584442139, 228.3089427948 18.2811450958252, 228.306684494019 18.2804698944092, 228.304410934448 18.2798290252686, 228.302125930786 18.2792301177979, 228.299829483032 18.2786655426025, 228.297521591187 18.2781391143799, 228.295206069946 18.2776546478271, 228.292882919312 18.2772045135498, 228.290552139282 18.2767963409424, 228.288213729858 18.2764225006104, 228.28586769104 18.2760906219482, 228.283517837524 18.2757968902588, 228.281160354614 18.2755451202393, 228.278802871704 18.2753276824951, 228.276437759399 18.2751522064209, 228.274072647095 18.2750148773193, 228.271703720093 18.2749156951904, 228.269330978394 18.2748584747314)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14144');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(249, 'Pangboche', 'SRID=104904;POINT (226.595873773026 17.2783598670807)'::geometry, 'SRID=104904;MULTIPOLYGON (((226.601442337036 17.1929302215576, 226.599878311157 17.1929187774658, 226.598310470581 17.1929302215576, 226.596746444702 17.1929721832275, 226.595178604126 17.1930370330811, 226.593618392944 17.1931285858154, 226.592054367065 17.1932430267334, 226.590497970581 17.1933879852295, 226.588941574097 17.1935558319092, 226.587385177612 17.193754196167, 226.585836410522 17.1939754486084, 226.58429145813 17.1942195892334, 226.582754135132 17.1944942474365, 226.581216812134 17.1947917938232, 226.57968711853 17.1951160430908, 226.578165054321 17.195463180542, 226.576650619507 17.195837020874, 226.57513999939 17.1962375640869, 226.573637008667 17.1966648101807, 226.572145462036 17.197114944458, 226.570657730103 17.1975879669189, 226.569181442261 17.1980876922607, 226.567712783813 17.1986103057861, 226.566255569458 17.1991596221924, 226.564809799194 17.1997318267822, 226.563371658325 17.2003269195557, 226.561948776245 17.20094871521, 226.56053352356 17.2015933990479, 226.559129714966 17.2022609710693, 226.557741165161 17.2029514312744, 226.556364059448 17.2036647796631, 226.555002212524 17.2044010162354, 226.553651809692 17.2051601409912, 226.552316665649 17.2059421539307, 226.550992965698 17.2067432403564, 226.549688339233 17.2075710296631, 226.54839515686 17.2084178924561, 226.547121047974 17.2092876434326, 226.545862197876 17.2101764678955, 226.544618606567 17.211088180542, 226.543394088745 17.2120189666748, 226.542184829712 17.2129688262939, 226.540990829468 17.2139415740967, 226.539819717407 17.2149333953857, 226.538663864136 17.2159404754639, 226.537527084351 17.2169704437256, 226.536409378052 17.2180194854736, 226.535310745239 17.219087600708, 226.534231185913 17.2201709747314, 226.533174514771 17.2212734222412, 226.532133102417 17.2223949432373, 226.531118392944 17.2235317230225, 226.530118942261 17.2246875762939, 226.529146194458 17.2258586883545, 226.528188705444 17.2270450592041, 226.527257919312 17.2282466888428, 226.526346206665 17.2294635772705, 226.525461196899 17.2306995391846, 226.52459526062 17.2319469451904, 226.523752212524 17.2332057952881, 226.522932052612 17.2344837188721, 226.522138595581 17.2357730865479, 226.521364212036 17.2370738983154, 226.520616531372 17.2383899688721, 226.519891738892 17.2397136688232, 226.519193649292 17.2410526275635, 226.518518447876 17.2424030303955, 226.517869949341 17.2437648773193, 226.517244338989 17.245138168335, 226.516641616821 17.2465190887451, 226.516069412231 17.2479114532471, 226.515520095825 17.2493152618408, 226.514993667603 17.2507228851318, 226.514497756958 17.2521419525146, 226.514024734497 17.253568649292, 226.513578414917 17.2550029754639, 226.513158798218 17.2564449310303, 226.512765884399 17.2578945159912, 226.512399673462 17.2593479156494, 226.512060165405 17.2608089447021, 226.511747360229 17.2622776031494, 226.511461257935 17.2637462615967, 226.511201858521 17.2652225494385, 226.510969161987 17.2667026519775, 226.510766983032 17.2681865692139, 226.510587692261 17.2696743011475, 226.51043510437 17.2711620330811, 226.510313034058 17.2726535797119, 226.510217666626 17.27414894104, 226.510149002075 17.2756404876709, 226.510107040405 17.277135848999, 226.510091781616 17.2786350250244, 226.510103225708 17.2801303863525, 226.510145187378 17.2816257476807, 226.510213851929 17.2831211090088, 226.510305404663 17.2846164703369, 226.510431289673 17.2861080169678, 226.510580062866 17.2875957489014, 226.51075553894 17.289083480835, 226.510957717896 17.2905673980713, 226.511190414429 17.2920475006104, 226.511449813843 17.2935237884521, 226.51173210144 17.2949924468994, 226.512044906616 17.2964611053467, 226.512384414673 17.2979221343994, 226.51275062561 17.2993755340576, 226.513139724731 17.3008251190186, 226.513559341431 17.302267074585, 226.514001846313 17.3037014007568, 226.514474868774 17.3051280975342, 226.514970779419 17.306547164917, 226.515493392944 17.3079586029053, 226.516042709351 17.309362411499, 226.51661491394 17.310754776001, 226.517213821411 17.3121356964111, 226.517839431763 17.3135089874268, 226.518487930298 17.3148708343506, 226.519163131714 17.3162212371826, 226.519861221313 17.3175601959229, 226.520586013794 17.3188877105713, 226.521333694458 17.3202037811279, 226.522104263306 17.3215045928955, 226.522897720337 17.3227939605713, 226.523717880249 17.3240718841553, 226.524557113647 17.3253345489502, 226.525423049927 17.3265819549561, 226.52631187439 17.3278141021729, 226.527219772339 17.3290348052979, 226.528150558472 17.3302364349365, 226.529108047485 17.3314228057861, 226.530080795288 17.3325939178467, 226.531076431274 17.3337497711182, 226.532094955444 17.3348903656006, 226.533132553101 17.3360080718994, 226.53419303894 17.3371143341064, 226.535272598267 17.3381977081299, 226.536371231079 17.3392658233643, 226.537488937378 17.3403148651123, 226.538625717163 17.341344833374, 226.539781570435 17.3423557281494, 226.540952682495 17.3433475494385, 226.542146682739 17.3443202972412, 226.543355941772 17.3452739715576, 226.544580459595 17.3462047576904, 226.545824050903 17.3471164703369, 226.547082901001 17.3480052947998, 226.548360824585 17.3488750457764, 226.549654006958 17.3497219085693, 226.550958633423 17.350549697876, 226.552282333374 17.351354598999, 226.553617477417 17.3521366119385, 226.554967880249 17.3528957366943, 226.55633354187 17.3536319732666, 226.557710647583 17.3543453216553, 226.559099197388 17.3550395965576, 226.560503005981 17.3557071685791, 226.561918258667 17.356351852417, 226.563344955444 17.356969833374, 226.564783096313 17.3575687408447, 226.566232681274 17.3581409454346, 226.56768989563 17.3586902618408, 226.569158554077 17.3592128753662, 226.570634841919 17.359712600708, 226.572122573853 17.3601894378662, 226.573617935181 17.3606395721436, 226.575120925903 17.36106300354, 226.576631546021 17.3614635467529, 226.578149795532 17.361837387085, 226.579675674438 17.3621883392334, 226.581205368042 17.362512588501, 226.58274269104 17.3628101348877, 226.584283828735 17.3630847930908, 226.585828781128 17.3633289337158, 226.587377548218 17.3635501861572, 226.588933944702 17.363748550415, 226.590490341187 17.3639163970947, 226.592050552368 17.3640613555908, 226.593614578247 17.3641757965088, 226.595178604126 17.3642673492432, 226.596746444702 17.3643321990967, 226.598314285278 17.3643741607666, 226.599882125854 17.3643856048584, 226.601449966431 17.3643741607666, 226.603017807007 17.3643321990967, 226.604581832886 17.3642673492432, 226.606145858765 17.3641757965088, 226.607709884644 17.3640613555908, 226.609270095825 17.3639163970947, 226.610830307007 17.3637447357178, 226.612382888794 17.3635501861572, 226.613931655884 17.3633289337158, 226.615480422974 17.3630809783936, 226.617021560669 17.3628101348877, 226.618558883667 17.362512588501, 226.620088577271 17.3621883392334, 226.621610641479 17.361837387085, 226.623128890991 17.3614635467529, 226.624639511108 17.36106300354, 226.626142501831 17.3606395721436, 226.627637863159 17.3601856231689, 226.629125595093 17.359712600708, 226.630601882935 17.3592128753662, 226.632070541382 17.3586902618408, 226.633531570435 17.3581409454346, 226.634977340698 17.3575687408447, 226.636415481567 17.356969833374, 226.637842178345 17.3563480377197, 226.63925743103 17.3557033538818, 226.640661239624 17.3550357818604, 226.642049789429 17.3543453216553, 226.643426895142 17.3536319732666, 226.644792556763 17.3528957366943, 226.646142959595 17.3521327972412, 226.647478103638 17.3513507843018, 226.648801803589 17.3505458831787, 226.650110244751 17.3497219085693, 226.651399612427 17.3488750457764, 226.652677536011 17.3480052947998, 226.653936386108 17.3471126556396, 226.655179977417 17.3462009429932, 226.656408309937 17.3452701568604, 226.65761756897 17.3443202972412, 226.658807754517 17.3433475494385, 226.659982681274 17.3423557281494, 226.661138534546 17.341344833374, 226.662275314331 17.3403148651123, 226.66339302063 17.3392658233643, 226.664487838745 17.3381977081299, 226.665567398071 17.3371105194092, 226.666627883911 17.3360080718994, 226.667665481567 17.3348865509033, 226.668684005737 17.3337459564209, 226.669679641724 17.3325939178467, 226.670656204224 17.3314228057861, 226.67160987854 17.3302326202393, 226.672540664673 17.3290309906006, 226.673448562622 17.3278141021729, 226.674337387085 17.3265781402588, 226.675203323364 17.3253307342529, 226.676042556763 17.324068069458, 226.676862716675 17.3227939605713, 226.677656173706 17.3215007781982, 226.678426742554 17.3201999664307, 226.679174423218 17.318883895874, 226.679899215698 17.3175563812256, 226.680597305298 17.3162174224854, 226.681272506714 17.3148670196533, 226.681921005249 17.3135051727295, 226.682546615601 17.3121318817139, 226.683145523071 17.3107509613037, 226.683717727661 17.3093585968018, 226.684267044067 17.307954788208, 226.684789657593 17.3065433502197, 226.685285568237 17.3051242828369, 226.685754776001 17.3036975860596, 226.686201095581 17.3022632598877, 226.686616897583 17.3008213043213, 226.687009811401 17.2993717193604, 226.687376022339 17.2979183197021, 226.687715530396 17.2964572906494, 226.688024520874 17.2949886322021, 226.688310623169 17.2935199737549, 226.688570022583 17.2920436859131, 226.688798904419 17.290563583374, 226.689004898071 17.2890796661377, 226.689180374146 17.2875919342041, 226.689329147339 17.2861042022705, 226.689451217651 17.2846126556396, 226.689546585083 17.2831172943115, 226.689615249634 17.2816219329834, 226.689653396606 17.2801265716553, 226.689668655396 17.2786312103271, 226.689653396606 17.277135848999, 226.689611434937 17.2756366729736, 226.689542770386 17.2741451263428, 226.689443588257 17.2726497650146, 226.689321517944 17.2711582183838, 226.689168930054 17.2696704864502, 226.688993453979 17.2681827545166, 226.688787460327 17.2666988372803, 226.688554763794 17.2652187347412, 226.68829536438 17.2637424468994, 226.688009262085 17.2622737884521, 226.687696456909 17.2608051300049, 226.687356948853 17.2593441009521, 226.686990737915 17.2578907012939, 226.686597824097 17.256441116333, 226.686178207397 17.2549991607666, 226.685731887817 17.2535648345947, 226.685258865356 17.2521381378174, 226.684762954712 17.2507190704346, 226.684236526489 17.2493114471436, 226.683687210083 17.2479076385498, 226.683115005493 17.2465152740479, 226.682512283325 17.2451343536377, 226.681886672974 17.2437610626221, 226.681238174438 17.2424030303955, 226.680562973022 17.2410526275635, 226.679864883423 17.2397136688232, 226.679140090942 17.2383861541748, 226.678392410278 17.2370700836182, 226.677618026733 17.2357692718506, 226.676824569702 17.2344799041748, 226.67600440979 17.2332057952881, 226.675161361694 17.2319431304932, 226.674295425415 17.2306957244873, 226.673410415649 17.2294635772705, 226.672498703003 17.2282428741455, 226.671564102173 17.2270412445068, 226.670610427856 17.2258548736572, 226.669637680054 17.2246837615967, 226.66863822937 17.2235317230225, 226.6676197052 17.22239112854, 226.666582107544 17.2212734222412, 226.665525436401 17.2201709747314, 226.664445877075 17.2190837860107, 226.663347244263 17.2180194854736, 226.662229537964 17.2169704437256, 226.661092758179 17.2159404754639, 226.659936904907 17.2149295806885, 226.658761978149 17.2139377593994, 226.657571792603 17.2129650115967, 226.656362533569 17.2120151519775, 226.655138015747 17.2110843658447, 226.653894424438 17.2101726531982, 226.652635574341 17.2092838287354, 226.651357650757 17.2084140777588, 226.650068283081 17.2075672149658, 226.648759841919 17.2067432403564, 226.647439956665 17.2059383392334, 226.646104812622 17.2051563262939, 226.64475440979 17.2043972015381, 226.643388748169 17.2036609649658, 226.642011642456 17.2029476165771, 226.640623092651 17.2022571563721, 226.639223098755 17.2015895843506, 226.637807846069 17.2009449005127, 226.636381149292 17.2003269195557, 226.63494682312 17.1997318267822, 226.633497238159 17.1991558074951, 226.632040023804 17.1986103057861, 226.630575180054 17.1980838775635, 226.629095077515 17.1975879669189, 226.627611160278 17.1971111297607, 226.62611579895 17.1966609954834, 226.624616622925 17.1962375640869, 226.623106002808 17.195837020874, 226.621587753296 17.195463180542, 226.620065689087 17.1951160430908, 226.618535995483 17.1947917938232, 226.617002487183 17.1944942474365, 226.615461349487 17.1942195892334, 226.613916397095 17.1939716339111, 226.612367630005 17.1937503814697, 226.610815048218 17.1935558319092, 226.609258651733 17.1933879852295, 226.607698440552 17.1932430267334, 226.60613822937 17.1931285858154, 226.604574203491 17.1930370330811, 226.603010177612 17.1929721832275, 226.601442337036 17.1929302215576)))'::geometry, '2006-01-01', 'aa', 'http://planetarynames.wr.usgs.gov/Feature/14145');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1849, 'Hermes Patera', 'SRID=104904;POINT (226.57 18.33)'::geometry, 'SRID=104904;POLYGON ((226.27743530274 18.067016601562, 226.25820922852 18.135681152343, 226.255462646485 18.216705322265124, 226.26507568359813 18.293609619139627, 226.25614929199594 18.331375122069314, 226.26095581055 18.369140624999, 226.28842163086 18.465270996093, 226.35159301758 18.528442382812, 226.44772338867 18.577880859374, 226.48480224609438 18.594360351561626, 226.52462768555 18.6026000976555, 226.57955932617 18.608093261718, 226.68118286133 18.586120605468, 226.70590209961 18.569641113281, 226.74435424805 18.539428710937, 226.78555297852 18.514709472656, 226.83224487305 18.498229980468, 226.86932373046687 18.488616943359126, 226.89404296875 18.4721374511715, 226.90090942383 18.451538085937, 226.90640258789 18.410339355468, 226.91189575195 18.380126953124, 226.92013549805 18.322448730468, 226.90640258789 18.251037597656, 226.87344360352 18.187866210937, 226.82949829102 18.146667480468, 226.79379272461 18.113708496093, 226.77456665039 18.102722167968, 226.72787475586 18.119201660156, 226.68392944336 18.141174316406, 226.63723754883125 18.15490722656175, 226.58779907226562 18.14254760742125, 226.56033325195 18.121948242187, 226.52188110352 18.088989257812, 226.48617553711 18.067016601562, 226.45321655274 18.083496093749, 226.38729858399 18.086242675781, 226.32412719727 18.078002929687, 226.27743530274 18.067016601562))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15690');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1688, 'Olympus Rupes', 'SRID=104904;POINT (226.43548539543502 18.401964175317982)'::geometry, 'SRID=104904;MULTILINESTRING ((227.42951774597168 22.934080123901367, 227.93671226501465 22.65593910217285, 228.34573936462402 22.4268856048584, 228.52571296691895 22.295995712280273, 228.67296028137207 22.099660873413086, 228.96746253967285 22.099660873413086, 229.62190437316895 21.739717483520508, 230.1290988922119 21.477941513061523, 230.35815620422363 21.26524543762207, 230.38258171081543 21.086992263793945, 230.2117748260498 20.55558967590332, 230.71787071228027 19.182798385620117, 230.8653507232666 18.500219345092773, 230.8653507232666 18.058469772338867, 230.8653507232666 17.96030616760254, 230.88171195983887 16.978639602661133, 230.9144344329834 16.635053634643555, 230.73446083068848 16.389638900756836, 230.6690158843994 16.242387771606445, 230.55448722839355 15.980611801147461, 230.45632362365723 15.816999435424805, 230.35815620422363 15.506139755249023, 230.0472927093506 15.457056045532227, 229.83220100402832 15.140348434448242, 229.54010200500488 14.73716926574707, 229.22923851013184 14.442667007446289, 228.86929512023926 14.213613510131836, 228.5420742034912 14.05000114440918, 228.2148494720459 14.148168563842773, 227.8221836090088 14.148168563842773, 227.2168254852295 13.984556198120117, 226.85687828063965 13.968194961547852, 226.49693489074707 14.05000114440918, 226.0879077911377 13.77186393737793, 225.80977058410645 13.755502700805664, 225.55567741394043 13.881429672241211, 225.3911952972412 14.058565139770508, 224.9426326751709 14.73716926574707, 224.76265907287598 14.73716926574707, 224.36999320983887 14.573556900024414, 223.97732734680176 14.802610397338867, 223.29015922546387 15.12983512878418, 222.70116233825684 15.391611099243164, 222.4393825531006 15.40797233581543, 221.93218803405762 15.40797233581543, 221.57224464416504 15.66975212097168, 221.4413547515869 16.09514045715332, 221.3431911468506 16.700498580932617, 221.39227104187012 17.07680320739746, 221.16321754455566 17.404027938842773, 220.89009284973145 17.53165626525879, 220.90144157409668 17.84577751159668, 221.14274787902832 17.76296043395996, 221.52316093444824 17.61672019958496, 221.86674308776855 18.074831008911133, 222.06307792663574 18.614748001098633, 221.8994655609131 18.860166549682617, 221.6376895904541 19.252832412719727, 221.62132835388184 19.59641456604004, 221.7358570098877 20.185415267944336, 221.94854927062988 20.774412155151367, 222.079439163208 21.26524543762207, 222.48846626281738 21.854246139526367, 222.99566078186035 22.508691787719727, 223.43741035461426 22.934080123901367, 223.78099250793457 23.13041114807129, 224.04277229309082 23.064966201782227, 224.3045482635498 22.999521255493164, 224.72993659973145 22.934080123901367, 224.9917163848877 22.88499641418457, 225.2862148284912 22.934080123901367, 225.72796440124512 23.01588249206543, 226.2351589202881 23.146772384643555, 226.61146354675293 23.27766227722168, 227.05321311950684 23.097688674926758, 227.42951774597168 22.934080123901367))'::geometry, '1976-01-01', 'ru', 'http://planetarynames.wr.usgs.gov/Feature/4454');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1847, 'Zeus Patera', 'SRID=104904;POINT (227.07 18.39)'::geometry, 'SRID=104904;POLYGON ((226.50457763673 18.675384521485, 226.51556396485 18.70834350586, 226.55401611329 18.766021728516, 226.6254272461 18.820953369141, 226.71881103516 18.853912353516, 226.82043457032 18.886871337891, 226.91107177735 18.886871337891, 226.99621582032 18.875885009766, 227.03741455079 18.873138427735, 226.99346923829 18.831939697266, 226.97973632813 18.77426147461, 226.99896240235 18.702850341797, 227.06213378907 18.631439208985, 227.15002441407 18.584747314454, 227.23516845704 18.568267822266, 227.30383300781875 18.59024047851625, 227.33404541016 18.628692626954, 227.34503173829 18.658905029297, 227.39721679688 18.587493896485, 227.42742919923 18.494110107422, 227.42193603516 18.408966064454, 227.39996337891 18.315582275391, 227.39172363282 18.227691650391, 227.34228515626 18.123321533204, 227.29559326173 18.018951416016, 227.21319580079 17.942047119141, 227.15551757813 17.903594970704, 227.09783935548 17.876129150391, 227.00170898438 17.845916748047, 226.9330444336 17.840423583985, 226.88635253907 17.840423583985, 226.90832519532 17.876129150391, 226.91381835938 17.925567626954, 226.90283203126 17.972259521485, 226.87536621094 18.021697998047, 226.82318115235 18.062896728516, 226.77923583985 18.098602294922, 226.83691406251 18.156280517579, 226.88360595704 18.233184814454, 226.91107177735 18.315582275391, 226.8890991211 18.40072631836, 226.88085937501 18.474884033204, 226.83142089844 18.507843017579, 226.72430419923 18.546295166016, 226.67761230469 18.584747314454, 226.6254272461 18.614959716797, 226.58972167969 18.617706298829, 226.62817382813 18.645172119141, 226.67761230469 18.650665283204, 226.61993408204 18.661651611329, 226.56500244141 18.64242553711, 226.4935913086 18.653411865235, 226.50457763673 18.675384521485))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15689');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1848, 'Athena Patera', 'SRID=104904;POINT (227.18 18.74)'::geometry, 'SRID=104904;POLYGON ((227.0290374756 18.766021728515, 227.04002380372 18.807220458984, 227.06062316896 18.840179443359, 227.08259582521 18.867645263671, 227.12928771974 18.880004882812, 227.17597961427 18.877258300781, 227.22541809083 18.866271972656, 227.28172302247 18.825073242187, 227.31605529786 18.775634765624, 227.328414917 18.731689453124, 227.33116149903 18.691864013671, 227.30369567872 18.656158447265, 227.2844696045 18.619079589843, 227.23915100099 18.599853515624, 227.18147277833 18.599853515624, 227.10594177247 18.624572753906, 227.05513000489 18.665771484374, 227.02491760255 18.705596923828, 227.0207977295 18.744049072265, 227.0290374756 18.766021728515))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15693');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1850, 'Apollo Patera', 'SRID=104904;POINT (226.45 17.94)'::geometry, 'SRID=104904;POLYGON ((226.28540039064 17.909774780272, 226.27441406252 17.938613891601, 226.26754760744 17.981185913085, 226.27716064455 18.027877807616, 226.30325317385 18.074569702147, 226.35818481447 18.091049194335, 226.40075683596 18.091049194335, 226.46804809572 18.073196411132, 226.52572631838 18.045730590819, 226.56967163088 18.023757934569, 226.63146972658 17.946853637694, 226.63558959963 17.878189086913, 226.62185668947 17.83836364746, 226.61911010744 17.806777954101, 226.59439086916 17.788925170897, 226.52847290041 17.780685424804, 226.45980834963 17.808151245116, 226.40899658205 17.832870483397, 226.37878417971 17.841110229491, 226.33758544924 17.864456176757, 226.30462646486 17.887802124022, 226.28540039064 17.909774780272))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15694');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1851, 'Olympus Paterae', 'SRID=104904;POINT (226.81 18.32)'::geometry, 'SRID=104904;POLYGON ((226.14367675781 18.452911376953, 226.16564941406 18.513336181641, 226.2041015625 18.554534912109, 226.23431396484 18.592987060547, 226.30572509766 18.625946044922, 226.36889648438 18.650665283203, 226.42108154297 18.653411865234, 226.45678710938 18.642425537109, 226.49249267578 18.700103759766, 226.54193115234 18.755035400391, 226.58312988281 18.809967041016, 226.65454101563 18.845672607422, 226.72320556641 18.870391845703, 226.82757568359 18.895111083984, 226.88525390625 18.911590576172, 226.96545410157 18.900604248046, 227.0121459961 18.900604248046, 227.04785156251 18.889617919921, 227.08355712891 18.906097412109, 227.13299560548 18.917083740234, 227.21813964844 18.911590576171, 227.28405761719 18.875885009765, 227.33349609376 18.829193115234, 227.37194824219 18.771514892578, 227.37744140626 18.735809326171, 227.38156127930375 18.711776733397812, 227.3808746337928 18.69255065917931, 227.37469482423 18.675384521484, 227.40216064454 18.620452880859, 227.43237304688 18.571014404296, 227.4515991211 18.496856689453, 227.45709228516 18.441925048828, 227.44885253907 18.38150024414, 227.44061279298 18.323822021484, 227.43237304688 18.277130126953, 227.41589355469 18.202972412109, 227.38018798829 18.120574951171, 227.34448242188 18.05191040039, 227.31701660157 17.999725341796, 227.26757812501 17.950286865234, 227.22088623048 17.911834716796, 227.17419433594 17.870635986328, 227.12475585938 17.848663330078, 227.03686523438 17.821197509765, 226.97918701173 17.801971435546, 226.88580322266 17.815704345703, 226.85009765626 17.790985107421, 226.81439208985 17.769012451171, 226.7484741211 17.741546630859, 226.68530273438 17.733306884765, 226.62762451173 17.738800048828, 226.57543945313 17.736053466796, 226.50128173829 17.72232055664, 226.39416503907 17.758026123046, 226.32550048829 17.78823852539, 226.29803466798 17.823944091796, 226.27056884766 17.843170166015, 226.21289062501 17.89810180664, 226.20465087891 17.966766357421, 226.22937011719 18.035430908203, 226.20465087891 18.084869384765, 226.18267822266 18.13980102539, 226.17169189454 18.18374633789, 226.17993164063 18.20571899414, 226.15795898438 18.252410888671, 226.13873291016 18.318328857421, 226.13049316407 18.389739990234, 226.14367675781 18.452911376953))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15695');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1870, 'Dionysus Patera', 'SRID=104904;POINT (226.77 17.96)'::geometry, 'SRID=104904;POLYGON ((226.53973388672 18.046417236328, 226.564453125 18.082122802735, 226.60015869141 18.11508178711, 226.64410400391 18.134307861328, 226.71826171875 18.117828369141, 226.77868652344 18.09310913086, 226.83361816406 18.043670654297, 226.87756347656 17.988739013672, 226.89129638672 17.936553955078, 226.8720703125 17.870635986328, 226.828125 17.82943725586, 226.7484741211 17.799224853516, 226.68530273438 17.793731689453, 226.64959716797 17.78549194336, 226.61389160156 17.782745361328, 226.63037109375 17.848663330078, 226.63037109375 17.914581298828, 226.62213134766 17.972259521485, 226.58093261719 18.021697998047, 226.53973388672 18.046417236328))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15692');
INSERT INTO "♂"."テスト" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(1871, 'Hera Patera', 'SRID=104904;POINT (226.23 18.45)'::geometry, 'SRID=104904;POLYGON ((226.21000671387 18.244171142578, 226.18116760254063 18.30047607421875, 226.17567443848188 18.347167968749623, 226.17155456543125 18.41445922851525, 226.19902038575 18.489990234375377, 226.24021911621563 18.549041748046875, 226.32124328613438 18.602600097655873, 226.37892150879125 18.616333007812376, 226.44209289551 18.61083984375, 226.396774292 18.582000732422, 226.3610687255875 18.55316162109375, 226.31986999512 18.511962890625, 226.2827911377 18.474884033203, 226.27043151856 18.428192138672, 226.24845886231 18.367767333984, 226.24021911621 18.21533203125, 226.21000671387 18.244171142578))'::geometry, '2017-10-16', 'pe', 'http://planetarynames.wr.usgs.gov/Feature/15691');
-- TEST GIS DATA FROM OPENSTREETMAP: EARTH, Ancienne Sylvie
--Testcase 14:
CREATE TABLE "♁" (
geom public.geometry NOT NULL,
osm_type varchar(16) NOT NULL,
osm_id int8 NOT NULL,
ver int2 NOT NULL,
arr _int8 NULL,
t json NULL
);
--Testcase 15: ETC...
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4596087 59.6907755)'::geometry, 'node', 1621246531, 4, NULL, '{"drain":"disperse"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601391 59.6904673)'::geometry, 'node', 1621246620, 24, NULL, '{"access":"yes","addr:housenumber":"20 литВЕ","addr:street":"Садовая улица","architect":"Ж.-Ф. Тома де Томон","barrier":"gate","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6458/","historic":"yes","locked":"no","name":"Ворота памятника Любезным родителям","ref:okn":"781610399040286","start_date":"1807","tourism":"attraction","wikidata":"Q118122048"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617098 59.6910199)'::geometry, 'node', 1632220259, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617672 59.6909141)'::geometry, 'node', 1632220283, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461757 59.6909696)'::geometry, 'node', 1632220292, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614802 59.6907676)'::geometry, 'node', 1632220315, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615866 59.6907823)'::geometry, 'node', 1632220319, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611444 59.6908848)'::geometry, 'node', 1632220350, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611916 59.6908345)'::geometry, 'node', 1632220355, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.46127 59.6907954)'::geometry, 'node', 1632220358, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611342 59.6909402)'::geometry, 'node', 1632220359, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614212 59.6910868)'::geometry, 'node', 1632220364, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611621 59.6909941)'::geometry, 'node', 1632220366, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616766 59.6908145)'::geometry, 'node', 1632220378, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616314 59.691059)'::geometry, 'node', 1632220590, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613148 59.6910721)'::geometry, 'node', 1632220686, 4, NULL, '{"genus":"Quercus","height":"18","leaf_cycle":"deciduous","leaf_type":"broadleaved","natural":"tree"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613385 59.6907988)'::geometry, 'node', 1632497609, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6476/","historic":"yes","historic:start_date":"1794","int_name":"Euterpe","material":"metal","name":"Эвтерпа","name:el":"Εὐτέρπη","name:la":"Euterpē","name:uk":"Евтерпа","name:zh":"欧忒耳佩","note":"Ошибочно подписано «Clio»","ref":"П-61/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614438 59.6907856)'::geometry, 'node', 1632497610, 30, NULL, '{"alt_name:el":"Χλωρίς","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1796","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6475/","historic":"yes","historic:start_date":"1796","int_name":"Flore","material":"metal","name":"Флора","name:el":"Φλόρα","name:en":"Flora","ref":"П-62/1","ref:okn":"781610399040456","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461244 59.690833)'::geometry, 'node', 1632497611, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6470/","historic":"yes","historic:start_date":"1795","int_name":"Melpomene","material":"metal","name":"Мельпомена","name:el":"Μελπομένη","name:en":"Melpomene","name:la":"Melpomenē","name:uk":"Мельпомена","name:zh":"墨爾波墨涅","ref":"П-60/1","ref:okn":"781610399040376","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617227 59.6909514)'::geometry, 'node', 1632497612, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6468/","historic":"yes","historic:start_date":"1793","int_name":"Caliope","material":"metal","name":"Калиопа","name:el":"Καλλιόπη","name:la":"Calliopē","name:uk":"Калліопа","name:zh":"卡利俄佩","ref":"П-65/1","start_date":"1798","tourism":"artwork","wikidata":"Q120979306"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615805 59.6907985)'::geometry, 'node', 1632497613, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1795","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6474/","historic":"yes","historic:start_date":"1795","int_name":"Uranie","material":"metal","name":"Урания","name:el":"Οὐρανία","name:la":"Ūrania","ref":"П-63/1","ref:okn":"78161039904044","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616825 59.6908428)'::geometry, 'node', 1632497614, 29, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6469/","historic":"yes","historic:start_date":"1794","material":"metal","name":"Клио","name:el":"Κλειώ","name:la":"Clīō","note":"Подписано «Euterpe»","ref":"П-64/1","ref:okn":"781610399040466","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614541 59.6909278)'::geometry, 'node', 1632497615, 34, NULL, '{"alt_name":"Аполлон Бельведерский","artist_name":"Леохар;модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1782","artwork_type":"statue","description":"Иконография Бельведерского типа. В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"5","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6466/","historic":"yes","historic:start_date":"1782","material":"metal","name":"Аполлон","name:en":"Apollo","name:zh":"阿波罗神像","ref":"П-71/1","ref:okn":"781610399040386","start_date":"1817","tourism":"artwork","wikidata":"Q118122062"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616021 59.6910564)'::geometry, 'node', 1632497616, 26, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1780","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","historic":"yes","historic:start_date":"1780","material":"metal","name":"Венера Каллипиги","ref":"П-67/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616651 59.6910293)'::geometry, 'node', 1632497617, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6471/","historic":"yes","historic:start_date":"1793","int_name":"Polymnia","material":"metal","name":"Полигимния","name:el":"Πολύμνια","name:la":"Polyhymnia","name:uk":"Полігімнія","name:zh":"波吕许谟尼亚","ref":"П-66/1","ref:okn":"781610399040726","start_date":"1798","tourism":"artwork","wikidata":"Q121395079"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614666 59.6910732)'::geometry, 'node', 1632497618, 30, NULL, '{"alt_name":"Гермес Флорентийский","artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6467/","historic":"yes","historic:start_date":"1794","int_name":"Hermes","material":"metal","name":"Меркурий","name:en":"Mercury","ref":"П-68/1","ref:okn":"781610399040396","start_date":"1810","tourism":"artwork","wikidata":"Q121395060"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613231 59.6910597)'::geometry, 'node', 1632497619, 30, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1793","artwork_subject:wikidata":"Q104413","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6477/","historic":"yes","historic:start_date":"1793","int_name":"Erato","material":"metal","name":"Эрато","name:el":"Ἐρατώ","name:ka":"ერატო","name:ko":"에라토","name:la":"Eratō","name:uk":"Ерато","name:zh":"厄剌托","ref":"П-69/1","ref:okn":"781610399040476","start_date":"1798","tourism":"artwork","wikidata":"Q121395110"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612077 59.691005)'::geometry, 'node', 1632497620, 31, NULL, '{"artist_name":"модель П.П. Соколов;отливка Э. Гастклу","artwork:start_date":"1794","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6473/","historic":"yes","historic:start_date":"1794","int_name":"Terpsichore","material":"metal","name":"Терпсихора","name:el":"Τερψιχόρη","name:en":"Terpsichore","name:la":"Terpsichore","ref":"П-70/1","ref:okn":"781610399040436","start_date":"1798","tourism":"artwork","wikidata":"Q121395096"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611782 59.690902)'::geometry, 'node', 1632497621, 29, NULL, '{"artist_name":"модель Ф.Г. Гордеев;отливка Э. Гастклу","artwork:start_date":"1792","artwork_type":"statue","description":"В годы ВОВ находилась в захоронении, заново установлена в 1946 г.","height":"4","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6472/","historic":"yes","historic:start_date":"1792","int_name":"Thalie","material":"metal","name":"Талия","name:el":"Θαλία","name:la":"Thalīa","name:uk":"Талія","name:zh":"塔利亚","ref":"П-59/1","start_date":"1798","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612041 59.6907321)'::geometry, 'node', 1632503254, 6, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.462536 59.6908707)'::geometry, 'node', 1652587953, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4619277 59.6908578)'::geometry, 'node', 1652587958, 5, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617256 59.6909215)'::geometry, 'node', 3177639362, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612018 59.6909805)'::geometry, 'node', 3188928044, 4, NULL, '{"colour":"brown","inlet":"grate","manhole":"drain","man_made":"manhole","material":"metal"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613001 59.6906759)'::geometry, 'node', 3218618266, 4, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614144 59.6907882)'::geometry, 'node', 4912277772, 4, NULL, '{"board_type":"history","information":"board","name":"Флора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615482 59.6907937)'::geometry, 'node', 4912277773, 4, NULL, '{"board_type":"history","information":"board","name":"Урания","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613145 59.6908057)'::geometry, 'node', 4912277774, 4, NULL, '{"board_type":"history","information":"board","name":"Эвтерпа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616653 59.6908341)'::geometry, 'node', 4912277775, 4, NULL, '{"board_type":"history","information":"board","name":"Клио","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612216 59.6908451)'::geometry, 'node', 4912277776, 4, NULL, '{"board_type":"history","information":"board","name":"Мельпомена","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4611751 59.690919)'::geometry, 'node', 4912277777, 4, NULL, '{"board_type":"history","information":"board","name":"Талия","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4617272 59.6909351)'::geometry, 'node', 4912277778, 4, NULL, '{"board_type":"history","information":"board","name":"Калиопа","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612298 59.691015)'::geometry, 'node', 4912277779, 4, NULL, '{"board_type":"history","information":"board","name":"Терпсихора","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4616819 59.6910157)'::geometry, 'node', 4912277780, 4, NULL, '{"board_type":"history","information":"board","name":"Полигимния","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.461621 59.6910498)'::geometry, 'node', 4912277781, 4, NULL, '{"board_type":"history","information":"board","name":"Венера Каллипиги","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613548 59.6910624)'::geometry, 'node', 4912277782, 4, NULL, '{"board_type":"history","information":"board","name":"Эрато","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4615016 59.6910712)'::geometry, 'node', 4912277783, 4, NULL, '{"board_type":"history","information":"board","name":"Меркурий","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608954 59.6897746)'::geometry, 'node', 5251698420, 25, NULL, '{"access":"permissive","addr:housenumber":"20 литББ","addr:street":"Садовая улица","architect":"Винченцо Бренна","barrier":"gate","description:access":"Ворота можно закрывать и открывать руками","heritage":"2","heritage:website":"https://kgiop.gov.spb.ru/deyatelnost/uchet/list_objects/6459/","historic":"yes","locked":"no","name":"Большие Старосильвийские ворота","ref":"1","ref:okn":"781620399040626","start_date":"1786..1793","tourism":"attraction","website":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","wheelchair":"yes","wikidata":"Q118122050"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460198 59.6905729)'::geometry, 'node', 6758903438, 6, NULL, '{"artist_name":"И.П. Мартос","artwork_type":"sculpture","height":"4","tourism":"artwork"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4625734 59.6908311)'::geometry, 'node', 8331430683, 3, NULL, '{"inlet":"grate","manhole":"drain","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4614743 59.690923)'::geometry, 'node', 8530936200, 1, NULL, '{"board_type":"history","information":"board","name":"Аполлон","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4597619 59.6907527)'::geometry, 'node', 9140565043, 1, NULL, '{"ford":"yes"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4606891 59.6906687)'::geometry, 'node', 9140576937, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4608515 59.6907117)'::geometry, 'node', 9140576938, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4613945 59.6911519)'::geometry, 'node', 9143069530, 5, NULL, '{"drain":"no","source:direction":"survey"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('POINT (30.4615903 59.6911716)'::geometry, 'node', 9143069534, 1, NULL, '{"amenity":"bench","backrest":"yes","material":"wood"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460339 59.6906064)'::geometry, 'node', 9143093777, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4601191 59.6906349)'::geometry, 'node', 9143093778, 1, NULL, '{"manhole":"telecom","man_made":"manhole"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610445 59.6908345)'::geometry, 'node', 9143093802, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4610243 59.6909861)'::geometry, 'node', 9143093804, 3, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.4612126 59.691117)'::geometry, 'node', 9143093806, 4, NULL, '{"drain":"no"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;POINT (30.460445 59.6910504)'::geometry, 'node', 9656736571, 2, NULL, '{"colour":"#4e3a39","description":"Веломаршрут №4","height":"4","information":"guidepost","material":"metal","start_date":"2021-03..2021-10","tourism":"information"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4608056 59.6895935, 30.4608954 59.6897746, 30.4609447 59.6898691, 30.4614541 59.6909278)'::geometry, 'way', 30995960, 42, '{9140727117,5251698420,1518870630,1632497615}', '{"highway":"footway","historic":"yes","name":"Центральная аллея","ref":"VII","source:name":"https://pavlovskmuseum.ru/expert/restoration/62/1779/","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605616 59.6906319, 30.4597619 59.6907527, 30.4596087 59.6907755)'::geometry, 'way', 149099000, 6, '{1621246509,9140565043,1621246531}', '{"intermittent":"yes","source:direction":"isoline","start_date":"1786","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604741 59.6903357, 30.4604598 59.6904575, 30.4604646 59.6905099, 30.4604784 59.6905443, 30.4604933 59.6905665, 30.4605321 59.6905996, 30.4605616 59.6906319)'::geometry, 'way', 149099004, 8, '{1621246503,9140576877,1621246482,1621246465,1621246454,9140576939,1621246509}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601177 59.6905796, 30.4600903 59.6905709, 30.4600721 59.6905605, 30.4600579 59.6905458, 30.4600519 59.6905296, 30.4600545 59.6905133, 30.4600656 59.6904979, 30.4600844 59.6904845, 30.4601095 59.690474, 30.4601391 59.6904673, 30.460169 59.6904648, 30.4601991 59.6904661, 30.4602277 59.6904711, 30.4602498 59.6904787, 30.4602686 59.6904892, 30.4602829 59.6905018, 30.4602918 59.6905174, 30.4602917 59.6905327, 30.4602881 59.6905462, 30.4602793 59.6905579)'::geometry, 'way', 149099028, 5, '{9140576951,9140576902,9140576952,1621246602,1621246607,1621246668,1621246614,1621246615,1621246618,1621246620,1621246630,1621246244,1621246631,1621246224,1621246250,1621246635,1621246647,9140576950,9140576903,9140576949}', '{"barrier":"fence","colour":"green","fence_type":"wood","height":"2"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4603352 59.6911039, 30.460353 59.6910638, 30.4603719 59.6910414, 30.4603979 59.691021, 30.4604807 59.6909761, 30.460577 59.6909284, 30.4606406 59.6908886, 30.460669 59.6908562, 30.460673 59.6908234, 30.4606633 59.6907504, 30.4606582 59.6907286, 30.4606491 59.6907025, 30.4606314 59.690668, 30.460609 59.690636, 30.4605858 59.6906064, 30.4605578 59.6905735, 30.4605362 59.6905385, 30.4605214 59.6905022, 30.4605119 59.6904644, 30.4605095 59.6904098, 30.460512 59.6903499, 30.4605096 59.6903011)'::geometry, 'way', 149099029, 36, '{9140727237,4260007753,9140727241,8650331583,1621246592,1621246588,1621246578,1652603857,9140727240,8650331584,1621246577,9143093738,1621246419,9140576875,1652603906,9140576876,1621246542,8650331586,9140576874,8650331585,1621246403,9140576873,1239612684}', '{"alt_name":"Окружная дорожка","highway":"footway","historic":"yes","name":"Круговая дорожка","start_date":"1789.1793","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610979 59.6907799, 30.4608515 59.6907117)'::geometry, 'way', 149099034, 9, '{1632503255,9140576938}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4629005 59.6913411, 30.4614541 59.6909278)'::geometry, 'way', 150294524, 8, '{1239612692,1632497615}', '{"highway":"footway","historic":"yes","ref":"III","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613148 59.6910721, 30.4613667 59.6910818, 30.4614212 59.6910868, 30.4614766 59.6910869, 30.4615311 59.6910822, 30.4615833 59.6910728, 30.4616314 59.691059, 30.461674 59.6910412, 30.4617098 59.6910199, 30.4617378 59.6909958, 30.461757 59.6909696, 30.4617669 59.6909421, 30.4617672 59.6909141, 30.4617579 59.6908866, 30.4617393 59.6908603, 30.4617119 59.690836, 30.4616766 59.6908145, 30.4616343 59.6907964, 30.4615866 59.6907823, 30.4615347 59.6907726, 30.4614802 59.6907676, 30.4614248 59.6907674, 30.4613703 59.6907721, 30.4613181 59.6907815, 30.46127 59.6907954, 30.4612274 59.6908132, 30.4611916 59.6908345, 30.4611636 59.6908586, 30.4611444 59.6908848, 30.4611345 59.6909123, 30.4611342 59.6909402, 30.4611435 59.6909678, 30.4611621 59.6909941, 30.4611895 59.6910184, 30.4612248 59.6910399, 30.461267 59.6910579, 30.4613148 59.6910721)'::geometry, 'way', 150294525, 6, '{1632220686,9143093824,1632220364,9143093807,1632220588,9143093808,1632220590,9143093809,1632220259,9143093810,1632220292,9143093811,1632220283,9143093812,1632220296,9143093813,1632220378,9143093814,1632220319,9143093815,1632220315,9143093816,1632220323,9143093817,1632220358,9143093818,1632220355,9143093819,1632220350,9143093820,1632220359,9143093821,1632220366,9143093822,1632220374,9143093823,1632220686}', '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.460726 59.6910052, 30.460614 59.6910145, 30.4605241 59.69102, 30.4604597 59.691022, 30.4603979 59.691021)'::geometry, 'way', 150294532, 30, '{1632497615,1632220252,9140727238,9140727242,9140727239,1621246592}', '{"highway":"footway","historic":"yes","name":"луч домика Крик","ref":"X","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605096 59.6903011, 30.4614541 59.6909278)'::geometry, 'way', 150294541, 8, '{1239612684,1632497615}', '{"highway":"footway","historic":"yes","ref":"VIII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4617339 59.6901702)'::geometry, 'way', 150294547, 9, '{1632497615,1518870645}', '{"highway":"footway","historic":"yes","ref":"VI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461819 59.6910085, 30.4618473 59.6909863, 30.4618928 59.6909647, 30.461951 59.6909401, 30.4620356 59.6909251, 30.462536 59.6908707)'::geometry, 'way', 152440395, 6, '{1652587944,1652587948,1652587950,9143093800,1652587952,1652587953}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613063 59.6907075, 30.4612631 59.6907161, 30.4612041 59.6907321)'::geometry, 'way', 152442436, 10, '{1652605207,9143204222,1632503254}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4617627 59.6907689, 30.4618218 59.6907946, 30.4618794 59.6908253, 30.4619277 59.6908578)'::geometry, 'way', 152442438, 8, '{1652605205,1652605201,1652605200,1652587958}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4612018 59.6909805, 30.4617256 59.6909215, 30.4625734 59.6908311, 30.4628306 59.6908088)'::geometry, 'way', 311975108, 20, '{3188928044,3177639362,8331430683,7911801321}', '{"layer":"-1","name":"Старосильвийская дождевая канализация","source:direction":"survey","tunnel":"yes","waterway":"drain"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611708 59.6911018, 30.4611289 59.6910829, 30.4610793 59.6910531, 30.4610552 59.6910294, 30.4610432 59.6910153, 30.4610243 59.6909861)'::geometry, 'way', 313051687, 8, '{1632503180,9143069533,9143093805,9143069532,1632503185,9143093804}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061)'::geometry, 'way', 426269715, 5, '{4255746051,4255746033,9140576943,9140576942,9140576941,9140576940,4255746057,4255746007,9140576945,9140576946,9140576944,4255746054,4255745992,4255746051}', '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603979 59.691021, 30.4603224 59.6910067, 30.4602382 59.6909843, 30.4601137 59.6909482, 30.4600256 59.6909178, 30.4599203 59.6908773, 30.4597958 59.6908259, 30.4597422 59.6908088, 30.4596966 59.6907997, 30.4596501 59.6907961, 30.4596189 59.6907966, 30.4595885 59.6908005, 30.4595518 59.6908091, 30.4595101 59.6908241)'::geometry, 'way', 438780267, 20, '{1621246592,1621246561,1622496989,8850590008,1621246248,1621246252,8650331580,8849369897,9140576840,8650331579,9140576841,8650331578,9140576842,1622496957}', '{"highway":"footway","historic":"yes","loc_name":"Спуск у места домика Крик","name":"Криковская дорога","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4625498 59.6908065, 30.4614541 59.6909278)'::geometry, 'way', 750779153, 4, '{1632220250,1632497615}', '{"highway":"footway","historic":"yes","ref":"IV","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4631938 59.6918756)'::geometry, 'way', 750779155, 5, '{1632497615,1195120146}', '{"highway":"footway","historic":"yes","ref":"II","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4606491 59.6907025)'::geometry, 'way', 750779156, 5, '{1632497615,1621246419}', '{"highway":"footway","historic":"yes","ref":"IX","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4625914 59.6924527)'::geometry, 'way', 750779157, 4, '{1632497615,1652587960}', '{"highway":"footway","historic":"yes","ref":"I","start_date":"1789.1791","surface":"fine_gravel","width":"3.5"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611165 59.6918779, 30.46118 59.6916919, 30.4614541 59.6909278)'::geometry, 'way', 750779158, 4, '{9159459639,1239612686,1632497615}', '{"highway":"footway","historic":"yes","ref":"XII","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4596189 59.6907966, 30.4596712 59.6907865, 30.4597275 59.6907729, 30.459757 59.6907607, 30.4597619 59.6907527, 30.4597677 59.6907431, 30.4597919 59.6907269, 30.4598455 59.6907093, 30.459934 59.6906931, 30.4600118 59.6906782, 30.4600467 59.690666, 30.4600681 59.6906484, 30.4600725 59.6906275, 30.4600655 59.6906044, 30.4600295 59.6905552, 30.4600066 59.6905268, 30.4600031 59.690512, 30.4600111 59.6904995, 30.460044 59.6904799, 30.4600789 59.6904629, 30.4601241 59.6904473)'::geometry, 'way', 988944864, 2, '{9140576841,9140565053,9140565052,9140565051,9140565043,9140565050,9140565049,9140565048,9140565047,9140565046,9140565045,9140565044,1621246253,9140565042,1621246302,1621246323,9140576899,9140576892,9143093786,9143093785,1621246340}', '{"highway":"path","surface":"ground"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4607784 59.690696, 30.4606891 59.6906687)'::geometry, 'way', 988944880, 3, '{9140576936,9140576937}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601316 59.6905738, 30.4601383 59.6905745, 30.460144 59.6905725, 30.4601453 59.6905691, 30.4601415 59.6905663, 30.4601348 59.6905656, 30.4601291 59.6905676, 30.4601278 59.6905709, 30.4601316 59.6905738)'::geometry, 'way', 989184163, 1, '{9142788307,9142788306,9142788305,9142788304,9142788303,9142788302,9142788301,9142788300,9142788307}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601637 59.6905695, 30.4601704 59.6905701, 30.4601761 59.6905682, 30.4601774 59.6905648, 30.4601736 59.6905619, 30.4601668 59.6905613, 30.4601612 59.6905632, 30.4601599 59.6905666, 30.4601637 59.6905695)'::geometry, 'way', 989184166, 1, '{9142819031,9142819030,9142819029,9142819028,9142819027,9142819026,9142819025,9142819024,9142819031}', '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4615026 59.6911479, 30.4614481 59.6911519, 30.4613945 59.6911519)'::geometry, 'way', 989211851, 4, '{1652605211,9143069529,9143069530}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603719 59.6910414, 30.4597387 59.6911122)'::geometry, 'way', 989211857, 12, '{8650331583,4260007752}', '{"highway":"path","historic":"yes","name":"луч домика Крик","start_date":"1780.1785"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4603446 59.6911727, 30.4603806 59.6910714, 30.4603967 59.691047, 30.4604235 59.6910376, 30.4604664 59.6910348, 30.4605415 59.6910308)'::geometry, 'way', 989211858, 1, '{9143069609,9143069608,9143069607,9143069606,9143069605,9143069604}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613583 59.6906799, 30.4614025 59.6907746, 30.461428 59.6907726, 30.4614548 59.6907726, 30.4614763 59.6907739)'::geometry, 'way', 989211859, 1, '{9143093728,9143093727,9143093726,9143093725,9143093724}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461314 59.6906832, 30.461361 59.6907794, 30.4613301 59.6907854, 30.4613033 59.6907929, 30.4612845 59.690799, 30.4609841 59.6905973)'::geometry, 'way', 989211860, 1, '{9143093729,9143093730,9143093731,9143093732,9143093734,9143093733}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611484 59.6909364, 30.4611471 59.6909174, 30.4611497 59.6909005, 30.4611578 59.6908836, 30.4611645 59.6908714, 30.4611739 59.6908606, 30.4606917 59.6907283, 30.460681 59.6907283, 30.460677 59.6907337, 30.460685 59.6907601, 30.4606891 59.6907817, 30.4606917 59.6908129, 30.4606944 59.6908426, 30.4606837 59.6908656, 30.4606596 59.6908927, 30.4606247 59.6909184, 30.460563 59.6909523, 30.460453 59.6910064)'::geometry, 'way', 989211861, 1, '{9143093739,9143093740,9143093741,9143093742,9143093743,9143093744,9143093755,9143093737,9143093736,9143093754,9143093753,9143093722,9143093721,9143093720,9143093719,9143093718,9143093717,9143069616}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4605335 59.6903364, 30.4605335 59.6903946, 30.4605308 59.6904501, 30.4605348 59.6904813, 30.4605442 59.6905137, 30.4605576 59.6905394, 30.4605818 59.6905773, 30.4606193 59.6906247, 30.4606408 59.6906545, 30.4606596 59.6906856, 30.4606716 59.6906958, 30.4606958 59.6907039, 30.4611947 59.6908433, 30.4612155 59.6908301, 30.4612369 59.6908166, 30.461253 59.6908098, 30.4609492 59.6906112)'::geometry, 'way', 989211862, 1, '{9143093764,9143093763,9143093762,9143093748,9143093761,9143093760,9143093759,9143093758,9143093757,9143093756,9143093752,9143093751,9143093750,9143093747,9143093746,9143093745,9143093735}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4604919 59.6903357, 30.4604919 59.690398, 30.4604892 59.6904494, 30.4604946 59.690486, 30.4605053 59.6905157, 30.4605161 59.6905387, 30.4605402 59.6905766, 30.4605778 59.690624, 30.4605992 59.6906538, 30.460626 59.6906931, 30.4606368 59.6907255, 30.4606448 59.6907574, 30.4606502 59.6907871, 30.4606542 59.6908196, 30.4606502 59.6908494, 30.4606327 59.6908751, 30.4606059 59.6908927, 30.4605496 59.6909266, 30.4604128 59.6909942)'::geometry, 'way', 989211863, 1, '{9143093776,9143093775,9143093774,9143093773,9143093749,9143093772,9143093771,9143093770,9143093769,9143093768,9143093767,9143093765,9143093766,9143069615,9143069610,9143069614,9143069613,9143069612,9143069611}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619893 59.6908956, 30.4620356 59.6909251)'::geometry, 'way', 989211867, 2, '{1652587955,1652587952}', '{"intermittent":"yes","source:direction":"survey","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4610753 59.6908007, 30.4610979 59.6907799)'::geometry, 'way', 989211868, 4, '{9143093801,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4611491 59.6907553, 30.4610979 59.6907799)'::geometry, 'way', 989211869, 4, '{1632503177,1632503255}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.461012 59.6909572, 30.4610056 59.6909157, 30.4610163 59.6908698, 30.4610445 59.6908345)'::geometry, 'way', 989211870, 4, '{1632503179,9143093803,1632503181,9143093802}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4613456 59.6911475, 30.46131 59.6911438, 30.4612696 59.6911343, 30.4612126 59.691117)'::geometry, 'way', 989211871, 4, '{1652605209,9143069531,1632503237,9143093806}', '{"intermittent":"yes","source:direction":"survey","start_date":"1789.1793","waterway":"ditch"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4614541 59.6909278, 30.4622826 59.6903796)'::geometry, 'way', 991343632, 2, '{1632497615,1518870652}', '{"highway":"footway","historic":"yes","ref":"V","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4620021 59.690877, 30.4617551 59.6909043, 30.4617579 59.690914, 30.4617593 59.6909255, 30.4617606 59.6909377)'::geometry, 'way', 991343633, 1, '{9159456550,9159456549,9159456545,9159456544,9159456543}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4619941 59.6908547, 30.4617471 59.690882, 30.4617392 59.6908714, 30.4617298 59.6908606, 30.4617164 59.6908491)'::geometry, 'way', 991343634, 1, '{9159456552,9159456551,9159456548,9159456547,9159456546}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4602794 59.6911745, 30.4603083 59.6910871)'::geometry, 'way', 991343661, 1, '{9159459675,9159459674}', '{"barrier":"hedge","height":"1.5","leaf_cycle":"deciduous","leaf_type":"broadleaved"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;LINESTRING (30.4601396 59.6918144, 30.4614541 59.6909278)'::geometry, 'way', 1042527594, 11, '{9140727237,1632497615}', '{"highway":"footway","historic":"yes","name":"луч Амфитеатра","ref":"XI","start_date":"1789.1791","surface":"fine_gravel"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4611342 59.6909402, 30.4611345 59.6909123, 30.4611444 59.6908848, 30.4611636 59.6908586, 30.4611916 59.6908345, 30.4612274 59.6908132, 30.46127 59.6907954, 30.4613181 59.6907815, 30.4613703 59.6907721, 30.4614248 59.6907674, 30.4614802 59.6907676, 30.4615347 59.6907726, 30.4615866 59.6907823, 30.4616343 59.6907964, 30.4616766 59.6908145, 30.4617119 59.690836, 30.4617393 59.6908603, 30.4617579 59.6908866, 30.4617672 59.6909141, 30.4617669 59.6909421, 30.461757 59.6909696, 30.4617378 59.6909958, 30.4617098 59.6910199, 30.461674 59.6910412, 30.4616314 59.691059, 30.4615833 59.6910728, 30.4615311 59.6910822, 30.4614766 59.6910869, 30.4614212 59.6910868, 30.4613667 59.6910818, 30.4613148 59.6910721, 30.461267 59.6910579, 30.4612248 59.6910399, 30.4611895 59.6910184, 30.4611621 59.6909941, 30.4611435 59.6909678, 30.4611342 59.6909402)))'::geometry, 'way', 150294525, 6, NULL, '{"name":"Дубовое кольцо"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4604209 59.6905034, 30.460432 59.6903065, 30.4604493 59.6903061, 30.4604387 59.6904982, 30.4604437 59.6905232, 30.460449 59.6905388, 30.4604611 59.6905564, 30.4604745 59.6905713, 30.4605038 59.6906061, 30.4604844 59.6906116, 30.4604557 59.6905794, 30.4604396 59.6905543, 30.4604303 59.6905334, 30.4604209 59.6905034)))'::geometry, 'way', 426269715, 5, NULL, '{"man_made":"embankment","name":"Старосильвийский вал","start_date":"1789.1793"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
INSERT INTO "♁" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601599 59.6905666, 30.4601612 59.6905632, 30.4601668 59.6905613, 30.4601736 59.6905619, 30.4601774 59.6905648, 30.4601761 59.6905682, 30.4601704 59.6905701, 30.4601637 59.6905695, 30.4601599 59.6905666)))'::geometry, 'way', 989184166, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text, gm1 geometry, gg1 geography) SERVER sqlite_svr;
--Testcase 41: ERR - raster
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, read PostGOS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49: ERR, no SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 50: ERR, no SRID
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('POINT (30.4648224 59.687941)'::geometry);
--Testcase 51:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 52:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = ('SRID=4326;POINT (30.4648224 59.687941)'::geometry);
--Testcase 53: ERR damaged, but there is SRID
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = (decode('0101000020e6100000bf72ce99fe76', 'hex')::geometry);
-- Insert PostGIS/GEOS BLOB, read SpatiaLite BLOB
--Testcase 54: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 55:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 56:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 57: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 58:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 59:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 60: ERR damaged geometry, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (3, decode('0101000020e6100000bf72ce99fe76', 'hex'), NULL, '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 61: ERR damaged geography, but there is SRID
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (4, NULL, decode('0101000020e6100000bf72ce99fe76', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 62:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 63:
INSERT INTO "♂" SELECT * FROM "♂"."テスト";
--Testcase 64:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 65:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 66:
SELECT * FROM "♂";
--Testcase 67:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 69:
SELECT * FROM "♂";
--Testcase 70:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL ,
osm_id bigint OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t text
) SERVER sqlite_svr OPTIONS (table '♁');
--Testcase 71: ERR - No SRID
INSERT INTO "♁ FDW" SELECT * FROM "♁";
--Testcase 72: OK
SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 73:
UPDATE "♁" SET geom = ST_SetSRID(geom, 4326);
--Testcase 74:
INSERT INTO "♁ FDW" SELECT * FROM "♁" WHERE ST_SRID(geom) IS NOT NULL;
--Testcase 75:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE bytea;
--Testcase 76:
SELECT * FROM "♁ FDW";
--Testcase 77:
ALTER FOREIGN TABLE "♁ FDW" ALTER COLUMN "geom" TYPE geometry;
--Testcase 78:
SELECT * FROM "♁ FDW";
--Testcase 79:
DROP FOREIGN TABLE "♂";
--Testcase 80:
DROP FOREIGN TABLE "♁ FDW";
--Testcase 81:
DROP TABLE "♁";
--Testcase 82:
DROP TABLE "♂"."テスト";
--Testcase 83:
DROP SCHEMA "♂";
-- Test operators implemented in PostGIS 3.4.2, other are not tested
-- SELECT testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 100 -> TC 150 -> TC200 -> TC250
-- WHERE testing group
-- geometry -> geometry + bytea const -> geography -> geography + bytea const
-- TC 300 -> TC 350 -> TC400 -> TC450
--Testcase 100:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ gm1 g FROM "types_PostGIS";
--Testcase 101:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && gm1 g FROM "types_PostGIS";
--Testcase 102:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << gm1 g FROM "types_PostGIS";
--Testcase 103:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> gm1 g FROM "types_PostGIS";
--Testcase 104:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< gm1 g FROM "types_PostGIS";
--Testcase 105:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> gm1 g FROM "types_PostGIS";
--Testcase 106:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| gm1 g FROM "types_PostGIS";
--Testcase 107:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> gm1 g FROM "types_PostGIS";
--Testcase 108:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| gm1 g FROM "types_PostGIS";
--Testcase 109:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> gm1 g FROM "types_PostGIS";
--Testcase 110:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= gm1 g FROM "types_PostGIS";
--Testcase 111:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm = gm1 g FROM "types_PostGIS";
--Testcase 112:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 113:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& gm1 g FROM "types_PostGIS";
--Testcase 114:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| gm1 g FROM "types_PostGIS";
--Testcase 115
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> gm1 g FROM "types_PostGIS";
--Testcase 116:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> gm1 g FROM "types_PostGIS";
--Testcase 117:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ gm1 g FROM "types_PostGIS";
--Testcase 118:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ gm1 g FROM "types_PostGIS";
--Testcase 150:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 151:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 152:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 153:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 154:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 155:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 156:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 157:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 158:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 159:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 160:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 161:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 162:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 163:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 164:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 165:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 166:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 167:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 168:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 169:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 170:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 200:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> gg1 g FROM "types_PostGIS";
--Testcase 201:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && gg1 g FROM "types_PostGIS";
--Testcase 202:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> gg1 g FROM "types_PostGIS";
--Testcase 203:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg = gg1 g FROM "types_PostGIS";
--Testcase 204
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != gg1 g FROM "types_PostGIS";
--Testcase 250:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 251:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 252:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 253:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') g FROM "types_PostGIS";
--Testcase 300:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ gm1 IS NOT NULL;
--Testcase 301:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && gm1 IS NOT NULL;
--Testcase 302:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << gm1 IS NOT NULL;
--Testcase 303:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> gm1 IS NOT NULL;
--Testcase 304:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< gm1 IS NOT NULL;
--Testcase 305:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> gm1 IS NOT NULL;
--Testcase 306:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| gm1 IS NOT NULL;
--Testcase 307:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> gm1 IS NOT NULL;
--Testcase 308:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| gm1 IS NOT NULL;
--Testcase 309:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> gm1 IS NOT NULL;
--Testcase 310:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= gm1 IS NOT NULL;
--Testcase 311:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm = gm1 IS NOT NULL;
--Testcase 312:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& gm1 IS NOT NULL;
--Testcase 313:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| gm1 IS NOT NULL;
--Testcase 314:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> gm1 IS NOT NULL;
--Testcase 315:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> gm1 IS NOT NULL;
--Testcase 316:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ gm1 IS NOT NULL;
--Testcase 317:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ gm1 IS NOT NULL;
--Testcase 350:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @@ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 351:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 352:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 353:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm << decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 354:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm >> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 355:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 356:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &< decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 357:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 358:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 359:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |>> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 360:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 361:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &<| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 362:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |&> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 363:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~= decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 364:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 365:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm &&& decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 366:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm |=| decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 367:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <#> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 368:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm <<->> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 369:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm @ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 370:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gm, gm1 FROM "types_PostGIS" WHERE gm ~ decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 400:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> gg1 IS NOT NULL;
--Testcase 401:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && gg1 IS NOT NULL;
--Testcase 402:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 403:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> gg1 IS NOT NULL;
--Testcase 404:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg = gg1 IS NOT NULL;
--Testcase 405:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != gg1 IS NOT NULL;
--Testcase 450:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <-> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 451:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg && decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 452:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 453:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg <> decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 454:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT gg, gg1 FROM "types_PostGIS" WHERE gg != decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex') IS NOT NULL;
--Testcase 500:
DROP FOREIGN TABLE "types_PostGIS";
--Testcase 501:
DROP EXTENSION sqlite_fdw CASCADE;
--Testcase 502:
DROP EXTENSION postgis CASCADE;
================================================
FILE: sql/17.0/with_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 47:
CREATE EXTENSION postgis;
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/without_gis_support/auto_import.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 01:
CREATE EXTENSION sqlite_fdw;
--Testcase 02:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 04:
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 05:
CREATE VIEW ft AS (
SELECT *, row_number() OVER () n
FROM information_schema.foreign_tables
WHERE foreign_table_catalog = current_database()
AND foreign_table_schema = 'public'
);
--Testcase 06:
SELECT * FROM ft;
--Testcase 07:
CREATE VIEW fc AS (
SELECT ft.n, table_name, column_name, ordinal_position tab_no, column_default def, is_nullable "null", data_type, character_maximum_length c_max_len, character_octet_length c_oct_len, numeric_precision num_pr, numeric_precision_radix num_rdx, numeric_scale num_sc, datetime_precision dtp, interval_type it, interval_precision ip, udt_schema, udt_name, maximum_cardinality max_crd, dtd_identifier dtdid, is_self_referencing sref, is_identity ididt, is_generated isgen
FROM information_schema.columns c
INNER JOIN ft
ON (c.table_catalog, c.table_schema, c.table_name) = (ft.foreign_table_catalog, ft.foreign_table_schema, ft.foreign_table_name)
) order by n, tab_no;
--Testcase 08: base metadata
SELECT n, table_name, column_name, tab_no, def, "null", data_type, udt_schema, udt_name FROM fc;
--Testcase 09: size/length/presision metadata
SELECT n, table_name, column_name, tab_no, c_max_len, c_oct_len, num_pr, num_rdx, num_sc, dtp FROM fc;
--Testcase 10: other metadata
SELECT n, table_name, column_name, tab_no, it, ip, max_crd, dtdid, sref, ididt, isgen FROM fc;
--Testcase 11:
SELECT * FROM information_schema.column_options
WHERE (table_catalog, table_schema, table_name)
IN (SELECT foreign_table_catalog, foreign_table_schema, foreign_table_name FROM ft);
--Testcase 11:
DROP VIEW fc;
--Testcase 12:
DROP VIEW ft;
--Testcase 20:
SET client_min_messages TO ERROR;
--Testcase 21: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/without_gis_support/nogis.sql
================================================
--Testcase 1:
CREATE EXTENSION sqlite_fdw;
--Testcase 2:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
--Testcase 10:
CREATE DOMAIN geometry AS bytea;
--Testcase 11:
CREATE DOMAIN geography AS bytea;
--Testcase 12:
CREATE DOMAIN addbandarg AS bytea;
--Testcase 13:
CREATE DOMAIN box2d AS bytea;
--Testcase 14:
CREATE DOMAIN box3d AS bytea;
--Testcase 15:
CREATE DOMAIN geometry_dump AS bytea;
--Testcase 16:
CREATE DOMAIN geomval AS bytea;
--Testcase 17:
CREATE DOMAIN getfaceedges_returntype AS bytea;
--Testcase 18:
CREATE DOMAIN rastbandarg AS bytea;
--Testcase 19:
CREATE DOMAIN raster AS bytea;
--Testcase 20:
CREATE DOMAIN reclassarg AS bytea;
--Testcase 21:
CREATE DOMAIN summarystats AS bytea;
--Testcase 22:
CREATE DOMAIN topoelement AS bytea;
--Testcase 23:
CREATE DOMAIN topoelementarray AS bytea;
--Testcase 24:
CREATE DOMAIN topogeometry AS bytea;
--Testcase 25:
CREATE DOMAIN unionarg AS bytea;
--Testcase 26:
CREATE DOMAIN validatetopology_returntype AS bytea;
--Testcase 40:
CREATE FOREIGN TABLE "types_PostGIS"( "i" int OPTIONS (key 'true'), gm geometry, gg geography, r raster, t text) SERVER sqlite_svr;
--Testcase 41: ERR unable to convert to unsupported PostGIS specific data type
INSERT INTO "types_PostGIS" ( "i", gm, gg, r, t ) VALUES (1, decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('0101000020e6100000fd5aa846f9733e406c054d4bacd74d40', 'hex'), decode('1223456890', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 42:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 43:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
-- Insert SpatiaLite BLOB, but CANNOT read PostGIS/GEOS BLOB
--Testcase 44: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (1, decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), decode('0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii", "natural": "shrub", "genus:ru": "Рододендрон", "taxon:ru": "Рододендрон Ледебура", "source:taxon": "board"}');
--Testcase 45:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE geometry;
--Testcase 46:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE geography;
--Testcase 47: read the same BLOBs
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 48:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 49:
EXPLAIN (VERBOSE, COSTS OFF)
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
--Testcase 50:
SELECT "i", gm, gg, t FROM "types_PostGIS" WHERE gm = '\x0001e6100000bf72ce99fe763e40ed4960730ed84d40bf72ce99fe763e40ed4960730ed84d407c01000000bf72ce99fe763e40ed4960730ed84d40fe'::geometry;
-- Insert a BLOB, read SpatiaLite BLOB without any transformations
--Testcase 51: OK
INSERT INTO "types_PostGIS" ( "i", gm, gg, t ) VALUES (2, decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), decode('0101000020e6100000bf72ce99fe763e40ed4960730ed84d40', 'hex'), '{"genus": "Rhododendron", "taxon": "Rhododendron ledebourii"}');
--Testcase 52:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gm" TYPE bytea;
--Testcase 53:
ALTER FOREIGN TABLE "types_PostGIS" ALTER COLUMN "gg" TYPE bytea;
--Testcase 54: OK
SELECT "i", gm, gg, t FROM "types_PostGIS";
--Testcase 55:
CREATE FOREIGN TABLE "♂" (
id int4 OPTIONS (key 'true'),
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
) SERVER sqlite_svr;
--Testcase 56:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE bytea;
--Testcase 57:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE bytea;
--Testcase 58:
SELECT * FROM "♂";
--Testcase 59:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "⌖" TYPE geometry;
--Testcase 60:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 61:
INSERT INTO "♂" (id, "UAI", "⌖", geom, "t₀", "class", "URL") VALUES(301, 'Nix Olympica', 'SRID=104904;POINT (230 19.7835659606)'::geometry, NULL, '1958-01-01', 'al', 'http://planetarynames.wr.usgs.gov/Feature/4314');
--Testcase 62:
SELECT * FROM "♂";
--Testcase 63:
CREATE FOREIGN TABLE "♁ FDW"(
geom geometry NOT NULL,
osm_type varchar(16) OPTIONS (key 'true') NOT NULL,
osm_id int OPTIONS (key 'true') NOT NULL,
ver int NOT NULL,
arr text,
t json
) SERVER sqlite_svr
OPTIONS (table '♁');
--Testcase 55:
INSERT INTO "♁ FDW" (geom, osm_type, osm_id, ver, arr, t) VALUES('SRID=4326;MULTIPOLYGON (((30.4601278 59.6905709, 30.4601291 59.6905676, 30.4601348 59.6905656, 30.4601415 59.6905663, 30.4601453 59.6905691, 30.460144 59.6905725, 30.4601383 59.6905745, 30.4601316 59.6905738, 30.4601278 59.6905709)))'::geometry, 'way', 989184163, 1, NULL, '{"building:colour":"white","building:part":"yes","height":"6","roof:shape":"flat"}');
--Testcase 67:
SELECT * FROM "♁ FDW";
-- PostGIS specific data types, but SpatiaLite or sqlite_fdw unsupported
--Testcase 68:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box2d;
--Testcase 69: -- ERR
SELECT * FROM "♂";
--Testcase 70:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE box3d;
--Testcase 71: -- ERR
SELECT * FROM "♂";
--Testcase 72:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry_dump;
--Testcase 73: -- ERR
SELECT * FROM "♂";
--Testcase 74:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geomval;
--Testcase 75: -- ERR
SELECT * FROM "♂";
--Testcase 76:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE getfaceedges_returntype;
--Testcase 77: -- ERR
SELECT * FROM "♂";
--Testcase 78:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE rastbandarg;
--Testcase 79: -- ERR
SELECT * FROM "♂";
--Testcase 80:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE raster;
--Testcase 81: -- ERR
SELECT * FROM "♂";
--Testcase 82:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE reclassarg;
--Testcase 83: -- ERR
SELECT * FROM "♂";
--Testcase 84:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE summarystats;
--Testcase 85: -- ERR
SELECT * FROM "♂";
--Testcase 86:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelement;
--Testcase 87: -- ERR
SELECT * FROM "♂";
--Testcase 88:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topoelementarray;
--Testcase 89: -- ERR
SELECT * FROM "♂";
--Testcase 90:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE topogeometry;
--Testcase 91: -- ERR
SELECT * FROM "♂";
--Testcase 92:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE unionarg;
--Testcase 93: -- ERR
SELECT * FROM "♂";
--Testcase 94:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE validatetopology_returntype;
--Testcase 95: -- ERR
SELECT * FROM "♂";
-- PostGIS specific data types, not bytea mode, hence error
--Testcase 96:
ALTER DOMAIN geometry RENAME TO geom0;
--Testcase 97:
ALTER DOMAIN geography RENAME TO geog0;
--Testcase 98:
CREATE DOMAIN geometry AS text;
--Testcase 99:
CREATE DOMAIN geography AS text;
--Testcase 100:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geometry;
--Testcase 101: -- ERR
SELECT * FROM "♂";
--Testcase 102:
ALTER FOREIGN TABLE "♂" ALTER COLUMN "geom" TYPE geography;
--Testcase 102: -- ERR
SELECT * FROM "♂";
--Testcase 103:
DROP DOMAIN geometry CASCADE;
--Testcase 104:
DROP DOMAIN geography CASCADE;
--Testcase 105:
DROP DOMAIN addbandarg;
--Testcase 106:
DROP DOMAIN box2d;
--Testcase 107:
DROP DOMAIN box3d;
--Testcase 108:
DROP DOMAIN geometry_dump;
--Testcase 109:
DROP DOMAIN geomval;
--Testcase 110:
DROP DOMAIN getfaceedges_returntype;
--Testcase 111:
DROP DOMAIN rastbandarg;
--Testcase 112:
DROP DOMAIN raster CASCADE;
--Testcase 113:
DROP DOMAIN reclassarg;
--Testcase 114:
DROP DOMAIN summarystats;
--Testcase 115:
DROP DOMAIN topoelement;
--Testcase 116:
DROP DOMAIN topoelementarray;
--Testcase 117:
DROP DOMAIN topogeometry;
--Testcase 118:
DROP DOMAIN unionarg;
--Testcase 119:
DROP DOMAIN validatetopology_returntype;
--Testcase 120:
DROP DOMAIN geom0 CASCADE;
--Testcase 121:
DROP DOMAIN geog0 CASCADE;
--Testcase 122:
DROP SERVER sqlite_svr CASCADE;
--Testcase 123:
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/17.0/without_gis_support/type.sql
================================================
--SET log_min_messages TO DEBUG1;
--SET client_min_messages TO DEBUG1;
--Testcase 44:
CREATE EXTENSION sqlite_fdw;
--Testcase 45:
CREATE SERVER sqlite_svr FOREIGN DATA WRAPPER sqlite_fdw
OPTIONS (database '/tmp/sqlite_fdw_test/common.db');
IMPORT FOREIGN SCHEMA main FROM SERVER sqlite_svr INTO public;
--Testcase 1:
INSERT INTO "type_STRING"(col) VALUES ('string');
--Testcase 4:
INSERT INTO "type_BYTE"(col) VALUES ('c');
--Testcase 5:
INSERT INTO "type_SINT"(col) VALUES (32767);
--Testcase 6:
INSERT INTO "type_SINT"(col) VALUES (-32768);
--Testcase 7:
INSERT INTO "type_BINT"(col) VALUES (9223372036854775807);
--Testcase 8:
INSERT INTO "type_BINT"(col) VALUES (-9223372036854775808);
--Testcase 9:
INSERT INTO "type_INTEGER"(col) VALUES (9223372036854775807);
--Testcase 10:
INSERT INTO "type_FLOAT"(col) VALUES (3.1415);
--Testcase 11:
INSERT INTO "type_DOUBLE"(col) VALUES (3.14159265);
--Testcase 12:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 12:34:56.789', '2017.11.06');
--Testcase 13:
INSERT INTO "type_TIMESTAMP" VALUES ('2017.11.06 1:3:0', '2017.11.07');
--Testcase 14:
INSERT INTO "type_BLOB"(col) VALUES (bytea('\xDEADBEEF'));
--Testcase 15:
INSERT INTO typetest VALUES(1,'a', 'b', 'c','2017.11.06 12:34:56.789', '2017.11.06 12:34:56.789' ) ;
--Testcase 16:
SELECT * FROM "type_STRING";
--Testcase 18:
SELECT * FROM "type_BYTE";
--Testcase 19:
SELECT * FROM "type_SINT";
--Testcase 20:
SELECT * FROM "type_BINT";
--Testcase 21:
SELECT * FROM "type_INTEGER";
--Testcase 22:
SELECT * FROM "type_FLOAT";
--Testcase 23:
SELECT * FROM "type_DOUBLE";
set datestyle=ISO;
--Testcase 24:
SELECT * FROM "type_TIMESTAMP";
--Testcase 25:
SELECT * FROM "type_BLOB";
--Testcase 26:
SELECT * FROM typetest;
--Testcase 27:
insert into "type_STRING" values('TYPE');
--Testcase 28:
insert into "type_STRING" values('type');
-- not pushdown
--Testcase 29:
SELECT *FROM "type_STRING" WHERE col like 'TYP%';
--Testcase 30:
EXPLAIN SELECT *FROM "type_STRING" WHERE col like 'TYP%';
-- pushdown
--Testcase 31:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 32:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%';
--Testcase 33:
SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 34:
EXPLAIN SELECT *FROM "type_STRING" WHERE col ilike 'typ%' and col like 'TYPE';
--Testcase 35:
SELECT * FROM "type_TIMESTAMP";
--Testcase 36:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 37:
SELECT * FROM "type_TIMESTAMP" WHERE col > date ('2017.11.06 12:34:56.789') ;
--Testcase 38:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 39:
SELECT * FROM "type_TIMESTAMP" WHERE col::text > date ('2017.11.06 12:34:56.789')::text ;
--Testcase 40:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 41:
SELECT * FROM "type_TIMESTAMP" WHERE col > b - interval '1 hour';
--Testcase 42:
EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 43:
SELECT * FROM "type_TIMESTAMP" WHERE col > b;
--Testcase 48:
INSERT INTO "type_DATE"(col) VALUES ('2021.02.23');
--Testcase 49:
INSERT INTO "type_DATE"(col) VALUES ('2021/03/08');
--Testcase 50:
INSERT INTO "type_DATE"(col) VALUES ('9999-12-30');
--Testcase 58:
SELECT * FROM "type_DATE";
--Testcase 51:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45');
--Testcase 52:
INSERT INTO "type_TIME"(col) VALUES ('01:23:45.6789');
--Testcase 59:
SELECT * FROM "type_TIME";
--Testcase 60:
EXPLAIN VERBOSE
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 61:
SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c17, c18, c19, c2, c21, c22, c23, c24 FROM alltypetest;
--Testcase 53:
CREATE FOREIGN TABLE type_JSON(col JSON OPTIONS (key 'true')) SERVER sqlite_svr OPTIONS (table 'type_TEXT');
--Testcase 54:
INSERT INTO type_JSON(col) VALUES ('[1, 2, "foo", null]');
--Testcase 55:
INSERT INTO type_JSON(col) VALUES ('{"bar": "baz", "balance": 7.77, "active": false}'::json);
--Testcase 56
SELECT * FROM type_JSON;
--Testcase 57
DELETE FROM type_JSON;
--Testcase 60:
DROP FOREIGN TABLE IF EXISTS "type_BOOLEAN";
--Testcase 61:
CREATE FOREIGN TABLE "type_BOOLEAN" (i int, b boolean OPTIONS (key 'true')) SERVER sqlite_svr;
--Testcase 62:
INSERT INTO "type_BOOLEAN" (i, b) VALUES (1, 'on'), (2, false);
--Testcase 63:
ALTER FOREIGN TABLE "type_BOOLEAN" DROP COLUMN i;
--Testcase 64:
SELECT * FROM "type_BOOLEAN"; -- OK
--Testcase 65:
DELETE FROM "type_BOOLEAN";
-- define INTEGER as TEXT column
--Testcase 67:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE text;
--Testcase 68:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as bpchar
--Testcase 69:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE char(30);
--Testcase 70:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as varchar
--Testcase 71:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE varchar(30);
--Testcase 72:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as name
--Testcase 73:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE name;
--Testcase 74:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as json
--Testcase 75:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE json;
--Testcase 76:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as time
--Testcase 77:
DELETE FROM "type_INTEGER";
--Testcase 78:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 79:
INSERT INTO "type_INTEGER" VALUES (120506);
--Testcase 80:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE time;
--Testcase 81:
SELECT * FROM "type_INTEGER"; -- OK
-- define INTEGER as date
--Testcase 82:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE date;
--Testcase 83:
SELECT * FROM "type_INTEGER"; -- OK
--Testcase 84:
ALTER FOREIGN TABLE "type_INTEGER" ALTER COLUMN col TYPE int;
--Testcase 85:
INSERT INTO "type_DOUBLE" VALUES (1.3e-5);
--Testcase 86:
SELECT * FROM "type_DOUBLE";
-- define DOUBLE as TEXT column
--Testcase 87:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE text;
--Testcase 88:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as bpchar
--Testcase 89:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE char(30);
--Testcase 90:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as varchar
--Testcase 91:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE varchar(30);
--Testcase 92:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as name
--Testcase 93:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE name;
--Testcase 94:
SELECT * FROM "type_DOUBLE"; -- OK
-- define DOUBLE as json
--Testcase 95:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE json;
--Testcase 96:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 97:
DELETE FROM "type_DOUBLE";
--Testcase 98:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 99:
INSERT INTO "type_DOUBLE" VALUES (120506.12);
-- define DOUBLE as time
--Testcase 100:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE time;
--Testcase 101:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 102:
DELETE FROM "type_DOUBLE";
--Testcase 103:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 104:
INSERT INTO "type_DOUBLE" VALUES (1999.012);
-- define DOUBLE as date
--Testcase 105:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE date;
--Testcase 106:
SELECT * FROM "type_DOUBLE"; -- OK
--Testcase 107:
ALTER FOREIGN TABLE "type_DOUBLE" ALTER COLUMN col TYPE float8;
--Testcase 108:
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 109: ERR primary key
INSERT INTO "type_DOUBLE" VALUES (PI());
--Testcase 110:
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 111:
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 113:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 114: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('Infinity');
--Testcase 115: ERR primary key
INSERT INTO "type_DOUBLE" VALUES ('-Infinity');
--Testcase 116:
SELECT * FROM "type_DOUBLE"; -- OK, +- Inf
--Testcase 300:
SET client_min_messages TO ERROR;
--Testcase 301: no details
DROP EXTENSION sqlite_fdw CASCADE;
================================================
FILE: sql/init_data/agg.data
================================================
56 7.8
100 99.097
0 0.09561
42 324.78
================================================
FILE: sql/init_data/datetimes.data
================================================
FirstDate 2020-05-12 11:45:31 1589283931
SecondDate 2020-05-12 13:32:31 1589290351
ThirdDate 2020-05-10 10:45:29 1589107529
================================================
FILE: sql/init_data/init.sql
================================================
DROP TABLE IF EXISTS department;
DROP TABLE IF EXISTS employee;
DROP TABLE IF EXISTS empdata;
DROP TABLE IF EXISTS numbers;
DROP TABLE IF EXISTS limittest;
DROP TABLE IF EXISTS grem1_1;
DROP TABLE IF EXISTS grem1_2;
DROP TABLE IF EXISTS case_exp;
CREATE TABLE department(department_id int primary key, department_name text);
CREATE TABLE employee(emp_id int primary key, emp_name text, emp_dept_id int);
CREATE TABLE empdata(emp_id int primary key, emp_dat bytea);
CREATE TABLE numbers(a int primary key, b varchar(255) unique);
CREATE TABLE t(a integer primary key, b integer);
CREATE TABLE multiprimary(a integer, b integer, c integer, primary key(b,c));
CREATE TABLE columntest("a a" integer, "b b" integer,"c c" integer, primary key("a a","b b") );
CREATE TABLE noprimary(a integer, b text);
CREATE TABLE limittest(id int primary key, x integer, y text);
create table grem1_1 (a int primary key, b int generated always as (a * 2) stored);
create table grem1_2 (a int primary key, b int generated always as (a * 2) stored, c int generated always as (a * 3) stored, d int generated always as (a * 4) stored);
CREATE TABLE case_exp(c1 int primary key, c3 text, c6 varchar(10));
CREATE TABLE "type_STRING" (col text primary key);
CREATE TABLE "type_BOOLEANpk" (col boolean primary key);
CREATE TABLE "type_BOOLEAN" (i int primary key, b boolean);
CREATE VIEW "type_BOOLEAN+" AS SELECT *, typeof("b") t, length("b") l FROM "type_BOOLEAN";
CREATE TABLE "type_BYTE" (col char(1) primary key);
CREATE TABLE "type_SINT" (col smallint primary key);
CREATE TABLE "type_BINT" (col bigint primary key);
CREATE TABLE "type_INTEGER" (col integer primary key); -- convert to bigint
CREATE TABLE "type_FLOAT" (col float primary key);
CREATE TABLE "type_DOUBLE" (col double primary key);
CREATE TABLE "type_TIMESTAMP" (col timestamp primary key, b timestamp);--, c date);
CREATE TABLE "type_BLOB" (col blob primary key);
CREATE TABLE "type_DATE" (col date primary key);
CREATE TABLE "type_TIME" (col time primary key);
CREATE TABLE "type_BIT" (i int, b bit);
CREATE VIEW "type_BIT+" AS SELECT *, typeof(b) t, length(b) l FROM "type_BIT";
CREATE TABLE "type_VARBIT" (i int, b bit);
CREATE VIEW "type_VARBIT+" AS SELECT *, typeof(b) t, length(b) l FROM "type_VARBIT";
CREATE TABLE "type_UUIDpk" (col uuid primary key);
CREATE TABLE "type_UUID" (i int, u uuid);
CREATE VIEW "type_UUID+" AS SELECT
*,
typeof(u) t,
length(u) l
-- blob affinity normalization form for "type_UUID+" view for better visual comparing during uuid test output, will be used later
-- case when typeof(u) = 'blob' then substr(lower(hex(u)),1,8) || '-' || substr(lower(hex(u)),9,4) || '-' || substr(lower(hex(u)),13,4) || '-' || substr(lower(hex(u)),17,4) || '-' || substr(lower(hex(u)),21,12) else null end uuid_blob_canon
FROM "type_UUID";
CREATE TABLE "type_MACADDRpk" (col macaddr primary key);
CREATE TABLE "type_MACADDR" (i int, m macaddr);
CREATE VIEW "type_MACADDR+" AS SELECT *, typeof("m") t, length("m") l, cast("m" as text) tx FROM "type_macaddr";
CREATE TABLE "type_MACADDR8pk" (col macaddr8 primary key);
CREATE TABLE "type_MACADDR8" (i int, m macaddr8);
CREATE VIEW "type_MACADDR8+" AS SELECT *, typeof("m") t, length("m") l, cast("m" as text) tx FROM "type_macaddr8";
CREATE TABLE "types_PostGIS" (i int, gm geometry, gg geography, r raster, t text, gm1 geometry, gg1 geography);
CREATE TABLE "type_JSON" (i int, j json, ot varchar(8), oi int, q text[], j1 json, ot1 text, oi1 int2);
CREATE TABLE "type_JSONB" (i int, j jsonb, ot varchar(8), oi int, q text[], j1 jsonb, ot1 text, oi1 int2);
CREATE VIEW "type_JSONB+" AS SELECT
*,
typeof("j") t,
length("j") l,
substr(hex(cast("j" as text)), 1, 16) || '...' tx
FROM "type_JSONB";
CREATE TABLE BitT (p integer primary key, a BIT(3), b BIT VARYING(5));
CREATE TABLE notype (a);
CREATE TABLE typetest (i integer, v varchar(10) , c char(10), t text, d datetime, ti timestamp);
CREATE TABLE type_TEXT (col text primary key);
CREATE TABLE alltypetest (
c1 int,
c2 tinyint,
c3 smallint,
c4 mediumint,
c5 bigint,
c6 unsign big int,
c7 int8,
c8 character(10),
c9 varchar(255),
c10 character varying(255),
c11 nchar(55),
c12 native character(70),
c13 nvarchar(100),
c14 text,
c15 clob,
c16 blob,
c17 real,
c18 double,
c19 double precision,
c20 float,
c21 numeric,
c22 decimal(10,5),
c23 date,
c24 datetime);
INSERT INTO alltypetest VALUES (583647, 127, 12767, 388607, 2036854775807, 573709551615, 2036854775807, 'abcdefghij', 'abcdefghijjhgfjfuafh', 'Côte dIvoire Fijifoxju', 'Hôm nay tôi rất vui', 'I am happy today', '今日はとても幸せです 今日はとても幸せです', 'The quick brown fox jumps o' , 'ABCDEFGHIJKLMNOPQRSTUVWX', x'4142434445', 3.40E+18, 1.79769E+108, 1.79769E+88, 1.79E+108, 1234, 99999.99999, '9999-12-31', '9999-12-31 23:59:59');
CREATE TABLE json_osm_test (
wkt text NULL,
osm_type varchar(8) NULL,
osm_id int8 NULL,
tags json NULL,
way_nodes int8[] NULL
);
-- a table that is missing some fields
CREATE TABLE shorty (
id integer primary key,
c character(10)
);
CREATE TABLE "A a" (col int primary key);
-- test for issue #44 github
CREATE VIRTUAL TABLE fts_table USING fts5(name, description, tokenize = porter);
-- updatable option test (github pull 59)
CREATE TABLE RO_RW_test (
i int primary key not null,
a text,
b float,
c int
);
INSERT INTO RO_RW_test (i, a, b, c) VALUES (1, 'A',1.001, 0);
-- test for PR #76 github
CREATE TABLE "Unicode data" (i text primary key, t text);
INSERT INTO "Unicode data" (i, t) VALUES ('jap', 'いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす.');
INSERT INTO "Unicode data" (i, t) VALUES ('bul', 'Ах, чудна българска земьо, полюшвай цъфтящи жита.');
INSERT INTO "Unicode data" (i, t) VALUES ('rus', 'Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.');
INSERT INTO "Unicode data" (i, t) VALUES ('aze', 'Zəfər, jaketini də, papağını da götür, bu axşam hava çox soyuq olacaq.');
INSERT INTO "Unicode data" (i, t) VALUES ('arm', 'Բել դղյակի ձախ ժամն օֆ ազգությանը ցպահանջ չճշտած վնաս էր եւ փառք։');
INSERT INTO "Unicode data" (i, t) VALUES ('ukr', 'Гей, хлопці, не вспію — на ґанку ваша файна їжа знищується бурундучком.');
INSERT INTO "Unicode data" (i, t) VALUES ('eus', 'Permin gox dabiltzu yoskiñ.');
INSERT INTO "Unicode data" (i, t) VALUES ('bel', 'У рудога вераб’я ў сховішчы пад фатэлем ляжаць нейкія гаючыя зёлкі.');
INSERT INTO "Unicode data" (i, t) VALUES ('gre', 'Τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός');
INSERT INTO "Unicode data" (i, t) VALUES ('gle', 'Chuaigh bé mhórshách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig.');
INSERT INTO "Unicode data" (i, t) VALUES ('spa', 'Quiere la boca exhausta vid, kiwi, piña y fugaz jamón.');
INSERT INTO "Unicode data" (i, t) VALUES ('kor', '키스의 고유조건은 입술끼리 만나야 하고 특별한 기술은 필요치 않다.');
INSERT INTO "Unicode data" (i, t) VALUES ('lav', 'Ķieģeļu cepējs Edgars Buls fraku un hūti žāvē uz čīkstošām eņģēm.');
INSERT INTO "Unicode data" (i, t) VALUES ('pol', 'Pchnąć w tę łódź jeża lub ośm skrzyń fig.');
INSERT INTO "Unicode data" (i, t) VALUES ('fra', 'Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera !');
INSERT INTO "Unicode data" (i, t) VALUES ('srp', 'Ljubavi, Olga, hajde pođi u Fudži i čut ćeš nježnu muziku srca.');
INSERT INTO "Unicode data" (i, t) VALUES ('epo', 'Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj.');
INSERT INTO "Unicode data" (i, t) VALUES ('cze', 'Zvlášť zákeřný učeň s ďolíčky běží podél zóny úlů.');
INSERT INTO "Unicode data" (i, t) VALUES ('ara', 'أبجد هوَّز حُطّي كلَمُن سَعْفَص قُرِشَت ثَخَدٌ ضَظَغ');
INSERT INTO "Unicode data" (i, t) VALUES ('heb', 'עטלף אבק נס דרך מזגן שהתפוצץ כי חם');
CREATE TABLE "type_BOOLEAN_oper" AS
WITH booldata AS (
SELECT row_number() over () i, column1 AS b
FROM ( VALUES
('Yes'), ('YeS'), ('yes'), ('on'), ('ON'), ('t'), ('T'), ('Y'), ('y'), (1), ('1'), ('true'), ('tRuE'),
('no'), ('No'), ('nO'), ('off'), ('oFf'), ('f'), ('F'), ('N'), ('n'), (0), ('0'), ('false'), ('fALsE'),
(NULL) )
)
SELECT ROW_NUMBER() OVER () i, t1.i i1, t1.b b1, t2.i i2, t2.b b2 FROM booldata t1 INNER JOIN booldata t2 ON 1;
-- SpatiaLite/PostGIS test
-- This table name also tests SpatiaLite and PostGIS metadata functions. Made as analog of the next "martian" table.
CREATE TABLE "♁" (
geom geometry NOT NULL,
osm_type varchar(16) NOT NULL,
osm_id int NOT NULL,
ver int NOT NULL,
arr text,
t jsonb
);
-- SpatiaLite/PostGIS test
-- This table and column names also tests SpatiaLite and PostGIS metadata functions. Any geometry or geography column declaration cause some actions inside of spatial metadata storage or journals of SpatiaLite and PostGIS.
-- This is real table and column names from one of DBs of Union Astronomique International.
CREATE TABLE "♂" (
id int4,
"UAI" varchar(254),
"⌖" geometry,
geom geometry,
"t₀" date,
"class" text,
"URL" varchar(80)
);
analyze;
================================================
FILE: sql/init_data/init_core.sql
================================================
.mode csv
DROP TABLE IF EXISTS FLOAT4_TBL;
DROP TABLE IF EXISTS FLOAT4_TMP;
DROP TABLE IF EXISTS FLOAT8_TBL;
DROP TABLE IF EXISTS FLOAT8_TMP;
DROP TABLE IF EXISTS "type_FLOAT_INF";
DROP VIEW IF EXISTS "type_FLOAT_INF+";
DROP TABLE IF EXISTS INT2_TBL;
DROP TABLE IF EXISTS INT2_TMP;
DROP TABLE IF EXISTS INT4_TBL;
DROP TABLE IF EXISTS INT4_TMP;
DROP TABLE IF EXISTS INT8_TBL;
DROP TABLE IF EXISTS test_having;
DROP TABLE IF EXISTS onek;
DROP TABLE IF EXISTS tenk1;
DROP TABLE IF EXISTS btg;
DROP TABLE IF EXISTS btg_groupby;
DROP TABLE IF EXISTS group_agg_pk;
DROP TABLE IF EXISTS num_typemod_test;
DROP TABLE IF EXISTS t;
DROP TABLE IF EXISTS RO_RW_test;
CREATE TABLE FLOAT4_TBL (f1 REAL);
CREATE TABLE FLOAT4_TMP (f1 REAL, id integer primary key autoincrement);
CREATE TABLE FLOAT8_TBL(f1 DOUBLE PRECISION);
CREATE TABLE FLOAT8_TMP (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION, id integer primary key autoincrement);
CREATE TABLE INT2_TBL(f1 int2);
CREATE TABLE INT2_TMP (f1 int2, f2 smallint, id integer primary key autoincrement);
CREATE TABLE INT4_TBL(f1 int4);
CREATE TABLE INT4_TMP (f1 int4, f2 int, id integer primary key autoincrement);
CREATE TABLE INT8_TBL(
q1 int8,
q2 int8,
CONSTRAINT t1_pkey PRIMARY KEY (q1, q2)
);
CREATE TABLE INT8_TMP(
q1 int8,
q2 int8,
q3 int4,
q4 int2,
q5 text,
id integer primary key autoincrement
);
--Testcase 1:
INSERT INTO INT2_TBL(f1) VALUES ('0 ');
--Testcase 2:
INSERT INTO INT2_TBL(f1) VALUES (' 1234 ');
--Testcase 3:
INSERT INTO INT2_TBL(f1) VALUES (' -1234');
-- largest and smallest values
--Testcase 5:
INSERT INTO INT2_TBL(f1) VALUES ('32767');
--Testcase 6:
INSERT INTO INT2_TBL(f1) VALUES ('-32767');
CREATE TABLE test_having (a int, b int, c char(8), d char);
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 onek2 (
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 aggtest (
a int2,
b float4
);
CREATE TABLE student (
name text,
age int4,
location point,
gpa float8
);
CREATE TABLE person (
name text,
age int4,
location point
);
-- FOR prepare.sql
CREATE TABLE road (
name text,
thepath path
);
create table road_tmp (a int, b int, id integer primary key autoincrement);
CREATE TABLE dates (
name TEXT,
date_as_text TEXT,
date_as_number FLOAT8
);
CREATE TABLE btg(id int primary key, p int, v text, c float, d float, e int);
CREATE TABLE btg_groupby(x int, y int, z text, w int);
CREATE TABLE group_agg_pk (x int, y int, z int, w int, f int);
.separator "\t"
.import /tmp/sqlite_fdw_test/onek.data onek
.import /tmp/sqlite_fdw_test/onek.data onek2
.import /tmp/sqlite_fdw_test/tenk.data tenk1
.import /tmp/sqlite_fdw_test/agg.data aggtest
.import /tmp/sqlite_fdw_test/student.data student
.import /tmp/sqlite_fdw_test/person.data person
.import /tmp/sqlite_fdw_test/streets.data road
.import /tmp/sqlite_fdw_test/datetimes.data dates
--Testcase 7:
INSERT INTO tenk2 SELECT * FROM tenk1;
CREATE TABLE bitwise_test(
i2 INT2,
i4 INT4,
i8 INT8,
i INTEGER,
x INT2
);
CREATE TABLE bool_test(
b1 BOOL,
b2 BOOL,
b3 BOOL,
b4 BOOL);
CREATE TABLE bool_test_tmp(
b1 BOOL,
b2 BOOL, primary key (b1, b2));
-- FOR AGGREGATEQ.SQL
create table minmaxtest(f1 int);
create table agg_tb(v int, id integer primary key autoincrement);
create table agg_tb2(v text);
create table agg_t1 (a int, b int, c int, d int, primary key (a, b));
create table agg_t2 (x int, y int, z int, primary key (x, y));
create table agg_t3 (a float8, b float8, id integer primary key autoincrement);
create table agg_t4 (a float4, b float4, id integer primary key autoincrement);
create table agg_t5 (a numeric, b numeric, id integer primary key autoincrement);
create table agg_t6 (a float8, id integer primary key autoincrement);
create table agg_t7 (a float8, b float8, c float8, d float8, id integer primary key autoincrement);
create table agg_t8 (a text, b text, primary key (a));
CREATE TABLE regr_test (x float8, y float8, id integer primary key autoincrement);
create table agg_t9 (a int, b int, c int, primary key (a, b));
create table agg_t10(one int, id integer primary key autoincrement);
create table agg_t11(one int, two int, id integer primary key autoincrement);
create table agg_t12(a int, id integer primary key autoincrement);
create table agg_t13(x int, id integer primary key autoincrement);
create table agg_t14(x int, y int, id integer primary key autoincrement);
create table agg_data_2k(g int , id integer primary key autoincrement);
create table agg_data_20k(g int , id integer primary key autoincrement);
create table t1(f1 int4, f2 int8);
create table t2(f1 int8, f2 int8);
create table agg_t15(a text, b int, c int, id integer primary key autoincrement);
create table agg_t16(a text, b text, id integer primary key autoincrement);
create table agg_t17(foo text, bar text);
create table agg_t170(v int);
create table agg_t18 (inner_c int);
create table agg_t19 (outer_c int);
create table agg_t20 (x text);
create table agg_t21 (x int);
create table agg_t22 (c1 text, id int);
create table agg_t23 (id int);
CREATE TABLE float_tb(f real);
-- multi-arg aggs
create table multi_arg_agg (a int, b int, c text);
create table agg_group_1 (c1 int, c2 numeric, c3 int);
create table agg_group_2 (a int , c1 numeric, c2 text, c3 int);
create table agg_group_3 (c1 numeric, c2 int, c3 int);
create table agg_group_4 (c1 numeric, c2 text, c3 int);
create table agg_hash_1 (c1 int, c2 numeric, c3 int);
create table agg_hash_2 (a int , c1 numeric, c2 text, c3 int);
create table agg_hash_3 (c1 numeric, c2 int, c3 int);
create table agg_hash_4 (c1 numeric, c2 text, c3 int);
-- FOR float4.sql
create table testdata(bits text, id integer primary key autoincrement);
CREATE TABLE NON_ERROR_THROWING_API_FLOAT4(f1 text, id serial);
-- FOR float8.sql
CREATE TABLE NON_ERROR_THROWING_API_FLOAT8(f1 text, id serial);
-- FOR int4.sql
create table numeric_tmp(f1 numeric, f2 numeric , id integer primary key autoincrement);
CREATE TABLE NON_ERROR_THROWING_API_INT4(f1 text, id serial);
CREATE TABLE special_case_int4 (f1 text, id integer primary key autoincrement);
CREATE TABLE VARCHAR_TBL(f1 varchar(4));
-- FOR int8.sql
CREATE TABLE NON_ERROR_THROWING_API_INT8(f1 text, id serial);
CREATE TABLE special_case_int8 (f1 text, id integer primary key autoincrement);
--Testcase 8:
INSERT INTO VARCHAR_TBL (f1) VALUES ('a');
--Testcase 9:
INSERT INTO VARCHAR_TBL (f1) VALUES ('ab');
--Testcase 10:
INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd');
create table bytea_test_table(v bytea);
create table pagg_test (x int, y int);
-- FOR numeric.sql
CREATE TABLE num_data (id int4, val numeric, primary key (id));
CREATE TABLE num_exp_add (id1 int4, id2 int4, expected numeric, primary key (id1, id2));
CREATE TABLE num_exp_sub (id1 int4, id2 int4, expected numeric, primary key (id1, id2));
CREATE TABLE num_exp_div (id1 int4, id2 int4, expected numeric, primary key (id1, id2));
CREATE TABLE num_exp_mul (id1 int4, id2 int4, expected numeric, primary key (id1, id2));
CREATE TABLE num_exp_sqrt (id int4, expected numeric, primary key (id));
CREATE TABLE num_exp_ln (id int4, expected numeric, primary key (id));
CREATE TABLE num_exp_log10 (id int4, expected numeric, primary key (id));
CREATE TABLE num_exp_power_10_ln (id int4, expected numeric, primary key (id));
CREATE TABLE num_variance (a numeric);
CREATE TABLE num_result (id1 int4, id2 int4, result numeric, primary key (id1, id2));
CREATE TABLE v (id int4, x numeric, val float8, primary key (id));
INSERT INTO v(x) VALUES ('1e340'), ('-1e340');
CREATE TABLE fract_only (id int, val numeric(4,4));
CREATE TABLE ceil_floor_round (a numeric primary key);
CREATE TABLE ceil_round_float8(a float8);
CREATE TABLE width_bucket_tbl (id1 numeric, id2 numeric, id3 numeric, id4 int, id integer primary key autoincrement);
CREATE TABLE width_bucket_test (operand_num numeric, operand_f8 float8);
CREATE TABLE num_input_test (n1 numeric);
CREATE TABLE num_trigger_test(n1 float8);
CREATE TABLE num_tmp (n1 numeric, n2 numeric, id integer primary key autoincrement);
CREATE TABLE to_number_tbl(a text, id integer primary key autoincrement);
CREATE TABLE num_typemod_test (
millions numeric(3, -6),
thousands numeric(3, -3),
units numeric(3, 0),
thousandths numeric(3, 3),
millionths numeric(3, 6)
);
CREATE TABLE NON_ERROR_THROWING_API_INT4_NUMERIC(f1 text, id serial);
-- FOR join.sql
create table q1 (i int);
create table q2 (i int);
CREATE TABLE foo (f1 int);
CREATE TABLE J1_TBL (
i integer,
j integer,
t text
);
CREATE TABLE J2_TBL (
i integer,
k integer
);
create table sub_tbl (key1 int, key3 int, key5 int, key6 int, value1 int, id integer primary key autoincrement);
CREATE TABLE t11 (name TEXT, n INTEGER);
CREATE TABLE t21 (name TEXT, n INTEGER);
CREATE TABLE t31 (name TEXT, n INTEGER);
create table x (x1 int, x2 int);
create table y (y1 int, y2 int);
CREATE TABLE t12 (a int, b int);
CREATE TABLE t22 (a int, b int);
CREATE TABLE t32 (x int, y int);
CREATE TABLE tt1 ( tt1_id int4, joincol int4 );
CREATE TABLE tt2 ( tt2_id int4, joincol int4 );
create table tt3(f1 int, f2 text);
create table tt4(f1 int);
create table tt4x(c1 int, c2 int, c3 int);
create table tt5(f1 int, f2 int);
create table tt6(f1 int, f2 int);
create table xx (pkxx int);
create table yy (pkyy int, pkxx int);
create table zt1 (f1 int primary key);
create table zt2 (f2 int primary key);
create table zt3 (f3 int primary key);
create table a1 (i integer);
create table b1 (x integer, y integer);
create table a2 (
code char not null,
primary key (code)
);
create table b2 (
a char not null,
num integer not null,
primary key (a, num)
);
create table c2 (
name char not null,
a char,
primary key (name)
);
create table nt1 (
id int primary key,
a1 boolean,
a2 boolean
);
create table nt2 (
id int primary key,
nt1_id int,
b1 boolean,
b2 boolean,
foreign key (nt1_id) references nt1(id)
);
create table nt3 (
id int primary key,
nt2_id int,
c1 boolean,
foreign key (nt2_id) references nt2(id)
);
CREATE TABLE TEXT_TBL (f1 text);
--Testcase 11:
INSERT INTO TEXT_TBL VALUES ('doh!');
--Testcase 12:
INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor');
CREATE TABLE a3 (id int PRIMARY KEY, b_id int);
CREATE TABLE b3 (id int PRIMARY KEY, c_id int);
CREATE TABLE c3 (id int PRIMARY KEY);
CREATE TABLE d3 (a int, b int);
create table parent (k int primary key, pd int);
create table child (k int unique, cd int);
CREATE TABLE a4 (id int PRIMARY KEY);
CREATE TABLE b4 (id int PRIMARY KEY, a_id int);
create table innertab (id int8 primary key, dat1 int8);
create table uniquetbl (f1 text unique);
create table join_pt1 (a int, b int, c varchar);
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) foreign key (a,b) references fkest);
create table j11 (id int primary key);
create table j21 (id int primary key);
create table j31 (id int);
create table j12 (id1 int, id2 int, primary key(id1,id2));
create table j22 (id1 int, id2 int, primary key(id1,id2));
create table j32 (id1 int, id2 int, primary key(id1,id2));
create table inserttest01 (col1 int4, col2 int4 NOT NULL, col3 text default 'testing');
CREATE TABLE update_test (
i INT PRIMARY KEY,
a INT DEFAULT 10,
b INT,
c TEXT
);
create table upsert_test (a int primary key, b text);
create table t (a int unique);
create table tbl_ra(a int unique, b int);
CREATE TABLE "type_FLOAT_INF" (i int primary key, f float);
CREATE VIEW "type_FLOAT_INF+" AS SELECT *, typeof("f") t, length("f") l FROM "type_FLOAT_INF";
-- In PostgreSQL some of this valus causes error but is infinity representation in SQLite
INSERT INTO "type_FLOAT_INF" VALUES (1, -1e999),(2, 1e999),(3, -9e999),(4, 9e999),(5,-1e308),(6, 0),(7, 1e308);
-- FOR timestamp.sql
CREATE TABLE infinite_timestamp (
t1 TIMESTAMP,
t2 TIMESTAMP,
id integer primary key autoincrement
);
================================================
FILE: sql/init_data/init_post.sql
================================================
DROP TABLE IF EXISTS "T 0";
DROP TABLE IF EXISTS "T 1";
DROP TABLE IF EXISTS "T 2";
DROP TABLE IF EXISTS "T 3";
DROP TABLE IF EXISTS "T 4";
DROP TABLE IF EXISTS base_tbl;
DROP TABLE IF EXISTS local_tbl;
DROP TABLE IF EXISTS ft3;
DROP TABLE IF EXISTS foreign_tbl;
DROP TABLE IF EXISTS grem1;
DROP TABLE IF EXISTS grem1_post14;
DROP TABLE IF EXISTS loc1;
DROP TABLE IF EXISTS loct;
DROP TABLE IF EXISTS loct1;
DROP TABLE IF EXISTS loct2;
DROP TABLE IF EXISTS loct3;
DROP TABLE IF EXISTS loct4;
DROP TABLE IF EXISTS loct4_2;
DROP TABLE IF EXISTS loct5;
DROP TABLE IF EXISTS loct6;
DROP TABLE IF EXISTS loct7;
DROP TABLE IF EXISTS t1_constraint;
DROP TABLE IF EXISTS tru_rtable0;
DROP TABLE IF EXISTS tru_pk_table;
DROP TABLE IF EXISTS tru_fk_table;
DROP TABLE IF EXISTS tru_rtable_parent;
DROP TABLE IF EXISTS tru_rtable_child;
DROP TABLE IF EXISTS loct_empty;
DROP TABLE IF EXISTS batch_table;
DROP TABLE IF EXISTS loct1_rescan;
DROP TABLE IF EXISTS loct2_rescan;
CREATE TABLE "T 0" (
"C 1" int,
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10),
c8 text check (c8 IN ('foo', 'bar', 'buz')),
CONSTRAINT t1_pkey PRIMARY KEY ("C 1")
);
CREATE TABLE "T 1" (
"C 1" int,
c2 int NOT NULL,
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10),
c8 text check (c8 IN ('foo', 'bar', 'buz')),
CONSTRAINT t1_pkey PRIMARY KEY ("C 1")
);
CREATE TABLE "T 2" (
c1 int,
c2 text,
CONSTRAINT t2_pkey PRIMARY KEY (c1)
);
CREATE TABLE "T 3" (
c1 int,
c2 int NOT NULL,
c3 text,
CONSTRAINT t3_pkey PRIMARY KEY (c1)
);
CREATE TABLE "T 4" (
c1 int,
c2 int NOT NULL,
c3 text,
CONSTRAINT t4_pkey PRIMARY KEY (c1)
);
CREATE TABLE base_tbl (a int, b int);
CREATE TABLE loc1 (f1 INTEGER, f2 text, id integer primary key autoincrement);
CREATE TABLE loct (aa TEXT, bb TEXT);
CREATE TABLE loct1 (f1 int, f2 int, f3 int);
CREATE TABLE loct2 (f1 int, f2 int, f3 int);
create table loct3 (a int, b text);
create table loct4 (a int, b text);
create table loct4_2 (f1 int, f2 int, f3 int);
create table loct5 (a int check (a in (1)), b text);
create table loct6 (a int check (a in (2)), b text);
create table loct7 (a int check (a in (1)), b text);
create table local_tbl (c1 int primary key, c2 int, c3 text);
create table ft3 (f1 text, f2 text, f3 text, primary key (f1, f2, f3));
create table foreign_tbl (a int primary key, b int);
create table grem1 (a int primary key, b int);
create table grem1_post14 (a int primary key, b int generated always as (a * 2) stored);
create table loct1_rescan (c1 int);
create table loct2_rescan (c1 int, c2 text);
CREATE TABLE t1_constraint (
c1 int primary key,
c2 int NOT NULL check (c2 >= 0),
c3 text,
c4 timestamptz,
c5 timestamp,
c6 varchar(10),
c7 char(10),
c8 text check (c8 IN ('foo', 'bar', 'buz'))
);
CREATE TABLE tru_rtable0 (id int primary key);
CREATE TABLE tru_pk_table(id int primary key);
CREATE TABLE tru_fk_table(fkey int, CONSTRAINT tfk_pkey FOREIGN KEY (fkey) REFERENCES tru_pk_table(id) ON DELETE CASCADE);
CREATE TABLE tru_rtable_parent (id int);
CREATE TABLE tru_rtable_child (id int);
CREATE TABLE loct_empty (c1 int NOT NULL, c2 text, CONSTRAINT tloct_pkey PRIMARY KEY (c1));
CREATE TABLE batch_table ( x int );
analyze;
================================================
FILE: sql/init_data/init_selectfunc.sql
================================================
DROP TABLE IF EXISTS s3;
CREATE TABLE s3(id text primary key, time timestamp, tag1 text, value1 float, value2 int, value3 float, value4 int, str1 text, str2 text);
INSERT INTO 's3' VALUES (0, DATETIME('1970-01-01 00:00:00'), 'a', 0.1, 100, -0.1, -100, '---XYZ---', ' XYZ ');
INSERT INTO 's3' VALUES (1, DATETIME('1970-01-01 00:00:01'), 'a', 0.2, 100, -0.2, -100, '---XYZ---', ' XYZ ');
INSERT INTO 's3' VALUES (2, DATETIME('1970-01-01 00:00:02'), 'a', 0.3, 100, -0.3, -100, '---XYZ---', ' XYZ ');
INSERT INTO 's3' VALUES (3, DATETIME('1970-01-01 00:00:03'), 'b', 1.1, 200, -1.1, -200, '---XYZ---', ' XYZ ');
INSERT INTO 's3' VALUES (4, DATETIME('1970-01-01 00:00:04'), 'b', 2.2, 200, -2.2, -200, '---XYZ---', ' XYZ ');
INSERT INTO 's3' VALUES (5, DATETIME('1970-01-01 00:00:05'), 'b', 3.3, 200, -3.3, -200, '---XYZ---', ' XYZ ');
analyze;
================================================
FILE: sql/init_data/onek.data
================================================
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
================================================
FILE: sql/init_data/person.data
================================================
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)
================================================
FILE: sql/init_data/streets.data
================================================
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)]
================================================
FILE: sql/init_data/student.data
================================================
fred 28 (3.1,-1.5) 3.70000000000000020e+00
larry 60 (21.8,4.9) 3.10000000000000010e+00
================================================
FILE: sql/init_data/tenk.data
================================================
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
================================================
FILE: sqlite_data_norm.c
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* SQLite functions for data normalization
* This functions are used for mixed affinity inputs for PostgreSQL data column.
*
* Most of UUID functions are implemented here according
* the uuid SQLite extension, Public Domain
* https://www.sqlite.org/src/file/ext/misc/uuid.c
*
* IDENTIFICATION
* sqlite_data_norm.c
*
*-------------------------------------------------------------------------
*/
#include
#include
#include
#include
#include "sqlite3.h"
#include "postgres.h"
#include "sqlite_fdw.h"
#include "utils/uuid.h"
static void error_catcher(sqlite3* db, int rc);
static bool infinity_processing (double* d, const char* t);
/* Also used for BLOBs in sqlite_gis.c */
const char hex_dig[] = "0123456789abcdef";
#if !defined(SQLITE_ASCII) && !defined(SQLITE_EBCDIC)
#define SQLITE_ASCII 1
#endif
#define PARSE_MACADDR(format) \
if (count != MACADDR_LEN) \
count = sscanf(str, format, &a, &b, &c, &d, &e, &f, junk);
#define PARSE_MACADDR8(format) \
if (count != MACADDR8_LEN) \
count = sscanf(str, format, &a, &b, &c, &d, &e, &f, &g, &h, junk);
/*
* This UUID SQLite extension as a group of UUID C functions
* implements functions that handling RFC-4122 UUIDs
* Three SQL functions are implemented:
*
* sqlite_fdw_uuid_str(X) - convert a UUID X into a well-formed UUID string
* sqlite_fdw_uuid_blob(X) - convert a UUID X into a 16-byte blob
*
* The output from sqlite_fdw_uuid_str(X) are always well-formed
* RFC-4122 UUID strings in this format:
*
* xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
*
* All of the 'x', 'M', and 'N' values are lower-case hexadecimal digits.
* The M digit indicates the "version". For uuid4()-generated UUIDs, the
* version is always "4" (a random UUID). The upper three bits of N digit
* are the "variant". This library only supports variant 1 (indicated
* by values of N between '8' and 'b') as those are overwhelming the most
* common. Other variants are for legacy compatibility only.
*
* The output of sqlite_fdw_uuid_blob(X) is always a 16-byte blob. The UUID input
* string is converted in network byte order (big-endian) in accordance
* with RFC-4122 specifications for variant-1 UUIDs. Note that network
* byte order is *always* used, even if the input self-identifies as a
* variant-2 UUID.
*
* The input X to the sqlite_fdw_uuid_blob() function can be either
* a string or a BLOB. If it is a BLOB it must be exactly 16 bytes in
* length or else a NULL is returned. If the input is a string it must
* consist of 32 hexadecimal digits, upper or lower case, optionally
* surrounded by {...} and with optional "-" characters interposed in the
* middle. The flexibility of input is inspired by the PostgreSQL
* implementation of UUID functions that accept in all of the following
* formats:
*
* A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
* {a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
* a0eebc999c0b4ef8bb6d6bb9bd380a11
* a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
* {a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
*
* Output of sqlite_fdw_uuid_str() always will be
* in the canonical RFC-4122 format:
*
* a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
*
* If the X input string has too few or too many digits or contains
* stray characters other than {, }, or -, then NULL is returned.
*/
/*
* Translate a single byte of Hex into an integer.
* This routine only works if h really is a valid hexadecimal
* character: 0..9a..fA..F
*/
static unsigned char
sqlite_fdw_data_norm_UuidHexToInt(int h)
{
assert((h >= '0' && h <= '9') || (h >= 'a' && h <= 'f') || (h >= 'A' && h <= 'F'));
#ifdef SQLITE_ASCII
h += 9 * (1 & (h >> 6));
#endif
#ifdef SQLITE_EBCDIC
h += 9 * (1 & ~(h >> 4));
#endif
return (unsigned char)(h & 0xf);
}
/*
* Attempt to parse a zero-terminated input string zs into a binary
* UUID. Return 1 on success, or 0 if the input string is not
* parsable.
*/
static int
sqlite_fdw_uuid_blob (const unsigned char* s0, unsigned char* Blob)
{
int i;
unsigned char* s = (unsigned char*)s0;
if (s[0] == '{')
s++;
for (i = 0; i < 16; i++)
{
if (s[0] == '-')
s++;
if (isxdigit(s[0]) && isxdigit(s[1]))
{
Blob[i] = (sqlite_fdw_data_norm_UuidHexToInt(s[0]) << 4) + sqlite_fdw_data_norm_UuidHexToInt(s[1]);
s += 2;
}
else
{
return 0;
}
}
if (s[0] == '}')
s++;
return s[0] == 0;
}
/*
* uuid_generate generates a version 4 UUID as a string
*
*static void uuid_generate(sqlite3_context* context, int argc, sqlite3_value** argv)
*{
* unsigned char aBlob[16];
* unsigned char zs[37];
* sqlite3_randomness(16, aBlob);
* aBlob[6] = (aBlob[6] & 0x0f) + 0x40;
* aBlob[8] = (aBlob[8] & 0x3f) + 0x80;
* sqlite_fdw_data_norm_uuid_blob_to_str(aBlob, zs);
* sqlite3_result_text(context, (char*)zs, 36, SQLITE_TRANSIENT);
*}
*/
/*
* aBlob to RFC UUID string with 36 characters
*/
static void
sqlite3UuidBlobToStr( const unsigned char *aBlob, unsigned char *zs)
{
unsigned char x;
int i = 0, k=0x550;
for(; i < UUID_LEN; i++, k = k >> 1)
{
if( k&1 )
{
zs[0] = '-';
zs++;
}
x = aBlob[i];
zs[0] = hex_dig[x>>4];
zs[1] = hex_dig[x&0xf];
zs += 2;
}
*zs = 0;
}
/*
* Converts argument BLOB-UUID into a well-formed UUID string.
* X can be either a string or a blob.
*/
static void
sqlite_fdw_uuid_str(sqlite3_context* context, int argc, sqlite3_value** argv)
{
unsigned char aBlob[UUID_LEN];
const unsigned char* pBlob;
unsigned char zs[UUID_LEN * 2 + 1];
sqlite3_value* arg = argv[0];
int t = sqlite3_value_type(arg);
if (t == SQLITE_BLOB)
{
pBlob = sqlite3_value_blob(arg);
}
else if (t == SQLITE3_TEXT)
{
const unsigned char* txt = sqlite3_value_text(arg);
if (sqlite_fdw_uuid_blob(txt, aBlob))
pBlob = aBlob;
else
{
sqlite3_result_null(context);
return;
}
}
else
{
sqlite3_result_null(context);
return;
}
sqlite3UuidBlobToStr(pBlob, zs);
sqlite3_result_text(context, (char*)zs, 36, SQLITE_TRANSIENT);
}
/*
* sqlite_fdw_data_norm_uuid normalize text or blob UUID argv[0] into a 16-byte blob.
*/
static void
sqlite_fdw_data_norm_uuid(sqlite3_context* context, int argc, sqlite3_value** argv)
{
unsigned char aBlob[16];
sqlite3_value* arg = argv[0];
if (sqlite3_value_type(argv[0]) == SQLITE3_TEXT)
{
const unsigned char* txt = sqlite3_value_text(arg);
if (sqlite_fdw_uuid_blob(txt, aBlob))
{
sqlite3_result_blob(context, aBlob, 16, SQLITE_TRANSIENT);
return;
}
}
sqlite3_result_value(context, arg);
}
/* ********************* End of UUID SQLite extension *********************** */
/*
* ISO:SQL valid boolean values with text affinity such as Y, no, f, t, oN etc.
* will be treated as boolean like in PostgreSQL console input
*/
static void
sqlite_fdw_data_norm_bool(sqlite3_context* context, int argc, sqlite3_value** argv)
{
sqlite3_value* arg = argv[0];
int dt = sqlite3_value_type(arg);
const char* t;
int l;
if (dt == SQLITE_INTEGER)
{
/* The fastest call because expected very often */
sqlite3_result_value(context, arg);
return;
}
if (dt != SQLITE3_TEXT && dt != SQLITE_BLOB )
{
/* NULL, FLOAT */
sqlite3_result_value(context, arg);
return;
}
l = sqlite3_value_bytes(arg);
if (l > 5)
{
sqlite3_result_value(context, arg);
return;
}
t = (const char*)sqlite3_value_text(arg);
if ( l == 1 )
{
if (strcasecmp(t, "t") == 0)
{
sqlite3_result_int(context, 1);
return;
}
if (strcasecmp(t, "f") == 0)
{
sqlite3_result_int(context, 0);
return;
}
if (strcasecmp(t, "y") == 0)
{
sqlite3_result_int(context, 1);
return;
}
if (strcasecmp(t, "n") == 0)
{
sqlite3_result_int(context, 0);
return;
}
/* rare but possible cases */
if (strcasecmp(t, "1") == 0)
{
sqlite3_result_int(context, 1);
return;
}
if (strcasecmp(t, "0") == 0)
{
sqlite3_result_int(context, 0);
return;
}
}
else if ( l == 2 )
{
if (strcasecmp(t, "on") == 0)
{
sqlite3_result_int(context, 1);
return;
}
if (strcasecmp(t, "no") == 0)
{
sqlite3_result_int(context, 0);
return;
}
}
else if ( l == 3 )
{
if (strcasecmp(t, "yes") == 0)
{
sqlite3_result_int(context, 1);
return;
}
if (strcasecmp(t, "off") == 0)
{
sqlite3_result_int(context, 0);
return;
}
}
else if ( l == 4 && strcasecmp(t, "true") == 0)
{
sqlite3_result_int(context, 1);
return;
}
else if ( l == 5 && strcasecmp(t, "false") == 0)
{
sqlite3_result_int(context, 0);
return;
}
sqlite3_result_value(context, arg);
}
/* Base ∞ constants */
const char * infs = "Inf";
const char * infl = "Infinity";
/*
* Try to check SQLite value if there is any ∞ value with text affinity
*/
static bool
infinity_processing (double* d, const char* t)
{
static const char * neg_infs = "-Inf";
static const char * neg_infl = "-Infinity";
static const char * pos_infs = "+Inf";
static const char * pos_infl = "+Infinity";
if (strcasecmp(t, infs) == 0 ||
strcasecmp(t, pos_infs) == 0 ||
strcasecmp(t, infl) == 0 ||
strcasecmp(t, pos_infl) == 0)
{
*d = INFINITY;
return true;
}
if (strcasecmp(t, neg_infs) == 0 ||
strcasecmp(t, neg_infl) == 0)
{
*d = -INFINITY;
return true;
}
return false;
}
/*
* ISO:SQL valid float/double precision values with text affinity such as Infinity or Inf
* will be treated as float like in PostgreSQL console input
* Note: SQLite also have Infinity support with real affinity, but this values
* isn't suitable for insert, there is any overflow number instead
*/
static void
sqlite_fdw_data_norm_float(sqlite3_context* context, int argc, sqlite3_value** argv)
{
sqlite3_value* arg = argv[0];
int dt = sqlite3_value_type(arg);
int l;
const char* t = NULL;
double result;
if (dt == SQLITE_FLOAT)
{
/* The fastest call because expected very often */
sqlite3_result_value(context, arg);
return;
}
if (dt != SQLITE3_TEXT && dt != SQLITE_BLOB )
{
/* INT, NULL*/
sqlite3_result_value(context, arg);
return;
}
l = sqlite3_value_bytes(arg);
if (l > strlen(infl) + 2 || l < strlen(infs))
{
sqlite3_result_value(context, arg);
return;
}
t = (const char*)sqlite3_value_text(arg);
if (infinity_processing (&result, t))
{
sqlite3_result_double(context, result);
return;
}
sqlite3_result_value(context, arg);
}
/*
* Converts argument int64-MAC address into a well-formed MAC address string.
*/
static void
sqlite_fdw_macaddr_str(sqlite3_context* context, int argc, sqlite3_value** argv)
{
sqlite3_value* arg = argv[0];
sqlite3_value* len_arg = argv[1];
int val_aff = sqlite3_value_type(arg);
int len = 0;
if (sqlite3_value_type(len_arg) != SQLITE_INTEGER)
{
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("no mac address length argument in BLOB creating function %s", __func__)));
}
len = sqlite3_value_int(len_arg);
if (val_aff != SQLITE_INTEGER || (len !=MACADDR_LEN && len !=MACADDR8_LEN))
{
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("internal mac deparse error or SQLite input have not 'int' affinity")));
return;
}
else
{
int reslen = len * 4;
char *result = (char *) palloc(reslen);
sqlite3_int64 value = sqlite3_value_int64(arg);
if (len == MACADDR_LEN )
{
snprintf(result, reslen, "%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned char)((value >> (CHAR_BIT * 5)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 4)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 3)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 2)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 1)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 0)) & 0xFF));
}
else if (len == MACADDR8_LEN )
{
snprintf(result, reslen, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned char)((value >> (CHAR_BIT * 7)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 6)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 5)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 4)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 3)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 2)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 1)) & 0xFF),
(unsigned char)((value >> (CHAR_BIT * 0)) & 0xFF));
}
sqlite3_result_text(context, (char*)result, reslen, SQLITE_TRANSIENT);
}
}
/*
* Attempt to parse a zero-terminated input string zs into a int64
* as 6 bytes MAC address. Return 1 if ok, or 0 if the input string is not
* parsable.
*/
static int
sqlite_fdw_macaddr6_int (const unsigned char* s, sqlite_uint64* i)
{
int a,
b,
c,
d,
e,
f;
char junk[2];
int count = 0;
const char* str = (const char*)s;
/* %1s matches if there is trailing non-whitespace garbage */
PARSE_MACADDR("%x:%x:%x:%x:%x:%x%1s");
PARSE_MACADDR("%x-%x-%x-%x-%x-%x%1s");
PARSE_MACADDR("%2x%2x%2x:%2x%2x%2x%1s");
PARSE_MACADDR("%2x%2x%2x-%2x%2x%2x%1s");
PARSE_MACADDR("%2x%2x.%2x%2x.%2x%2x%1s");
PARSE_MACADDR("%2x%2x-%2x%2x-%2x%2x%1s");
PARSE_MACADDR("%2x%2x%2x%2x%2x%2x%1s");
if (count != MACADDR_LEN)
return false;
if ((a < 0) || (a > 255) ||
(b < 0) || (b > 255) ||
(c < 0) || (c > 255) ||
(d < 0) || (d > 255) ||
(e < 0) || (e > 255) ||
(f < 0) || (f > 255) )
return false;
*i = (((sqlite_int64)a) << 40) +
(((sqlite_int64)b) << 32) +
(c<<24) +
(d<<16) +
(e<<8) +
f;
return true;
}
/*
* Attempt to parse a zero-terminated input string zs into a int64
* as 8 bytes MAC address. Return 1 if ok, or 0 if the input string is not
* parsable.
*/
static int
sqlite_fdw_macaddr8_int (const unsigned char* s, sqlite_uint64* i)
{
int a,
b,
c,
d,
e,
f,
g,
h;
char junk[2];
int count = 0;
const char* str = (const char*)s;
/* %1s matches if there is trailing non-whitespace garbage */
PARSE_MACADDR8("%x:%x:%x:%x:%x:%x:%x:%x%1s");
PARSE_MACADDR8("%x-%x-%x-%x-%x-%x-%x-%x%1s");
PARSE_MACADDR8("%2x%2x%2x%2x:%2x%2x%2x%2x%1s");
PARSE_MACADDR8("%2x%2x%2x%2x-%2x%2x%2x%2x%1s");
PARSE_MACADDR8("%2x%2x.%2x%2x.%2x%2x.%2x%2x%1s");
PARSE_MACADDR8("%2x%2x-%2x%2x-%2x%2x-%2x%2x%1s");
PARSE_MACADDR8("%2x%2x%2x%2x%2x%2x%2x%2x%1s");
if (count != MACADDR8_LEN)
return false;
if ((a < 0) || (a > 255) ||
(b < 0) || (b > 255) ||
(c < 0) || (c > 255) ||
(d < 0) || (d > 255) ||
(e < 0) || (e > 255) ||
(f < 0) || (f > 255) ||
(g < 0) || (g > 255) ||
(h < 0) || (h > 255) )
return false;
*i = (((sqlite_int64)a) << 56) +
(((sqlite_int64)b) << 48) +
(((sqlite_int64)c) << 40) +
(((sqlite_int64)d) << 32) +
(e<<24) +
(f<<16) +
(g<<8) +
h;
return true;
}
/*
* sqlite_fdw_data_norm_macaddr normalize text or ineger or blob macaddr argv[0] into 6 or 8 byte blob.
*/
static void
sqlite_fdw_data_norm_macaddr(sqlite3_context* context, int argc, sqlite3_value** argv)
{
sqlite3_value* val_arg = argv[0];
sqlite3_value* len_arg = argv[1];
int val_aff = sqlite3_value_type(val_arg);
int len = 0;
if (val_aff == SQLITE_INTEGER)
{
/* the fastest call for typical case */
sqlite3_result_value(context, val_arg);
return;
}
if (sqlite3_value_type(len_arg) != SQLITE_INTEGER)
{
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("no mac address length argument in MAC addr blob creating function %s", __func__)));
}
len = sqlite3_value_int(len_arg);
if (val_aff == SQLITE3_TEXT)
{
const unsigned char* txt = sqlite3_value_text(val_arg);
sqlite3_uint64 mac_int = 0;
int res = (len == MACADDR_LEN) ? sqlite_fdw_macaddr6_int(txt, &mac_int) : sqlite_fdw_macaddr8_int(txt, &mac_int);
if (res)
{
sqlite3_result_int64(context, mac_int);
return;
}
}
else if (val_aff == SQLITE_BLOB)
{
const unsigned char* pBlob = sqlite3_value_blob(val_arg);
int l_blob = sqlite3_value_bytes(val_arg);
sqlite3_uint64 res = 0;
if (len == MACADDR_LEN)
{
if (l_blob != MACADDR_LEN)
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("PostgreSQL macaddr data type allows only %d bytes SQLite blob value", MACADDR_LEN)));
}
res = (((sqlite_int64)(pBlob[0])) << (CHAR_BIT *5)) +
(((sqlite_int64)(pBlob[1])) << (CHAR_BIT *4)) +
(((sqlite_int64)(pBlob[2])) << (CHAR_BIT *3)) +
(((sqlite_int64)(pBlob[3])) << (CHAR_BIT *2)) +
(((sqlite_int64)(pBlob[4])) << (CHAR_BIT *1)) +
(((sqlite_int64)(pBlob[5])) << (CHAR_BIT *0));
}
else if (len == MACADDR8_LEN)
{
if (l_blob != MACADDR8_LEN)
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("PostgreSQL macaddr8 data type allows only %d bytes SQLite blob value", MACADDR8_LEN)));
}
res = (((sqlite_int64)(pBlob[0])) << (CHAR_BIT *7)) +
(((sqlite_int64)(pBlob[1])) << (CHAR_BIT *6)) +
(((sqlite_int64)(pBlob[2])) << (CHAR_BIT *5)) +
(((sqlite_int64)(pBlob[3])) << (CHAR_BIT *4)) +
(((sqlite_int64)(pBlob[4])) << (CHAR_BIT *3)) +
(((sqlite_int64)(pBlob[5])) << (CHAR_BIT *2)) +
(((sqlite_int64)(pBlob[6])) << (CHAR_BIT *1)) +
(((sqlite_int64)(pBlob[7])) << (CHAR_BIT *0));
}
sqlite3_result_int64(context, res);
return;
}
sqlite3_result_value(context, val_arg);
}
/*
* Converts argument int-MAC address (both 6 or 8 bytes) to MAC-BLOB address integer.
*/
static void
sqlite_fdw_macaddr_blob(sqlite3_context* context, int argc, sqlite3_value** argv)
{
sqlite3_value* arg = argv[0];
sqlite3_value* len_arg = argv[1];
int val_aff = sqlite3_value_type(arg);
int len = 0;
if (sqlite3_value_type(len_arg) != SQLITE_INTEGER)
{
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("no mac address length argument in MAC addr blob creating function %s", __func__)));
}
len = sqlite3_value_int(len_arg);
if (val_aff != SQLITE_INTEGER || (len != MACADDR_LEN && len != MACADDR8_LEN))
{
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("internal mac deparse error or SQLite input have not 'int' affinity")));
return;
}
if (val_aff == SQLITE_INTEGER)
{
unsigned char aBlob[MACADDR8_LEN]; /* max possible, even for macaddr */
sqlite_uint64 v = sqlite3_value_int64(arg);
int i;
for (i = len - 1; i >=0; i--)
{
int s = CHAR_BIT*i;
aBlob[len-i-1] = (v >> s) & 0xff;
}
if (len == MACADDR_LEN)
sqlite3_result_blob(context, aBlob, MACADDR_LEN, SQLITE_TRANSIENT);
else
sqlite3_result_blob(context, aBlob, MACADDR8_LEN, SQLITE_TRANSIENT);
return;
}
else
{
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("wrong mac address length argument %d in MAC addr blob creating function %s", len, __func__)));
}
}
/*
* Makes pg error from SQLite error.
* Interrupts normal executing, no need return after place of calling
*/
static void
error_catcher(sqlite3* db, int rc)
{
if (rc == SQLITE_OK)
return;
else
{
const char * err = sqlite3_errmsg(db);
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION),
errmsg("failed to create data unifying functions for SQLite DB"),
errhint("%s \n SQLite code %d", err, rc)));
}
}
/*
* Add data normalization fuctions to SQLite internal namespace for calling
* in deparse context.
* This is main function of internal SQLite extension presented in this file.
*/
void
sqlite_fdw_data_norm_functs_init(sqlite3* db)
{
static const int det_flags = SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC;
int rc = sqlite3_create_function(db, "sqlite_fdw_uuid_blob", 1, det_flags, 0, sqlite_fdw_data_norm_uuid, 0, 0);
error_catcher(db, rc);
rc = sqlite3_create_function(db, "sqlite_fdw_uuid_str", 1, det_flags, 0, sqlite_fdw_uuid_str, 0, 0);
error_catcher(db, rc);
rc = sqlite3_create_function(db, "sqlite_fdw_bool", 1, det_flags, 0, sqlite_fdw_data_norm_bool, 0, 0);
error_catcher(db, rc);
rc = sqlite3_create_function(db, "sqlite_fdw_float", 1, det_flags, 0, sqlite_fdw_data_norm_float, 0, 0);
error_catcher(db, rc);
rc = sqlite3_create_function(db, "sqlite_fdw_macaddr_int", 2, det_flags, 0, sqlite_fdw_data_norm_macaddr, 0, 0);
error_catcher(db, rc);
rc = sqlite3_create_function(db, "sqlite_fdw_macaddr_str", 2, det_flags, 0, sqlite_fdw_macaddr_str, 0, 0);
error_catcher(db, rc);
rc = sqlite3_create_function(db, "sqlite_fdw_macaddr_blob", 2, det_flags, 0, sqlite_fdw_macaddr_blob, 0, 0);
error_catcher(db, rc);
/*
* static const int flags = SQLITE_UTF8 | SQLITE_INNOCUOUS;
* sqlite3_create_function(db, "uuid_generate_v4", 0, flags, 0, uuid_generate, 0, 0);
* sqlite3_create_function(db, "gen_random_uuid", 1, flags, 0, uuid_generate, 0, 0);
*
* no rc because in future SQLite releases it can be added UUID generation function
* PostgreSQL 13+, no gen_random_uuid() before
*/
}
================================================
FILE: sqlite_fdw--1.0--1.1.sql
================================================
/* contrib/sqlite_fdw/sqlite_fdw--1.0--1.1.sql */
-- complain if script is sourced in psql, rather than via ALTER EXTENSION
\echo Use "ALTER EXTENSION sqlite_fdw UPDATE TO '1.1'" to load this file. \quit
CREATE FUNCTION sqlite_fdw_get_connections (OUT server_name text,
OUT valid boolean)
RETURNS SETOF record
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT PARALLEL RESTRICTED;
CREATE FUNCTION sqlite_fdw_disconnect (text)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT PARALLEL RESTRICTED;
COMMENT ON FUNCTION sqlite_fdw_disconnect(text)
IS 'closes a SQLite connection by name of FOREIGN SERVER';
CREATE FUNCTION sqlite_fdw_disconnect_all ()
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT PARALLEL RESTRICTED;
COMMENT ON FUNCTION sqlite_fdw_disconnect_all()
IS 'closes all opened SQLite connections';
COMMENT ON FUNCTION sqlite_fdw_handler()
IS 'SQLite foreign data wrapper handler';
COMMENT ON FUNCTION sqlite_fdw_validator(text[], oid)
IS 'SQLite foreign data wrapper options validator';
COMMENT ON FOREIGN DATA WRAPPER sqlite_fdw
IS 'SQLite foreign data wrapper';
CREATE OR REPLACE FUNCTION sqlite_fdw_sqlite_version()
RETURNS int
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
COMMENT ON FUNCTION sqlite_fdw_sqlite_version()
IS 'Returns used SQLite code version';
CREATE OR REPLACE FUNCTION sqlite_fdw_sqlite_code_source()
RETURNS text
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT VOLATILE PARALLEL SAFE;
COMMENT ON FUNCTION sqlite_fdw_sqlite_code_source()
IS 'Returns used SQLite code source with commit point';
================================================
FILE: sqlite_fdw--1.0.sql
================================================
/* contrib/sqlite_fdw/sqlite_fdw--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION sqlite_fdw" to load this file. \quit
CREATE FUNCTION sqlite_fdw_handler()
RETURNS fdw_handler
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
CREATE FUNCTION sqlite_fdw_validator(text[], oid)
RETURNS void
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
CREATE FOREIGN DATA WRAPPER sqlite_fdw
HANDLER sqlite_fdw_handler
VALIDATOR sqlite_fdw_validator;
CREATE OR REPLACE FUNCTION sqlite_fdw_version()
RETURNS pg_catalog.int4 STRICT
AS 'MODULE_PATHNAME' LANGUAGE C;
================================================
FILE: sqlite_fdw.c
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* Portions Copyright (c) 2018, TOSHIBA CORPORATION
*
* IDENTIFICATION
* sqlite_fdw.c
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "sqlite_fdw.h"
#include
#include "catalog/pg_collation.h"
#include "catalog/pg_type.h"
#include "commands/defrem.h"
#include "commands/explain.h"
#include "foreign/fdwapi.h"
#include "funcapi.h"
#include "mb/pg_wchar.h"
#include "miscadmin.h"
#include "nodes/makefuncs.h"
#include "nodes/nodeFuncs.h"
#if (PG_VERSION_NUM < 140000)
#include "optimizer/clauses.h"
#endif
#include "optimizer/pathnode.h"
#if PG_VERSION_NUM >= 120000
#include "optimizer/appendinfo.h"
#endif
#include "optimizer/planmain.h"
#include "optimizer/planner.h"
#include "optimizer/cost.h"
#if (PG_VERSION_NUM >= 130010 && PG_VERSION_NUM < 140000) || \
(PG_VERSION_NUM >= 140007 && PG_VERSION_NUM < 150000) || \
(PG_VERSION_NUM >= 150002)
#include "optimizer/inherit.h"
#endif
#include "optimizer/paths.h"
#include "optimizer/prep.h"
#include "optimizer/restrictinfo.h"
#include "optimizer/tlist.h"
#include "parser/parsetree.h"
#include "parser/parse_type.h"
#include "storage/ipc.h"
#include "utils/builtins.h"
#include "utils/formatting.h"
#include "utils/guc.h"
#include "utils/lsyscache.h"
#include "utils/selfuncs.h"
extern PGDLLEXPORT void _PG_init(void);
static void sqlite_fdw_exit(int code, Datum arg);
PG_MODULE_MAGIC;
/* The number of default estimated rows for table which does not exist in sqlite1_stat1
* See sqlite3ResultSetOfSelect in select.c of SQLite
*/
#define DEFAULT_ROW_ESTIMATE 1000000
#define DEFAULTE_NUM_ROWS 1000
#define IS_KEY_COLUMN(A) ((strcmp(A->defname, "key") == 0) && \
(strcmp(strVal(A->arg), "true") == 0))
/* Default CPU cost to start up a foreign query. */
#define DEFAULT_FDW_STARTUP_COST 100.0
/* Default CPU cost to process 1 row (above and beyond cpu_tuple_cost). */
#if PG_VERSION_NUM >= 170000
#define DEFAULT_FDW_TUPLE_COST 0.2
#else
#define DEFAULT_FDW_TUPLE_COST 0.01
#endif
/* If no remote estimates, assume a sort costs 20% extra */
#define DEFAULT_FDW_SORT_MULTIPLIER 1.2
/*
* This enum describes what's kept in the fdw_private list for a ForeignPath.
* We store:
*
* 1) Boolean flag showing if the remote query has the final sort
* 2) Boolean flag showing if the remote query has the LIMIT clause
*/
enum FdwPathPrivateIndex
{
/* has-final-sort flag (as an integer Value node) */
FdwPathPrivateHasFinalSort,
/* has-limit flag (as an integer Value node) */
FdwPathPrivateHasLimit,
};
/*
* Indexes of FDW-private information stored in fdw_private lists.
*
* These items are indexed with the enum FdwScanPrivateIndex, so an item
* can be fetched with list_nth(). For example, to get the SELECT statement:
* sql = strVal(list_nth(fdw_private, FdwScanPrivateSelectSql));
*/
enum FdwScanPrivateIndex
{
/* SQL statement to execute remotely (as a String node) */
FdwScanPrivateSelectSql,
/* Integer list of attribute numbers retrieved by the SELECT */
FdwScanPrivateRetrievedAttrs,
/* Integer representing UPDATE/DELETE target */
FdwScanPrivateForUpdate,
#if (PG_VERSION_NUM < 100000)
/* rtindex */
FdwScanPrivateRtIndex,
#endif
/*
* String describing join i.e. names of relations being joined and types
* of join, added when the scan is join
*/
FdwScanPrivateRelations,
};
/*
* Similarly, this enum describes what's kept in the fdw_private list for
* a ModifyTable node referencing a sqlite_fdw foreign table. We store:
*
* 1) INSERT/UPDATE/DELETE statement text to be sent to the remote server
* 2) Integer list of target attribute numbers for INSERT/UPDATE
* (NIL for a DELETE)
* 3) Length till the end of VALUES clause for INSERT
* (-1 for a DELETE/UPDATE)
*/
enum FdwModifyPrivateIndex
{
/* SQL statement to execute remotely (as a String node) */
FdwModifyPrivateUpdateSql,
/* Integer list of target attribute numbers for INSERT/UPDATE */
FdwModifyPrivateTargetAttnums,
/* Length till the end of VALUES clause (as an Integer node) */
FdwModifyPrivateLen,
};
/*
* Similarly, this enum describes what's kept in the fdw_private list for
* a ForeignScan node that modifies a foreign table directly. We store:
*
* 1) UPDATE/DELETE statement text to be sent to the remote server
* 2) Boolean flag showing if the remote query has a RETURNING clause
* 3) Integer list of attribute numbers retrieved by RETURNING, if any
* 4) Boolean flag showing if we set the command es_processed
*/
enum FdwDirectModifyPrivateIndex
{
/* SQL statement to execute remotely (as a String node) */
FdwDirectModifyPrivateUpdateSql,
/* has-returning flag (as a Boolean node) */
FdwDirectModifyPrivateHasReturning,
/* Integer list of attribute numbers retrieved by RETURNING */
FdwDirectModifyPrivateRetrievedAttrs,
/* set-processed flag (as a Boolean node) */
FdwDirectModifyPrivateSetProcessed,
};
extern PGDLLEXPORT Datum sqlite_fdw_handler(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(sqlite_fdw_handler);
PG_FUNCTION_INFO_V1(sqlite_fdw_version);
PG_FUNCTION_INFO_V1(sqlite_fdw_sqlite_version);
PG_FUNCTION_INFO_V1(sqlite_fdw_sqlite_code_source);
static void sqliteGetForeignRelSize(PlannerInfo *root,
RelOptInfo *baserel,
Oid foreigntableid);
static void sqliteGetForeignPaths(PlannerInfo *root,
RelOptInfo *baserel,
Oid foreigntableid);
static ForeignScan *sqliteGetForeignPlan(PlannerInfo *root,
RelOptInfo *baserel,
Oid foreigntableid,
ForeignPath *best_path,
List *tlist,
List *scan_clauses,
Plan *outer_plan);
static void sqliteBeginForeignScan(ForeignScanState *node,
int eflags);
static TupleTableSlot *sqliteIterateForeignScan(ForeignScanState *node);
static void sqliteReScanForeignScan(ForeignScanState *node);
static void sqliteEndForeignScan(ForeignScanState *node);
static void sqliteAddForeignUpdateTargets(
#if (PG_VERSION_NUM >= 140000)
PlannerInfo *root,
Index rtindex,
#else
Query *parsetree,
#endif
RangeTblEntry *target_rte,
Relation target_relation);
static List *sqlitePlanForeignModify(PlannerInfo *root,
ModifyTable *plan,
Index resultRelation,
int subplan_index);
static void sqliteBeginForeignModify(ModifyTableState *mtstate,
ResultRelInfo *rinfo,
List *fdw_private,
int subplan_index,
int eflags);
static TupleTableSlot *sqliteExecForeignInsert(EState *estate,
ResultRelInfo *rinfo,
TupleTableSlot *slot,
TupleTableSlot *planSlot);
#if PG_VERSION_NUM >= 140000
static TupleTableSlot **sqliteExecForeignBatchInsert(EState *estate,
ResultRelInfo *resultRelInfo,
TupleTableSlot **slots,
TupleTableSlot **planSlots,
int *numSlots);
static int sqliteGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo);
#endif
static TupleTableSlot *sqliteExecForeignUpdate(EState *estate,
ResultRelInfo *rinfo,
TupleTableSlot *slot,
TupleTableSlot *planSlot);
static TupleTableSlot *sqliteExecForeignDelete(EState *estate,
ResultRelInfo *rinfo,
TupleTableSlot *slot,
TupleTableSlot *planSlot);
static void sqliteEndForeignModify(EState *estate,
ResultRelInfo *rinfo);
#if (PG_VERSION_NUM >= 110000)
static void sqliteEndForeignInsert(EState *estate,
ResultRelInfo *resultRelInfo);
static void sqliteBeginForeignInsert(ModifyTableState *mtstate,
ResultRelInfo *resultRelInfo);
#endif
static void sqliteExplainForeignScan(ForeignScanState *node,
struct ExplainState *es);
static void sqliteExplainForeignModify(ModifyTableState *mtstate,
ResultRelInfo *rinfo,
List *fdw_private,
int subplan_index,
struct ExplainState *es);
static bool sqlitePlanDirectModify(PlannerInfo *root,
ModifyTable *plan,
Index resultRelation,
int subplan_index);
static void sqliteBeginDirectModify(ForeignScanState *node, int eflags);
static TupleTableSlot *sqliteIterateDirectModify(ForeignScanState *node);
static void sqliteEndDirectModify(ForeignScanState *node);
static void sqliteExplainDirectModify(ForeignScanState *node,
struct ExplainState *es);
#if PG_VERSION_NUM >= 140000
static void sqliteExecForeignTruncate(List *rels,
DropBehavior behavior,
bool restart_seqs);
#endif
static bool sqliteAnalyzeForeignTable(Relation relation,
AcquireSampleRowsFunc *func,
BlockNumber *totalpages);
static int sqliteIsForeignRelUpdatable(Relation rel);
static List *sqliteImportForeignSchema(ImportForeignSchemaStmt *stmt,
Oid serverOid);
static void sqliteGetForeignJoinPaths(PlannerInfo *root,
RelOptInfo *joinrel,
RelOptInfo *outerrel,
RelOptInfo *innerrel,
JoinType jointype,
JoinPathExtraData *extra);
static void
sqliteGetForeignUpperPaths(PlannerInfo *root,
UpperRelationKind stage,
RelOptInfo *input_rel,
RelOptInfo *output_rel
#if (PG_VERSION_NUM >= 110000)
,void *extra
#endif
);
static void sqlite_prepare_wrapper(ForeignServer *server,
sqlite3 * db, char *query,
sqlite3_stmt * *result,
const char **pzTail,
bool is_cache);
static void sqlite_to_pg_type(StringInfo str, char *typname);
static TupleTableSlot **sqlite_execute_insert(EState *estate,
ResultRelInfo *resultRelInfo,
CmdType operation,
TupleTableSlot **slots,
TupleTableSlot **planSlots,
int *numSlots);
static void sqlite_prepare_query_params(PlanState *node,
List *fdw_exprs,
int numParams,
FmgrInfo **param_flinfo,
List **param_exprs,
const char ***param_values,
Oid **param_types);
static void sqlite_process_query_params(ExprContext *econtext,
FmgrInfo *param_flinfo,
List *param_exprs,
const char **param_values,
sqlite3_stmt * *stmt,
Oid *param_types,
Oid foreignTableId);
static void sqlite_create_cursor(ForeignScanState *node);
static void sqlite_execute_dml_stmt(ForeignScanState *node);
static void sqlite_merge_fdw_options(SqliteFdwRelationInfo * fpinfo,
const SqliteFdwRelationInfo * fpinfo_o,
const SqliteFdwRelationInfo * fpinfo_i);
static bool sqlite_foreign_grouping_ok(PlannerInfo *root, RelOptInfo *grouped_rel);
static void sqlite_add_foreign_grouping_paths(PlannerInfo *root,
RelOptInfo *input_rel,
RelOptInfo *grouped_rel
#if (PG_VERSION_NUM >= 110000)
,GroupPathExtraData *extra
#endif
);
static void sqlite_add_foreign_ordered_paths(PlannerInfo *root,
RelOptInfo *input_rel,
RelOptInfo *ordered_rel);
static void sqlite_add_foreign_final_paths(PlannerInfo *root,
RelOptInfo *input_rel,
RelOptInfo *final_rel
#if (PG_VERSION_NUM >= 120000)
,FinalPathExtraData *extra
#endif
);
static void sqlite_estimate_path_cost_size(PlannerInfo *root,
RelOptInfo *foreignrel,
List *param_join_conds,
List *pathkeys,
SqliteFdwPathExtraData * fpextra,
double *p_rows, int *p_width,
Cost *p_startup_cost, Cost *p_total_cost);
static bool sqlite_foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel,
JoinType jointype, RelOptInfo *outerrel, RelOptInfo *innerrel,
JoinPathExtraData *extra);
#if PG_VERSION_NUM >= 170000
static bool sqlite_semijoin_target_ok(PlannerInfo *root,
RelOptInfo *joinrel,
RelOptInfo *outerrel,
RelOptInfo *innerrel);
#endif
static void sqlite_adjust_foreign_grouping_path_cost(PlannerInfo *root,
List *pathkeys,
double retrieved_rows,
double width,
double limit_tuples,
Cost *p_startup_cost,
Cost *p_run_cost);
static bool sqlite_all_baserels_are_foreign(PlannerInfo *root);
static void sqlite_add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel, List *fdw_private,
Path *epq_path
#if PG_VERSION_NUM >= 170000
, List *restrictlist
#endif
);
static List *sqlite_get_useful_pathkeys_for_relation(PlannerInfo *root,
RelOptInfo *rel);
#if PG_VERSION_NUM >= 140000
static int sqlite_get_batch_size_option(Relation rel);
#endif
static void conversion_error_callback(void *arg);
static int32 sqlite_affinity_eqv_to_pgtype(Oid type);
const char* sqlite_datatype(int t);
static const char *azType[] = { "?", "integer", "real", "text", "blob", "null" };
/*
* Identify the attribute where data conversion fails.
*/
typedef struct ConversionLocation
{
AttrNumber cur_attno; /* attribute number being processed, or 0 */
Relation rel; /* foreign table being processed, or NULL */
ForeignScanState *fsstate; /* plan node being processed, or NULL */
Form_pg_attribute att; /* PostgreSQL relation attribute */
sqlite3_value *val; /* abstract SQLite value to get affinity, length and text value */
} ConversionLocation;
/*
* Library load-time initialization, sets on_proc_exit() callback for
* backend shutdown.
*/
void
_PG_init(void)
{
on_proc_exit(&sqlite_fdw_exit, PointerGetDatum(NULL));
}
/*
* sqlite_fdw_exit: Exit callback function.
*/
static void
sqlite_fdw_exit(int code, Datum arg)
{
sqlite_cleanup_connection();
}
Datum
sqlite_fdw_handler(PG_FUNCTION_ARGS)
{
FdwRoutine *fdwroutine = makeNode(FdwRoutine);
elog(DEBUG1, "sqlite_fdw : %s", __func__);
fdwroutine->GetForeignRelSize = sqliteGetForeignRelSize;
fdwroutine->GetForeignPaths = sqliteGetForeignPaths;
fdwroutine->GetForeignPlan = sqliteGetForeignPlan;
fdwroutine->BeginForeignScan = sqliteBeginForeignScan;
fdwroutine->IterateForeignScan = sqliteIterateForeignScan;
fdwroutine->ReScanForeignScan = sqliteReScanForeignScan;
fdwroutine->EndForeignScan = sqliteEndForeignScan;
fdwroutine->IsForeignRelUpdatable = sqliteIsForeignRelUpdatable;
fdwroutine->AddForeignUpdateTargets = sqliteAddForeignUpdateTargets;
fdwroutine->PlanForeignModify = sqlitePlanForeignModify;
fdwroutine->BeginForeignModify = sqliteBeginForeignModify;
fdwroutine->ExecForeignInsert = sqliteExecForeignInsert;
#if PG_VERSION_NUM >= 140000
fdwroutine->ExecForeignBatchInsert = sqliteExecForeignBatchInsert;
fdwroutine->GetForeignModifyBatchSize = sqliteGetForeignModifyBatchSize;
#endif
fdwroutine->ExecForeignUpdate = sqliteExecForeignUpdate;
fdwroutine->ExecForeignDelete = sqliteExecForeignDelete;
fdwroutine->EndForeignModify = sqliteEndForeignModify;
#if (PG_VERSION_NUM >= 110000)
fdwroutine->BeginForeignInsert = sqliteBeginForeignInsert;
fdwroutine->EndForeignInsert = sqliteEndForeignInsert;
#endif
/* Support functions for join push-down */
fdwroutine->GetForeignJoinPaths = sqliteGetForeignJoinPaths;
/* support for EXPLAIN */
fdwroutine->ExplainForeignScan = sqliteExplainForeignScan;
fdwroutine->ExplainForeignModify = sqliteExplainForeignModify;
fdwroutine->ExplainDirectModify = sqliteExplainDirectModify;
#if PG_VERSION_NUM >= 140000
/* Support function for TRUNCATE */
fdwroutine->ExecForeignTruncate = sqliteExecForeignTruncate;
#endif
/* suport for Direct Modification */
fdwroutine->PlanDirectModify = sqlitePlanDirectModify;
fdwroutine->BeginDirectModify = sqliteBeginDirectModify;
fdwroutine->IterateDirectModify = sqliteIterateDirectModify;
fdwroutine->EndDirectModify = sqliteEndDirectModify;
/* support for ANALYSE */
fdwroutine->AnalyzeForeignTable = sqliteAnalyzeForeignTable;
/* support for IMPORT FOREIGN SCHEMA */
fdwroutine->ImportForeignSchema = sqliteImportForeignSchema;
/* Support functions for upper relation push-down */
fdwroutine->GetForeignUpperPaths = sqliteGetForeignUpperPaths;
PG_RETURN_POINTER(fdwroutine);
}
Datum
sqlite_fdw_version(PG_FUNCTION_ARGS)
{
PG_RETURN_INT32(CODE_VERSION);
}
Datum
sqlite_fdw_sqlite_version(PG_FUNCTION_ARGS)
{
PG_RETURN_INT32(sqlite3_libversion_number());
}
Datum
sqlite_fdw_sqlite_code_source(PG_FUNCTION_ARGS)
{
PG_RETURN_TEXT_P(cstring_to_text(sqlite3_sourceid()));
}
/* Wrapper for sqlite3_prepare */
static void
sqlite_prepare_wrapper(ForeignServer *server, sqlite3 * db, char *query, sqlite3_stmt * *stmt,
const char **pzTail, bool is_cache)
{
int rc;
elog(DEBUG1, "sqlite_fdw : %s %s\n", __func__, query);
rc = sqlite3_prepare_v2(db, query, -1, stmt, pzTail);
if (rc != SQLITE_OK)
{
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION),
errmsg("SQL error during prepare: %s %s", sqlite3_errmsg(db), query)
));
}
/* cache stmt to finalize at last */
if (is_cache)
sqlite_cache_stmt(server, stmt);
}
/*
* sqliteGetForeignRelSize: Create a FdwPlan for a scan on the foreign table
*/
static void
sqliteGetForeignRelSize(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
{
SqliteFdwRelationInfo *fpinfo;
ListCell *lc;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
fpinfo = (SqliteFdwRelationInfo *) palloc0(sizeof(SqliteFdwRelationInfo));
baserel->fdw_private = (void *) fpinfo;
/* Base foreign tables need to be pushed down always. */
fpinfo->pushdown_safe = true;
/* Look up foreign-table catalog info. */
fpinfo->table = GetForeignTable(foreigntableid);
fpinfo->server = GetForeignServer(fpinfo->table->serverid);
/*
* Extract user-settable option values.
*/
fpinfo->fdw_startup_cost = DEFAULT_FDW_STARTUP_COST;
fpinfo->fdw_tuple_cost = DEFAULT_FDW_TUPLE_COST;
/*
* Identify which baserestrictinfo clauses can be sent to the remote
* server and which can't.
*/
sqlite_classify_conditions(root, baserel, baserel->baserestrictinfo,
&fpinfo->remote_conds, &fpinfo->local_conds);
/*
* Identify which attributes will need to be retrieved from the remote
* server.
*/
fpinfo->attrs_used = NULL;
#if PG_VERSION_NUM >= 90600
pull_varattnos((Node *) baserel->reltarget->exprs, baserel->relid, &fpinfo->attrs_used);
#else
pull_varattnos((Node *) baserel->reltargetlist, baserel->relid, &fpinfo->attrs_used);
#endif
foreach(lc, fpinfo->local_conds)
{
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
pull_varattnos((Node *) rinfo->clause, baserel->relid, &fpinfo->attrs_used);
}
/*
* Compute the selectivity and cost of the local_conds, so we don't have
* to do it over again for each path. The best we can do for these
* conditions is to estimate selectivity on the basis of local statistics.
*/
fpinfo->local_conds_sel = clauselist_selectivity(root,
fpinfo->local_conds,
baserel->relid,
JOIN_INNER,
NULL);
cost_qual_eval(&fpinfo->local_conds_cost, fpinfo->local_conds, root);
/*
* Set # of retrieved rows and cached relation costs to some negative
* value, so that we can detect when they are set to some sensible values,
* during one (usually the first) of the calls to
* sqlite_estimate_path_cost_size.
*/
fpinfo->retrieved_rows = -1;
fpinfo->rel_startup_cost = -1;
fpinfo->rel_total_cost = -1;
/*
* If the foreign table has never been ANALYZEd, it will have relpages
* and reltuples equal to zero, which most likely has nothing to do
* with reality. We can't do a whole lot about that if we're not
* allowed to consult the remote server, but we can use a hack similar
* to plancat.c's treatment of empty relations: use a minimum size
* estimate of 10 pages, and divide by the column-datatype-based width
* estimate to get the corresponding number of tuples.
*/
#if (PG_VERSION_NUM >= 140000)
if (baserel->tuples < 0)
#else
if (baserel->pages == 0 && baserel->tuples == 0)
#endif
{
baserel->pages = 10;
baserel->tuples =
(10 * BLCKSZ) / (baserel->reltarget->width +
MAXALIGN(SizeofHeapTupleHeader));
}
/*
* Estimate baserel size as best we can with local statistics.
*/
set_baserel_size_estimates(root, baserel);
/* Fill in basically-bogus cost estimates for use later. */
sqlite_estimate_path_cost_size(root, baserel, NIL, NIL, NULL,
&fpinfo->rows, &fpinfo->width,
&fpinfo->startup_cost, &fpinfo->total_cost);
/*
* Set the name of relation in fpinfo, while we are constructing it here.
* It will be used to build the string describing the join relation in
* EXPLAIN output. We can't know whether VERBOSE option is specified or
* not, so always schema-qualify the foreign table name.
*/
fpinfo->relation_name = psprintf("%u", baserel->relid);
/* No outer and inner relations. */
fpinfo->make_outerrel_subquery = false;
fpinfo->make_innerrel_subquery = false;
fpinfo->lower_subquery_rels = NULL;
#if PG_VERSION_NUM >= 170000
fpinfo->hidden_subquery_rels = NULL;
#endif
/* Set the relation index. */
fpinfo->relation_index = baserel->relid;
}
/*
* sqlite_get_useful_pathkeys_for_relation
* Determine which orderings of a relation might be useful.
*
* Getting data in sorted order can be useful either because the requested
* order matches the final output ordering for the overall query we're
* planning, or because it enables an efficient merge join. Here, we try
* to figure out which pathkeys to consider.
*/
static List *
sqlite_get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel)
{
List *useful_pathkeys_list = NIL;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) rel->fdw_private;
ListCell *lc;
/*
* Pushing the query_pathkeys to the remote server is always worth
* considering, because it might let us avoid a local sort.
*/
fpinfo->qp_is_pushdown_safe = false;
if (root->query_pathkeys)
{
bool query_pathkeys_ok = true;
foreach(lc, root->query_pathkeys)
{
PathKey *pathkey = (PathKey *) lfirst(lc);
/*
* The planner and executor don't have any clever strategy for
* taking data sorted by a prefix of the query's pathkeys and
* getting it to be sorted by all of those pathkeys. We'll just
* end up resorting the entire data set. So, unless we can push
* down all of the query pathkeys, forget it.
*/
if (!sqlite_is_foreign_pathkey(root, rel, pathkey))
{
query_pathkeys_ok = false;
break;
}
}
if (query_pathkeys_ok)
{
useful_pathkeys_list = list_make1(list_copy(root->query_pathkeys));
fpinfo->qp_is_pushdown_safe = true;
}
}
return useful_pathkeys_list;
}
static void
sqlite_add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel, List *fdw_private,
Path *epq_path
#if PG_VERSION_NUM >= 170000
, List *restrictlist
#endif
)
{
List *useful_pathkeys_list = NIL; /* List of all pathkeys */
ListCell *lc;
double rows;
Cost startup_cost;
Cost total_cost;
/* Use small cost to avoid calculating real cost size in SQLite */
rows = startup_cost = total_cost = 10;
useful_pathkeys_list = sqlite_get_useful_pathkeys_for_relation(root, rel);
#if PG_VERSION_NUM >= 150000
/*
* Before creating sorted paths, arrange for the passed-in EPQ path, if
* any, to return columns needed by the parent ForeignScan node so that
* they will propagate up through Sort nodes injected below, if necessary.
*/
if (epq_path != NULL && useful_pathkeys_list != NIL)
{
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) rel->fdw_private;
PathTarget *target = copy_pathtarget(epq_path->pathtarget);
/* Include columns required for evaluating PHVs in the tlist. */
add_new_columns_to_pathtarget(target,
pull_var_clause((Node *) target->exprs,
PVC_RECURSE_PLACEHOLDERS));
/* Include columns required for evaluating the local conditions. */
foreach(lc, fpinfo->local_conds)
{
RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
add_new_columns_to_pathtarget(target,
pull_var_clause((Node *) rinfo->clause,
PVC_RECURSE_PLACEHOLDERS));
}
/*
* If we have added any new columns, adjust the tlist of the EPQ path.
*
* Note: the plan created using this path will only be used to execute
* EPQ checks, where accuracy of the plan cost and width estimates
* would not be important, so we do not do set_pathtarget_cost_width()
* for the new pathtarget here. See also postgresGetForeignPlan().
*/
if (list_length(target->exprs) > list_length(epq_path->pathtarget->exprs))
{
/* The EPQ path is a join path, so it is projection-capable. */
Assert(is_projection_capable_path(epq_path));
/*
* Use create_projection_path() here, so as to avoid modifying it
* in place.
*/
epq_path = (Path *) create_projection_path(root,
rel,
epq_path,
target);
}
}
#endif
/* Create one path for each set of pathkeys we found above. */
foreach(lc, useful_pathkeys_list)
{
List *useful_pathkeys = lfirst(lc);
Path *sorted_epq_path;
/*
* The EPQ path must be at least as well sorted as the path itself, in
* case it gets used as input to a mergejoin.
*/
sorted_epq_path = epq_path;
if (sorted_epq_path != NULL &&
!pathkeys_contained_in(useful_pathkeys,
sorted_epq_path->pathkeys))
sorted_epq_path = (Path *)
create_sort_path(root,
rel,
sorted_epq_path,
useful_pathkeys,
-1.0);
if (rel->reloptkind == RELOPT_BASEREL ||
rel->reloptkind == RELOPT_OTHER_MEMBER_REL)
add_path(rel, (Path *)
create_foreignscan_path(root, rel,
NULL,
rows,
startup_cost,
total_cost,
useful_pathkeys,
#if (PG_VERSION_NUM >= 120000)
rel->lateral_relids,
#else
NULL, /* no outer rel either */
#endif
sorted_epq_path,
#if PG_VERSION_NUM >= 170000
NIL, /* no fdw_restrictinfo
* list */
#endif
fdw_private));
else
add_path(rel, (Path *)
#if PG_VERSION_NUM >= 120000
create_foreign_join_path(root, rel,
#else
create_foreignscan_path(root, rel,
#endif
NULL,
rows,
startup_cost,
total_cost,
useful_pathkeys,
#if (PG_VERSION_NUM >= 120000)
rel->lateral_relids,
#else
NULL, /* no outer rel either */
#endif
sorted_epq_path,
#if PG_VERSION_NUM >= 170000
restrictlist,
#endif
fdw_private));
}
}
/*
* Check if any of the tables queried aren't foreign tables.
* We use this function to add limit pushdownm fallback to sqlite
* because if theres any non-foreign table, GetForeignUpperPath its not called from planner.c
*/
static bool
sqlite_all_baserels_are_foreign(PlannerInfo *root)
{
bool allTablesQueriedAreForeign = true;
ListCell *l;
/*
* If there is no append_rel_list, we assume we're only consulting a
* foreign table, so default value it's true and we dont need to do more.
*/
foreach(l, root->append_rel_list)
{
AppendRelInfo *appinfo = lfirst_node(AppendRelInfo, l);
int childRTindex;
RangeTblEntry *childRTE;
RelOptInfo *childrel;
/* Re-locate the child RTE and RelOptInfo */
childRTindex = appinfo->child_relid;
childRTE = root->simple_rte_array[childRTindex];
childrel = root->simple_rel_array[childRTindex];
if (!(IS_DUMMY_REL(childrel) || childRTE->inh))
{
if (!(childrel->rtekind == RTE_RELATION && childRTE->relkind == RELKIND_FOREIGN_TABLE))
{
allTablesQueriedAreForeign = false;
break;
}
}
}
return allTablesQueriedAreForeign;
}
/*
* sqliteGetForeignPaths
* Create possible scan paths for a scan on the foreign table
*/
static void
sqliteGetForeignPaths(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid)
{
Cost startup_cost = 10;
Cost total_cost = baserel->rows + startup_cost;
List *fdw_private = NIL;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/* Estimate costs */
total_cost = baserel->rows;
/*
* We add fdw_private with has_limit: true if these three conditions are
* true because we need to be able to pushdown limit in this case: - Query
* has LIMIT - Query don't have OFFSET because if we pusdown OFFSET and
* later, we re-applying offset with the "final result", and we would be
* "jumping/skipping" child results and losing registries that we wanted
* to show. - Some of the baserels are not a foreign table, so PostgreSQL
* is not calling GetForeignUpperPaths
*/
if (limit_needed(root->parse) && !root->parse->limitOffset && !sqlite_all_baserels_are_foreign(root))
#if PG_VERSION_NUM >= 150000
fdw_private = list_make2(makeBoolean(false), makeBoolean(true));
#else
fdw_private = list_make2(makeInteger(false), makeInteger(true));
#endif
/* Create a ForeignPath node and add it as only possible path */
add_path(baserel, (Path *)
create_foreignscan_path(root, baserel,
#if PG_VERSION_NUM >= 90600
NULL, /* default pathtarget */
#endif
baserel->rows,
startup_cost,
total_cost,
NIL, /* no pathkeys */
#if (PG_VERSION_NUM >= 120000)
baserel->lateral_relids,
#else
NULL, /* no outer rel either */
#endif
NULL, /* no extra plan */
#if PG_VERSION_NUM >= 170000
NIL, /* no fdw_restrictinfo list */
#endif
fdw_private));
/* Add paths with pathkeys */
sqlite_add_paths_with_pathkeys_for_rel(root, baserel, fdw_private, NULL
#if PG_VERSION_NUM >= 170000
, NIL
#endif
);
}
/*
* sqliteGetForeignPlan: Get a foreign scan plan node
*/
static ForeignScan *
sqliteGetForeignPlan(PlannerInfo *root, RelOptInfo *baserel, Oid foreigntableid, ForeignPath *best_path, List *tlist, List *scan_clauses, Plan *outer_plan)
{
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) baserel->fdw_private;
Index scan_relid = baserel->relid;
List *fdw_private;
List *local_exprs = NULL;
List *remote_exprs = NULL;
List *params_list = NULL;
List *fdw_scan_tlist = NIL;
List *remote_conds = NIL;
StringInfoData sql;
bool has_final_sort = false;
bool has_limit = false;
List *retrieved_attrs;
ListCell *lc;
List *fdw_recheck_quals = NIL;
int for_update;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/* Decide to execute function pushdown support in the target list. */
fpinfo->is_tlist_func_pushdown = sqlite_is_foreign_function_tlist(root, baserel, tlist);
/*
* Get FDW private data created by sqliteGetForeignUpperPaths(), if any.
*/
if (best_path->fdw_private)
{
#if PG_VERSION_NUM >= 150000
has_final_sort = boolVal(list_nth(best_path->fdw_private, FdwPathPrivateHasFinalSort));
has_limit = boolVal(list_nth(best_path->fdw_private, FdwPathPrivateHasLimit));
#else
has_final_sort = intVal(list_nth(best_path->fdw_private, FdwPathPrivateHasFinalSort));
has_limit = intVal(list_nth(best_path->fdw_private, FdwPathPrivateHasLimit));
#endif
}
/*
* Build the query string to be sent for execution, and identify
* expressions to be sent as parameters.
*/
/* Build the query */
initStringInfo(&sql);
/*
* Separate the scan_clauses into those that can be executed remotely and
* those that can't. baserestrictinfo clauses that were previously
* determined to be safe or unsafe by sqlite_classify_conditions are shown
* in fpinfo->remote_conds and fpinfo->local_conds. Anything else in the
* scan_clauses list will be a join clause, which we have to check for
* remote-safety.
*
* Note: the join clauses we see here should be the exact same ones
* previously examined by sqliteGetForeignPaths. Possibly it'd be worth
* passing forward the classification work done then, rather than
* repeating it here.
*
* This code must match "extract_actual_clauses(scan_clauses, false)"
* except for the additional decision about remote versus local execution.
* Note however that we only strip the RestrictInfo nodes from the
* local_exprs list, since appendWhereClause expects a list of
* RestrictInfos.
*/
if (IS_SIMPLE_REL(baserel) && fpinfo->is_tlist_func_pushdown == false)
{
foreach(lc, scan_clauses)
{
RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
Assert(IsA(rinfo, RestrictInfo));
/* Ignore any pseudoconstants, they're dealt with elsewhere */
if (rinfo->pseudoconstant)
continue;
if (list_member_ptr(fpinfo->remote_conds, rinfo))
{
remote_conds = lappend(remote_conds, rinfo);
remote_exprs = lappend(remote_exprs, rinfo->clause);
}
else if (list_member_ptr(fpinfo->local_conds, rinfo))
local_exprs = lappend(local_exprs, rinfo->clause);
else if (sqlite_is_foreign_expr(root, baserel, rinfo->clause))
{
remote_conds = lappend(remote_conds, rinfo);
remote_exprs = lappend(remote_exprs, rinfo->clause);
}
else
local_exprs = lappend(local_exprs, rinfo->clause);
/*
* For a base-relation scan, we have to support EPQ recheck, which
* should recheck all the remote quals.
*/
fdw_recheck_quals = remote_exprs;
}
}
else
{
/*
* Join relation or upper relation - set scan_relid to 0.
*/
scan_relid = 0;
/*
* For a join rel, baserestrictinfo is NIL and we are not considering
* parameterization right now, so there should be no scan_clauses for
* a joinrel or an upper rel either.
*/
if (fpinfo->is_tlist_func_pushdown == false)
{
Assert(!scan_clauses);
}
/*
* Instead we get the conditions to apply from the fdw_private
* structure.
*/
remote_exprs = extract_actual_clauses(fpinfo->remote_conds, false);
local_exprs = extract_actual_clauses(fpinfo->local_conds, false);
/*
* We leave fdw_recheck_quals empty in this case, since we never need
* to apply EPQ recheck clauses. In the case of a joinrel, EPQ
* recheck is handled elsewhere --- see sqliteGetForeignJoinPaths().
* If we're planning an upperrel (ie, remote grouping or aggregation)
* then there's no EPQ to do because SELECT FOR UPDATE wouldn't be
* allowed, and indeed we *can't* put the remote clauses into
* fdw_recheck_quals because the unaggregated Vars won't be available
* locally.
*/
/* Build the list of columns to be fetched from the foreign server. */
if (fpinfo->is_tlist_func_pushdown == true)
{
int next_resno = list_length(fdw_scan_tlist) + 1;
foreach(lc, tlist)
{
TargetEntry *tlist_tle = lfirst_node(TargetEntry, lc);
if (!IsA(tlist_tle->expr, Const))
{
TargetEntry *tle;
tle = makeTargetEntry(copyObject(tlist_tle->expr),
next_resno++,
NULL,
false);
fdw_scan_tlist = lappend(fdw_scan_tlist, tle);
}
}
foreach(lc, fpinfo->local_conds)
{
RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
fdw_scan_tlist = add_to_flat_tlist(fdw_scan_tlist,
pull_var_clause((Node *) rinfo->clause,
PVC_RECURSE_PLACEHOLDERS));
}
}
else
{
fdw_scan_tlist = sqlite_build_tlist_to_deparse(baserel);
}
/*
* Ensure that the outer plan produces a tuple whose descriptor
* matches our scan tuple slot. This is safe because all scans and
* joins support projection, so we never need to insert a Result node.
* Also, remove the local conditions from outer plan's quals, lest
* they will be evaluated twice, once by the local plan and once by
* the scan.
*/
if (outer_plan)
{
/*
* Right now, we only consider grouping and aggregation beyond
* joins. Queries involving aggregates or grouping do not require
* EPQ mechanism, hence should not have an outer plan here.
*/
Assert(baserel->reloptkind != RELOPT_UPPER_REL);
outer_plan->targetlist = fdw_scan_tlist;
foreach(lc, local_exprs)
{
Join *join_plan = (Join *) outer_plan;
Node *qual = lfirst(lc);
outer_plan->qual = list_delete(outer_plan->qual, qual);
/*
* For an inner join the local conditions of foreign scan plan
* can be part of the joinquals as well.
*/
if (join_plan->jointype == JOIN_INNER)
join_plan->joinqual = list_delete(join_plan->joinqual,
qual);
}
}
}
/*
* Build the query string to be sent for execution, and identify
* expressions to be sent as parameters.
*/
initStringInfo(&sql);
sqlite_deparse_select_stmt_for_rel(&sql, root, baserel, fdw_scan_tlist,
remote_exprs, best_path->path.pathkeys,
has_final_sort, has_limit, false,
&retrieved_attrs, ¶ms_list);
/* Remember remote_exprs for possible use by sqlitePlanDirectModify */
fpinfo->final_remote_exprs = remote_exprs;
for_update = false;
if (root->parse->commandType == CMD_UPDATE ||
root->parse->commandType == CMD_DELETE ||
root->parse->commandType == CMD_INSERT)
{
/* Relation is UPDATE/DELETE target, so use FOR UPDATE */
for_update = true;
}
/*
* Build the fdw_private list that will be available to the executor.
* Items in the list must match enum FdwScanPrivateIndex, above.
*/
fdw_private = list_make3(makeString(sql.data), retrieved_attrs, makeInteger(for_update));
#if (PG_VERSION_NUM < 100000)
fdw_private = lappend(fdw_private, makeInteger(root->all_baserels == NULL ? -2 : bms_next_member(root->all_baserels, -1)));
#endif
if (IS_JOIN_REL(baserel) || IS_UPPER_REL(baserel))
fdw_private = lappend(fdw_private,
makeString(fpinfo->relation_name));
/*
* Create the ForeignScan node from target list, local filtering
* expressions, remote parameter expressions, and FDW private information.
*
* Note that the remote parameter expressions are stored in the fdw_exprs
* field of the finished plan node; we can't keep them in private state
* because then they wouldn't be subject to later planner processing.
*/
return make_foreignscan(tlist,
local_exprs,
scan_relid,
params_list,
fdw_private,
fdw_scan_tlist,
fdw_recheck_quals,
outer_plan);
}
#if PG_VERSION_NUM >= 140000
/*
* Construct a tuple descriptor for the scan tuples handled by a foreign join.
*/
static TupleDesc
sqlite_get_tupdesc_for_join_scan_tuples(ForeignScanState *node)
{
ForeignScan *fsplan = (ForeignScan *) node->ss.ps.plan;
EState *estate = node->ss.ps.state;
TupleDesc tupdesc;
int i;
/*
* The core code has already set up a scan tuple slot based on
* fsplan->fdw_scan_tlist, and this slot's tupdesc is mostly good enough,
* but there's one case where it isn't. If we have any whole-row row
* identifier Vars, they may have vartype RECORD, and we need to replace
* that with the associated table's actual composite type. This ensures
* that when we read those ROW() expression values from the remote server,
* we can convert them to a composite type the local server knows.
*/
tupdesc = CreateTupleDescCopy(node->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
for (i = 0; i < tupdesc->natts; i++)
{
Form_pg_attribute att = TupleDescAttr(tupdesc, i);
Var *var;
RangeTblEntry *rte;
Oid reltype;
/* Nothing to do if it's not a generic RECORD attribute */
if (att->atttypid != RECORDOID || att->atttypmod >= 0)
continue;
/*
* If we can't identify the referenced table, do nothing. This'll
* likely lead to failure later, but perhaps we can muddle through.
*/
var = (Var *) list_nth_node(TargetEntry, fsplan->fdw_scan_tlist, i)->expr;
if (!IsA(var, Var) || var->varattno != 0)
continue;
rte = list_nth(estate->es_range_table, var->varno - 1);
if (rte->rtekind != RTE_RELATION)
continue;
reltype = get_rel_type_id(rte->relid);
if (!OidIsValid(reltype))
continue;
att->atttypid = reltype;
/* shouldn't need to change anything else */
}
return tupdesc;
}
#endif
/*
* sqliteBeginForeignScan: Initiate access to the database
*/
static void
sqliteBeginForeignScan(ForeignScanState *node, int eflags)
{
sqlite3 *conn = NULL;
SqliteFdwExecState *festate = NULL;
EState *estate = node->ss.ps.state;
ForeignScan *fsplan = (ForeignScan *) node->ss.ps.plan;
int numParams;
RangeTblEntry *rte;
int rtindex;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/*
* Do nothing in EXPLAIN
*/
if (eflags & EXEC_FLAG_EXPLAIN_ONLY)
return;
/*
* We'll save private state in node->fdw_state.
*/
festate = (SqliteFdwExecState *) palloc0(sizeof(SqliteFdwExecState));
node->fdw_state = (void *) festate;
festate->rowidx = 0;
/* Get info about foreign table. */
if (fsplan->scan.scanrelid > 0)
rtindex = fsplan->scan.scanrelid;
else
{
#if PG_VERSION_NUM >= 160000
rtindex = bms_next_member(fsplan->fs_base_relids, -1);
#else
rtindex = bms_next_member(fsplan->fs_relids, -1);
#endif
#if (PG_VERSION_NUM < 100000)
/* PostgreSQL version 9.6.x need to get rtindex from ForeignPlan */
if (rtindex == -2)
rtindex = intVal(list_nth(fsplan->fdw_private, FdwScanPrivateRtIndex));
#endif
}
rte = exec_rt_fetch(rtindex, estate);
festate->rel = node->ss.ss_currentRelation;
festate->table = GetForeignTable(rte->relid);
festate->server = GetForeignServer(festate->table->serverid);
/*
* Get the already connected connection, otherwise connect and get the
* connection handle.
*/
conn = sqlite_get_connection(festate->server, false);
/* Stash away the state info we have already */
festate->query = strVal(list_nth(fsplan->fdw_private, FdwScanPrivateSelectSql));
festate->retrieved_attrs = list_nth(fsplan->fdw_private, FdwScanPrivateRetrievedAttrs);
festate->for_update = intVal(list_nth(fsplan->fdw_private, FdwScanPrivateForUpdate)) ? true : false;
festate->conn = conn;
festate->cursor_exists = false;
/*
* Get info we'll need for converting data fetched from the foreign server
* into local representation and error reporting during that process.
*/
if (fsplan->scan.scanrelid > 0)
{
festate->rel = node->ss.ss_currentRelation;
festate->tupdesc = RelationGetDescr(festate->rel);
}
else
{
festate->rel = NULL;
#if (PG_VERSION_NUM >= 140000)
festate->tupdesc = sqlite_get_tupdesc_for_join_scan_tuples(node);
#else
festate->tupdesc = node->ss.ss_ScanTupleSlot->tts_tupleDescriptor;
#endif
}
festate->attinmeta = TupleDescGetAttInMetadata(festate->tupdesc);
/* Initialize the Sqlite statement */
festate->stmt = NULL;
/* Prepare Sqlite statement */
sqlite_prepare_wrapper(festate->server, festate->conn, festate->query, &festate->stmt, NULL, true);
/* Prepare for output conversion of parameters used in remote query. */
numParams = list_length(fsplan->fdw_exprs);
festate->numParams = numParams;
if (numParams > 0)
sqlite_prepare_query_params((PlanState *) node,
fsplan->fdw_exprs,
numParams,
&festate->param_flinfo,
&festate->param_exprs,
&festate->param_values,
&festate->param_types);
}
static void
make_tuple_from_result_row(sqlite3_stmt * stmt,
TupleDesc tupleDescriptor,
List *retrieved_attrs,
Datum *row,
bool *is_null,
SqliteFdwExecState * festate,
ForeignScanState *node)
{
ConversionLocation errpos;
ErrorContextCallback errcallback;
ListCell *lc = NULL;
int stmt_colid = 0;
NullableDatum sqlite_coverted;
memset(row, 0, sizeof(Datum) * tupleDescriptor->natts);
memset(is_null, true, sizeof(bool) * tupleDescriptor->natts);
/*
* Set up and install callback to report where conversion error occurs.
*/
errpos.cur_attno = 0;
errpos.att = NULL;
errpos.rel = festate->rel;
errpos.fsstate = node;
errpos.val = NULL;
errcallback.callback = conversion_error_callback;
errcallback.arg = (void *) &errpos;
errcallback.previous = error_context_stack;
error_context_stack = &errcallback;
foreach(lc, retrieved_attrs)
{
int attnum = lfirst_int(lc) - 1;
Form_pg_attribute att = TupleDescAttr(tupleDescriptor, attnum);
sqlite3_value *val = sqlite3_column_value(stmt, stmt_colid);
int sqlite_value_affinity = sqlite3_value_type(val);
errpos.cur_attno = attnum;
errpos.att = att;
errpos.val = val;
if ( sqlite_value_affinity != SQLITE_NULL)
{
/* TODO: Processing of column options about special convert behaviour
* options = GetForeignColumnOptions(rel, attnum_base); ... foreach(lc_attr, options)
*/
int AffinityBehaviourFlags = 0;
/* TODO
* Flags about special convert behaviour from options on database, table or column level
*/
sqlite_coverted = sqlite_convert_to_pg(att, val,
festate->attinmeta,
attnum, sqlite_value_affinity,
AffinityBehaviourFlags);
if (!sqlite_coverted.isnull) {
is_null[attnum] = false;
row[attnum] = sqlite_coverted.value;
}
else
is_null[attnum] = true;
}
stmt_colid++;
}
/* Uninstall error context callback. */
error_context_stack = errcallback.previous;
}
/*
* sqliteIterateForeignScan: Iterate and get the rows one by one from
* Sqlite and placed in tuple slot
*/
static TupleTableSlot *
sqliteIterateForeignScan(ForeignScanState *node)
{
SqliteFdwExecState *festate = (SqliteFdwExecState *) node->fdw_state;
TupleTableSlot *tupleSlot = node->ss.ss_ScanTupleSlot;
EState *estate = node->ss.ps.state;
TupleDesc tupleDescriptor = tupleSlot->tts_tupleDescriptor;
int rc = 0;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/*
* If this is the first call after Begin or ReScan, we need to create the
* cursor on the remote side. Binding parameters is done in this function.
*/
if (!festate->cursor_exists)
sqlite_create_cursor(node);
ExecClearTuple(tupleSlot);
/*
* We get all rows before starting update if this scan is for update
* because there is no isolation between update and select on the same
* database connections. Please see for details:
* https://sqlite.org/isolation.html
*/
if (festate->for_update && festate->rowidx == 0)
{
int size = 0;
/* festate->rows need longer context than per tuple */
MemoryContext oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);
festate->row_nums = 0;
festate->rowidx = 0;
while (1)
{
rc = sqlite3_step(festate->stmt);
if (rc == SQLITE_ROW)
{
if (size == 0)
{
size = 1;
festate->rows = palloc(sizeof(Datum *) * size);
festate->rows_isnull = palloc(sizeof(bool *) * size);
}
else if (festate->row_nums >= size)
{
/* expand array */
size = size * 2;
festate->rows = repalloc(festate->rows, sizeof(Datum *) * size);
festate->rows_isnull = repalloc(festate->rows_isnull, sizeof(bool *) * size);
}
festate->rows[festate->row_nums] = palloc(sizeof(Datum) * tupleDescriptor->natts);
festate->rows_isnull[festate->row_nums] = palloc(sizeof(bool) * tupleDescriptor->natts);
make_tuple_from_result_row(festate->stmt,
tupleDescriptor, festate->retrieved_attrs,
festate->rows[festate->row_nums],
festate->rows_isnull[festate->row_nums],
festate,
node);
festate->row_nums++;
}
else if (SQLITE_DONE == rc)
{
/* No more rows/data exists */
break;
}
else
{
sqlitefdw_report_error(ERROR, festate->stmt, festate->conn, NULL, rc);
}
}
MemoryContextSwitchTo(oldcontext);
}
if (festate->for_update)
{
if (festate->rowidx < festate->row_nums)
{
memcpy(tupleSlot->tts_values, festate->rows[festate->rowidx], sizeof(Datum) * tupleDescriptor->natts);
memcpy(tupleSlot->tts_isnull, festate->rows_isnull[festate->rowidx], sizeof(bool) * tupleDescriptor->natts);
ExecStoreVirtualTuple(tupleSlot);
festate->rowidx++;
}
}
else
{
rc = sqlite3_step(festate->stmt);
if (SQLITE_ROW == rc)
{
make_tuple_from_result_row(festate->stmt,
tupleDescriptor,
festate->retrieved_attrs,
tupleSlot->tts_values,
tupleSlot->tts_isnull,
festate,
node);
ExecStoreVirtualTuple(tupleSlot);
}
else if (SQLITE_DONE == rc)
{
/* No more rows/data exists */
}
else
{
sqlitefdw_report_error(ERROR, festate->stmt, festate->conn, NULL, rc);
}
}
return tupleSlot;
}
/*
* sqliteEndForeignScan: Finish scanning foreign table and dispose
* objects used for this scan
*/
static void
sqliteEndForeignScan(ForeignScanState *node)
{
SqliteFdwExecState *festate = (SqliteFdwExecState *) node->fdw_state;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/* if festate is NULL, we are in EXPLAIN; nothing to do */
if (festate == NULL)
return;
if (festate->stmt)
{
festate->stmt = NULL;
}
}
/*
* Restart the scan from the beginning. Note that any parameters the scan
* depends on may have changed value, so the new scan does not necessarily
* return exactly the same rows.
*/
static void
sqliteReScanForeignScan(ForeignScanState *node)
{
SqliteFdwExecState *festate = (SqliteFdwExecState *) node->fdw_state;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
if (festate->stmt)
{
sqlite3_reset(festate->stmt);
}
festate->cursor_exists = false;
festate->rowidx = 0;
}
/*
* sqliteAddForeignUpdateTargets: Add column(s) needed for update/delete on a foreign table,
* we are using first column as row identification column, so we are adding that into target
* list.
*/
static void
sqliteAddForeignUpdateTargets(
#if (PG_VERSION_NUM >= 140000)
PlannerInfo *root,
Index rtindex,
#else
Query *parsetree,
#endif
RangeTblEntry *target_rte,
Relation target_relation)
{
Oid relid = RelationGetRelid(target_relation);
TupleDesc tupdesc = target_relation->rd_att;
int i;
bool has_key = false;
/* loop through all columns of the foreign table */
for (i = 0; i < tupdesc->natts; ++i)
{
Form_pg_attribute att = TupleDescAttr(tupdesc, i);
AttrNumber attrno = att->attnum;
List *options;
ListCell *option;
/* look for the "key" option on this column */
options = GetForeignColumnOptions(relid, attrno);
foreach(option, options)
{
DefElem *def = (DefElem *) lfirst(option);
/* if "key" is set, add a resjunk for this column */
if (IS_KEY_COLUMN(def))
{
Var *var;
#if PG_VERSION_NUM < 140000
Index rtindex = parsetree->resultRelation;
TargetEntry *tle;
#endif
var = makeVar(rtindex,
attrno,
att->atttypid,
att->atttypmod,
att->attcollation,
0);
#if (PG_VERSION_NUM >= 140000)
add_row_identity_var(root, var, rtindex, pstrdup(NameStr(att->attname)));
#else
/* Wrap it in a resjunk TLE with the right name ... */
tle = makeTargetEntry((Expr *) var,
list_length(parsetree->targetList) + 1,
pstrdup(NameStr(att->attname)),
true);
/* ... and add it to the query's targetlist */
parsetree->targetList = lappend(parsetree->targetList, tle);
#endif
has_key = true;
}
else if (strcmp(def->defname, "key") == 0)
{
elog(ERROR, "impossible column option \"%s\"", def->defname);
}
}
}
if (!has_key)
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION),
errmsg("no primary key column specified for foreign table"),
errdetail("For UPDATE or DELETE, at least one foreign table column must be marked as primary key column."),
errhint("Set the option \"%s\" on the columns that belong to the primary key.", "key")));
}
static List *
sqlitePlanForeignModify(PlannerInfo *root,
ModifyTable *plan,
Index resultRelation,
int subplan_index)
{
CmdType operation = plan->operation;
RangeTblEntry *rte = planner_rt_fetch(resultRelation, root);
Relation rel;
List *targetAttrs = NULL;
StringInfoData sql;
Oid foreignTableId;
TupleDesc tupdesc;
int i;
List *condAttr = NULL;
bool doNothing = false;
int values_end_len = -1;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
initStringInfo(&sql);
/*
* Core code already has some lock on each rel being planned, so we can
* use NoLock here.
*/
rel = table_open(rte->relid, NoLock);
foreignTableId = RelationGetRelid(rel);
tupdesc = RelationGetDescr(rel);
if (operation == CMD_INSERT ||
(operation == CMD_UPDATE &&
rel->trigdesc &&
rel->trigdesc->trig_update_before_row))
{
int attnum;
for (attnum = 1; attnum <= tupdesc->natts; attnum++)
{
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
if (!attr->attisdropped)
targetAttrs = lappend_int(targetAttrs, attnum);
}
}
else if (operation == CMD_UPDATE)
{
AttrNumber attno;
#if (PG_VERSION_NUM >= 130010 && PG_VERSION_NUM < 140000) || \
(PG_VERSION_NUM >= 140007 && PG_VERSION_NUM < 150000) || \
(PG_VERSION_NUM >= 150002)
int col;
RelOptInfo *rel = find_base_rel(root, resultRelation);
Bitmapset *allUpdatedCols = get_rel_all_updated_cols(root, rel);
col = -1;
while ((col = bms_next_member(allUpdatedCols, col))>= 0)
{
/* bit numbers are offset by FirstLowInvalidHeapAttributeNumber */
attno = col + FirstLowInvalidHeapAttributeNumber;
#else
Bitmapset *tmpset;
tmpset = bms_union(rte->updatedCols, rte->extraUpdatedCols);
while ((attno = bms_first_member(tmpset)) >= 0)
{
attno += FirstLowInvalidHeapAttributeNumber;
#endif
if (attno <= InvalidAttrNumber) /* shouldn't happen */
elog(ERROR, "system-column update is not supported");
targetAttrs = lappend_int(targetAttrs, attno);
}
}
if (plan->returningLists)
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION),
errmsg("RETURNING clause is not supported")));
/*
* ON CONFLICT DO UPDATE and DO NOTHING case with inference specification
* should have already been rejected in the optimizer, as presently there
* is no way to recognize an arbiter index on a foreign table. Only DO
* NOTHING is supported without an inference specification.
*/
if (plan->onConflictAction == ONCONFLICT_NOTHING)
doNothing = true;
else if (plan->onConflictAction != ONCONFLICT_NONE)
elog(ERROR, "unexpected ON CONFLICT specification: %d",
(int) plan->onConflictAction);
/*
* Add all primary key attribute names to condAttr used in where clause of
* update
*/
for (i = 0; i < tupdesc->natts; ++i)
{
Form_pg_attribute att = TupleDescAttr(tupdesc, i);
AttrNumber attrno = att->attnum;
List *options;
ListCell *option;
/* look for the "key" option on this column */
options = GetForeignColumnOptions(foreignTableId, attrno);
foreach(option, options)
{
DefElem *def = (DefElem *) lfirst(option);
if (IS_KEY_COLUMN(def))
{
condAttr = lappend_int(condAttr, attrno);
}
}
}
/*
* Construct the SQL command string.
*/
switch (operation)
{
case CMD_INSERT:
sqlite_deparse_insert(&sql, root, resultRelation, rel, targetAttrs, doNothing, &values_end_len);
break;
case CMD_UPDATE:
sqlite_deparse_update(&sql, root, resultRelation, rel, targetAttrs, condAttr);
break;
case CMD_DELETE:
sqlite_deparse_delete(&sql, root, resultRelation, rel, condAttr);
break;
default:
elog(ERROR, "unexpected operation: %d", (int) operation);
break;
}
table_close(rel, NoLock);
return list_make3(makeString(sql.data), targetAttrs, makeInteger(values_end_len));
}
static void
sqliteBeginForeignModify(ModifyTableState *mtstate,
ResultRelInfo *resultRelInfo,
List *fdw_private,
int subplan_index,
int eflags)
{
SqliteFdwExecState *fmstate = NULL;
EState *estate = mtstate->ps.state;
Relation rel = resultRelInfo->ri_RelationDesc;
AttrNumber n_params = 0;
Oid typefnoid = InvalidOid;
bool isvarlena = false;
ListCell *lc = NULL;
Oid foreignTableId = InvalidOid;
Plan *subplan;
int i;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
foreignTableId = RelationGetRelid(rel);
#if (PG_VERSION_NUM >= 140000)
subplan = outerPlanState(mtstate)->plan;
#else
subplan = mtstate->mt_plans[subplan_index]->plan;
#endif
/*
* Do nothing in EXPLAIN (no ANALYZE) case. resultRelInfon->ri_FdwState
* stays NULL.
*/
if (eflags & EXEC_FLAG_EXPLAIN_ONLY)
return;
fmstate = (SqliteFdwExecState *) palloc0(sizeof(SqliteFdwExecState));
fmstate->rel = rel;
fmstate->table = GetForeignTable(foreignTableId);
fmstate->server = GetForeignServer(fmstate->table->serverid);
fmstate->conn = sqlite_get_connection(fmstate->server, false);
fmstate->query = strVal(list_nth(fdw_private, FdwModifyPrivateUpdateSql));
fmstate->target_attrs = (List *) list_nth(fdw_private, FdwModifyPrivateTargetAttnums);
fmstate->retrieved_attrs = (List *) list_nth(fdw_private, FdwModifyPrivateTargetAttnums);
fmstate->values_end = intVal(list_nth(fdw_private, FdwModifyPrivateLen));
fmstate->orig_query = pstrdup(fmstate->query);
n_params = list_length(fmstate->retrieved_attrs) + 1;
fmstate->p_flinfo = (FmgrInfo *) palloc0(sizeof(FmgrInfo) * n_params);
fmstate->p_nums = 0;
fmstate->temp_cxt = AllocSetContextCreate(estate->es_query_cxt,
"sqlite_fdw temporary data",
ALLOCSET_SMALL_MINSIZE,
ALLOCSET_SMALL_INITSIZE,
ALLOCSET_SMALL_MAXSIZE);
/* Set up for remaining transmittable parameters */
foreach(lc, fmstate->retrieved_attrs)
{
int attnum = lfirst_int(lc);
Form_pg_attribute attr = TupleDescAttr(RelationGetDescr(rel), attnum - 1);
Assert(!attr->attisdropped);
#if PG_VERSION_NUM >= 140000
/* Ignore generated columns; */
if (attr->attgenerated)
{
if (list_length(fmstate->retrieved_attrs) >= 1)
fmstate->p_nums = 1;
continue;
}
#endif
getTypeOutputInfo(attr->atttypid, &typefnoid, &isvarlena);
fmgr_info(typefnoid, &fmstate->p_flinfo[fmstate->p_nums]);
fmstate->p_nums++;
}
Assert(fmstate->p_nums <= n_params);
#if (PG_VERSION_NUM >= 140000)
/* Set batch_size from foreign server/table options. */
fmstate->batch_size = sqlite_get_batch_size_option(rel);
#endif
n_params = list_length(fmstate->retrieved_attrs);
/* Initialize sqlite statment */
fmstate->stmt = NULL;
fmstate->num_slots = 1;
/* Prepare sqlite statment */
sqlite_prepare_wrapper(fmstate->server, fmstate->conn, fmstate->query, &fmstate->stmt, NULL, true);
resultRelInfo->ri_FdwState = fmstate;
fmstate->junk_idx = palloc0(RelationGetDescr(rel)->natts * sizeof(AttrNumber));
/* loop through table columns */
for (i = 0; i < RelationGetDescr(rel)->natts; ++i)
{
/*
* for primary key columns, get the resjunk attribute number and store
* it
*/
fmstate->junk_idx[i] =
ExecFindJunkAttributeInTlist(subplan->targetlist,
get_attname(foreignTableId, i + 1
#if (PG_VERSION_NUM >= 110000)
,false
#endif
));
}
}
#if (PG_VERSION_NUM >= 110000)
static void
sqliteBeginForeignInsert(ModifyTableState *mtstate,
ResultRelInfo *resultRelInfo)
{
elog(ERROR, "Not support partition insert");
}
static void
sqliteEndForeignInsert(EState *estate,
ResultRelInfo *resultRelInfo)
{
elog(ERROR, "Not support partition insert");
}
#endif
/*
* sqliteExecForeignInsert
* Insert one row into a foreign table
*/
static TupleTableSlot *
sqliteExecForeignInsert(EState *estate,
ResultRelInfo *resultRelInfo,
TupleTableSlot *slot,
TupleTableSlot *planSlot)
{
TupleTableSlot **rslot;
int numSlots = 1;
rslot = sqlite_execute_insert(estate, resultRelInfo, CMD_INSERT,
&slot, &planSlot, &numSlots);
return rslot ? *rslot : NULL;
}
#if PG_VERSION_NUM >= 140000
/*
* sqliteExecForeignBatchInsert
* Insert multiple rows into a foreign table
*/
static TupleTableSlot **
sqliteExecForeignBatchInsert(EState *estate,
ResultRelInfo *resultRelInfo,
TupleTableSlot **slots,
TupleTableSlot **planSlots,
int *numSlots)
{
TupleTableSlot **rslot;
rslot = sqlite_execute_insert(estate, resultRelInfo, CMD_INSERT,
slots, planSlots, numSlots);
return rslot;
}
/*
* sqliteGetForeignModifyBatchSize
* Determine the maximum number of tuples that can be inserted in bulk
*
* Returns the batch size specified for server or table. When batching is not
* allowed (e.g. for tables with BEFORE/AFTER ROW triggers or with RETURNING
* clause), returns 1.
*/
static int
sqliteGetForeignModifyBatchSize(ResultRelInfo *resultRelInfo)
{
int batch_size;
int limitVal;
#if SQLITE_VERSION_NUMBER < 3008008
int limitRow;
#endif
#if PG_VERSION_NUM >= 160000
SqliteFdwExecState *fmstate = (SqliteFdwExecState *) resultRelInfo->ri_FdwState;
#else
SqliteFdwExecState *fmstate = resultRelInfo->ri_FdwState ?
(SqliteFdwExecState *) resultRelInfo->ri_FdwState :
NULL;
#endif
/* should be called only once */
Assert(resultRelInfo->ri_BatchSize == 0);
/*
* In EXPLAIN without ANALYZE, ri_fdwstate is NULL, so we have to lookup
* the option directly in server/table options. Otherwise just use the
* value we determined earlier.
*/
if (fmstate)
{
batch_size = fmstate->batch_size;
limitVal = (sqlite3_limit(fmstate->conn, SQLITE_LIMIT_VARIABLE_NUMBER, -1) / fmstate->p_nums);
#if SQLITE_VERSION_NUMBER < 3008008
limitRow = (sqlite3_limit(fmstate->conn, SQLITE_LIMIT_COMPOUND_SELECT, -1));
#endif
}
else
batch_size = sqlite_get_batch_size_option(resultRelInfo->ri_RelationDesc);
/*
* Disable batching when there are any BEFORE/AFTER ROW
* INSERT triggers on the foreign table, or there are any
* WITH CHECK OPTION constraints from parent views.
*
* When there are any BEFORE ROW INSERT triggers on the table, we can't
* support it, because such triggers might query the table we're inserting
* into and act differently if the tuples that have already been processed
* and prepared for insertion are not there.
*/
if (resultRelInfo->ri_WithCheckOptions != NIL ||
(resultRelInfo->ri_TrigDesc &&
(resultRelInfo->ri_TrigDesc->trig_insert_before_row ||
resultRelInfo->ri_TrigDesc->trig_insert_after_row)))
return 1;
/*
* If the foreign table has no columns, disable batching as the INSERT
* syntax doesn't allow batching multiple empty rows into a zero-column
* table in a single statement. This is needed for COPY FROM, in which
* case fmstate must be non-NULL.
*/
if (fmstate && list_length(fmstate->target_attrs) == 0)
return 1;
/*
* The batch size is used specified for server/table. Make sure we don't
* exceed this limit by using the maximum batch_size possible.
*/
if (fmstate && fmstate->p_nums > 0)
/*
* If version of SQLite is less than 3.8.8, Bulk insert into SQLite
* database has limit of 500 rows. So need use
* SQLITE_MAX_COMPOUND_SELECT to check maximum batch_size.
*/
#if SQLITE_VERSION_NUMBER < 3008008
batch_size = Min(batch_size, Min(limitVal, limitRow));
#else
batch_size = Min(batch_size, limitVal);
#endif
/* Otherwise use the batch size specified for server/table. */
return batch_size;
}
/*
* sqlite_find_modifytable_subplan
* Helper routine for sqlitePlanDirectModify to find the
* ModifyTable subplan node that scans the specified RTI.
*
* Returns NULL if the subplan couldn't be identified. That's not a fatal
* error condition, we just abandon trying to do the update directly.
*/
static ForeignScan *
sqlite_find_modifytable_subplan(PlannerInfo *root,
ModifyTable *plan,
Index rtindex,
int subplan_index)
{
Plan *subplan = outerPlan(plan);
/*
* The cases we support are (1) the desired ForeignScan is the immediate
* child of ModifyTable, or (2) it is the subplan_index'th child of an
* Append node that is the immediate child of ModifyTable. There is no
* point in looking further down, as that would mean that local joins are
* involved, so we can't do the update directly.
*
* There could be a Result atop the Append too, acting to compute the
* UPDATE targetlist values. We ignore that here; the tlist will be
* checked by our caller.
*
* In principle we could examine all the children of the Append, but it's
* currently unlikely that the core planner would generate such a plan
* with the children out-of-order. Moreover, such a search risks costing
* O(N^2) time when there are a lot of children.
*/
if (IsA(subplan, Append))
{
Append *appendplan = (Append *) subplan;
if (subplan_index < list_length(appendplan->appendplans))
subplan = (Plan *) list_nth(appendplan->appendplans, subplan_index);
}
else if (IsA(subplan, Result) &&
outerPlan(subplan) != NULL &&
IsA(outerPlan(subplan), Append))
{
Append *appendplan = (Append *) outerPlan(subplan);
if (subplan_index < list_length(appendplan->appendplans))
subplan = (Plan *) list_nth(appendplan->appendplans, subplan_index);
}
/* Now, have we got a ForeignScan on the desired rel? */
if (IsA(subplan, ForeignScan))
{
ForeignScan *fscan = (ForeignScan *) subplan;
#if (PG_VERSION_NUMBER >= 160000)
if (bms_is_member(rtindex, fscan->fs_base_relids))
#else
if (bms_is_member(rtindex, fscan->fs_relids))
#endif
return fscan;
}
return NULL;
}
#endif
/*
* sqlitePlanDirectModify
* Consider a direct foreign table modification
*
* Decide whether it is safe to modify a foreign table directly, and if so,
* rewrite subplan accordingly.
*/
static bool
sqlitePlanDirectModify(PlannerInfo *root,
ModifyTable *plan,
Index resultRelation,
int subplan_index)
{
CmdType operation = plan->operation;
#if PG_VERSION_NUM < 140000
Plan *subplan;
#endif
RelOptInfo *foreignrel;
RangeTblEntry *rte;
SqliteFdwRelationInfo *fpinfo;
Relation rel;
StringInfoData sql;
ForeignScan *fscan;
#if PG_VERSION_NUM >= 140000
List *processed_tlist = NIL;
#endif
List *targetAttrs = NIL;
List *remote_exprs;
List *params_list = NIL;
List *retrieved_attrs = NIL;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/*
* Decide whether it is safe to modify a foreign table directly.
*/
/*
* The table modification must be an UPDATE or DELETE.
*/
if (operation != CMD_UPDATE && operation != CMD_DELETE)
return false;
/*
* It's unsafe to modify a foreign table directly if there are any local
* joins needed.
*/
#if (PG_VERSION_NUM >= 140000)
fscan = sqlite_find_modifytable_subplan(root, plan, resultRelation, subplan_index);
if (!fscan)
return false;
#else
subplan = (Plan *) list_nth(plan->plans, subplan_index);
if (!IsA(subplan, ForeignScan))
return false;
fscan = (ForeignScan *) subplan;
#endif
/*
* It's unsafe to modify a foreign table directly if there are any quals
* that should be evaluated locally.
*/
#if (PG_VERSION_NUM >= 140000)
if (fscan->scan.plan.qual != NIL)
#else
if (subplan->qual != NIL)
#endif
return false;
/* not supported RETURNING clause by this FDW */
if (plan->returningLists)
{
return false;
}
/* Safe to fetch data about the target foreign rel */
if (fscan->scan.scanrelid == 0)
{
foreignrel = find_join_rel(root, fscan->fs_relids);
/* We should have a rel for this foreign join. */
Assert(foreignrel);
}
else
foreignrel = root->simple_rel_array[resultRelation];
/*
* Currently, SQLite 3.33 does support UPDATE-FROM. Because with
* UPDATE-FROM we can join the target table against other tables. TODO:
* After JOIN pushdown feature is supported, we need to consider the below
* code to pushdown UPDATE-FROM.
*/
if (IS_JOIN_REL(foreignrel))
return false;
rte = root->simple_rte_array[resultRelation];
fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
/*
* It's unsafe to update a foreign table directly, if any expressions to
* assign to the target columns are unsafe to evaluate remotely.
*/
if (operation == CMD_UPDATE)
{
#if (PG_VERSION_NUM >= 140000)
ListCell *lc,
*lc2;
/*
* The expressions of concern are the first N columns of the processed
* targetlist, where N is the length of the rel's update_colnos.
*/
get_translated_update_targetlist(root, resultRelation,
&processed_tlist, &targetAttrs);
forboth(lc, processed_tlist, lc2, targetAttrs)
{
TargetEntry *tle = lfirst_node(TargetEntry, lc);
AttrNumber attno = lfirst_int(lc2);
/* update's new-value expressions shouldn't be resjunk */
Assert(!tle->resjunk);
if (attno <= InvalidAttrNumber) /* shouldn't happen */
elog(ERROR, "system-column update is not supported");
if (!sqlite_is_foreign_expr(root, foreignrel, (Expr *) tle->expr))
return false;
}
#else
int col;
/*
* We transmit only columns that were explicitly targets of the
* UPDATE, so as to avoid unnecessary data transmission.
*/
col = -1;
while ((col = bms_next_member(rte->updatedCols, col)) >= 0)
{
/* bit numbers are offset by FirstLowInvalidHeapAttributeNumber */
AttrNumber attno = col + FirstLowInvalidHeapAttributeNumber;
TargetEntry *tle;
if (attno <= InvalidAttrNumber) /* shouldn't happen */
elog(ERROR, "system-column update is not supported");
tle = get_tle_by_resno(subplan->targetlist, attno);
if (!tle)
elog(ERROR, "attribute number %d not found in subplan targetlist",
attno);
if (!sqlite_is_foreign_expr(root, foreignrel, (Expr *) tle->expr))
return false;
targetAttrs = lappend_int(targetAttrs, attno);
}
#endif
}
/*
* Ok, rewrite subplan so as to modify the foreign table directly.
*/
initStringInfo(&sql);
/*
* Core code already has some lock on each rel being planned, so we can
* use NoLock here.
*/
rel = table_open(rte->relid, NoLock);
/*
* Recall the qual clauses that must be evaluated remotely. (These are
* bare clauses not RestrictInfos, but deparse.c's appendConditions()
* doesn't care.)
*/
remote_exprs = fpinfo->final_remote_exprs;
/*
* Construct the SQL command string.
*/
switch (operation)
{
case CMD_UPDATE:
sqlite_deparse_direct_update_sql(&sql, root, resultRelation, rel,
foreignrel,
#if (PG_VERSION_NUM >= 140000)
processed_tlist,
#else
((Plan *) fscan)->targetlist,
#endif
targetAttrs,
remote_exprs, ¶ms_list,
&retrieved_attrs);
break;
case CMD_DELETE:
sqlite_deparse_direct_delete_sql(&sql, root, resultRelation, rel,
foreignrel,
remote_exprs, ¶ms_list,
&retrieved_attrs);
break;
default:
elog(ERROR, "unexpected operation: %d", (int) operation);
break;
}
/*
* Update the operation info.
*/
fscan->operation = operation;
#if PG_VERSION_NUM >= 140000
fscan->resultRelation = resultRelation;
#endif
/*
* Update the fdw_exprs list that will be available to the executor.
*/
fscan->fdw_exprs = params_list;
/*
* Update the fdw_private list that will be available to the executor.
* Items in the list must match enum FdwDirectModifyPrivateIndex, above.
*/
fscan->fdw_private = list_make4(makeString(sql.data),
#if PG_VERSION_NUM >= 150000
makeBoolean((retrieved_attrs != NIL)),
retrieved_attrs,
makeBoolean(plan->canSetTag));
#else
makeInteger(0),
retrieved_attrs,
makeInteger(plan->canSetTag));
#endif
/*
* Update the foreign-join-related fields.
*/
if (fscan->scan.scanrelid == 0)
{
/* No need for the outer subplan. */
fscan->scan.plan.lefttree = NULL;
}
table_close(rel, NoLock);
return true;
}
/*
* sqliteBeginDirectModify
* Prepare a direct foreign table modification
*/
static void
sqliteBeginDirectModify(ForeignScanState *node, int eflags)
{
ForeignScan *fsplan = (ForeignScan *) node->ss.ps.plan;
EState *estate = node->ss.ps.state;
SqliteFdwDirectModifyState *dmstate;
Index rtindex;
int numParams;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/*
* Do nothing in EXPLAIN (no ANALYZE) case. node->fdw_state stays NULL.
*/
if (eflags & EXEC_FLAG_EXPLAIN_ONLY)
return;
/*
* We'll save private state in node->fdw_state.
*/
dmstate = (SqliteFdwDirectModifyState *) palloc0(sizeof(SqliteFdwDirectModifyState));
node->fdw_state = (void *) dmstate;
/* Get info about foreign table. */
#if (PG_VERSION_NUM >= 140000)
rtindex = node->resultRelInfo->ri_RangeTableIndex;
#else
rtindex = estate->es_result_relation_info->ri_RangeTableIndex;
#endif
#if PG_VERSION_NUM >= 160000
rtindex = node->resultRelInfo->ri_RangeTableIndex;
#endif
if (fsplan->scan.scanrelid == 0)
dmstate->rel = ExecOpenScanRelation(estate, rtindex, eflags);
else
dmstate->rel = node->ss.ss_currentRelation;
dmstate->table = GetForeignTable(RelationGetRelid(dmstate->rel));
dmstate->server = GetForeignServer(dmstate->table->serverid);
/*
* Get connection to the foreign server. Connection manager will
* establish new connection if necessary.
*/
dmstate->conn = sqlite_get_connection(dmstate->server, false);
/* Update the foreign-join-related fields. */
if (fsplan->scan.scanrelid == 0)
{
/* Save info about foreign table. */
dmstate->resultRel = dmstate->rel;
/*
* Set dmstate->rel to NULL to teach get_returning_data() and
* make_tuple_from_result_row() that columns fetched from the remote
* server are described by fdw_scan_tlist of the foreign-scan plan
* node, not the tuple descriptor for the target relation.
*/
dmstate->rel = NULL;
}
/* Initialize state variable */
dmstate->num_tuples = -1; /* -1 means not set yet */
/* Get private info created by planner functions. */
dmstate->query = strVal(list_nth(fsplan->fdw_private,
FdwDirectModifyPrivateUpdateSql));
#if (PG_VERSION_NUM >= 150000)
dmstate->has_returning = boolVal(list_nth(fsplan->fdw_private,
FdwDirectModifyPrivateHasReturning));
dmstate->set_processed = boolVal(list_nth(fsplan->fdw_private,
FdwDirectModifyPrivateSetProcessed));
#else
dmstate->has_returning = intVal(list_nth(fsplan->fdw_private,
FdwDirectModifyPrivateHasReturning));
dmstate->set_processed = intVal(list_nth(fsplan->fdw_private,
FdwDirectModifyPrivateSetProcessed));
#endif
dmstate->retrieved_attrs = (List *) list_nth(fsplan->fdw_private,
FdwDirectModifyPrivateRetrievedAttrs);
/* Create context for per-tuple temp workspace. */
dmstate->temp_cxt = AllocSetContextCreate(estate->es_query_cxt,
"sqlite_fdw temporary data",
ALLOCSET_SMALL_SIZES);
/* Initialize the SQLite statement */
dmstate->stmt = NULL;
/* Prepare SQLite statement */
sqlite_prepare_wrapper(dmstate->server, dmstate->conn, dmstate->query, &dmstate->stmt, NULL, true);
/*
* Prepare for processing of parameters used in remote query, if any.
*/
numParams = list_length(fsplan->fdw_exprs);
dmstate->numParams = numParams;
if (numParams > 0)
sqlite_prepare_query_params((PlanState *) node,
fsplan->fdw_exprs,
numParams,
&dmstate->param_flinfo,
&dmstate->param_exprs,
&dmstate->param_values,
&dmstate->param_types);
}
/*
* sqliteIterateDirectModify
* Execute a direct foreign table modification
*/
static TupleTableSlot *
sqliteIterateDirectModify(ForeignScanState *node)
{
SqliteFdwDirectModifyState *dmstate = (SqliteFdwDirectModifyState *) node->fdw_state;
EState *estate = node->ss.ps.state;
TupleTableSlot *slot = node->ss.ss_ScanTupleSlot;
Instrumentation *instr = node->ss.ps.instrument;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
Assert(!dmstate->has_returning);
/*
* If this is the first call after Begin, execute the statement.
*/
if (dmstate->num_tuples == -1)
sqlite_execute_dml_stmt(node);
/* Increment the command es_processed count if necessary. */
if (dmstate->set_processed)
estate->es_processed += dmstate->num_tuples;
/* Increment the tuple count for EXPLAIN ANALYZE if necessary. */
if (instr)
instr->tuplecount += dmstate->num_tuples;
return ExecClearTuple(slot);
}
/*
* sqliteEndDirectModify
* Finish a direct foreign table modification
*/
static void
sqliteEndDirectModify(ForeignScanState *node)
{
SqliteFdwDirectModifyState *dmstate = (SqliteFdwDirectModifyState *) node->fdw_state;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/* if dmstate is NULL, we are in EXPLAIN; nothing to do */
if (dmstate == NULL)
return;
if (dmstate->stmt)
{
dmstate->stmt = NULL;
}
}
/*
* sqliteExplainDirectModify
* Produce extra output for EXPLAIN of a ForeignScan that modifies a
* foreign table directly
*/
static void
sqliteExplainDirectModify(ForeignScanState *node,
struct ExplainState *es)
{
List *fdw_private;
char *sql;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
if (es->verbose)
{
fdw_private = ((ForeignScan *) node->ss.ps.plan)->fdw_private;
sql = strVal(list_nth(fdw_private, FdwDirectModifyPrivateUpdateSql));
ExplainPropertyText("SQLite query", sql, es);
}
}
#if PG_VERSION_NUM >= 140000
/*
* sqliteExecForeignTruncate
* Truncate one or more foreign tables
*/
static void
sqliteExecForeignTruncate(List *rels,
DropBehavior behavior,
bool restart_seqs)
{
Oid serverid = InvalidOid;
sqlite3 *conn = NULL;
StringInfoData sql;
ListCell *lc;
bool server_truncatable = true;
/*
* By default, all sqlite_fdw foreign tables are assumed truncatable. This
* can be overridden by a per-server setting, which in turn can be
* overridden by a per-table setting.
*/
foreach(lc, rels)
{
ForeignServer *server = NULL;
Relation rel = lfirst(lc);
ForeignTable *table = GetForeignTable(RelationGetRelid(rel));
ListCell *cell;
bool truncatable;
/*
* First time through, determine whether the foreign server allows
* truncates. Since all specified foreign tables are assumed to belong
* to the same foreign server, this result can be used for other
* foreign tables.
*/
if (!OidIsValid(serverid))
{
serverid = table->serverid;
server = GetForeignServer(serverid);
foreach(cell, server->options)
{
DefElem *defel = (DefElem *) lfirst(cell);
if (strcmp(defel->defname, "truncatable") == 0)
{
server_truncatable = defGetBoolean(defel);
break;
}
}
}
/*
* Confirm that all specified foreign tables belong to the same
* foreign server.
*/
Assert(table->serverid == serverid);
/* Determine whether this foreign table allows truncations */
truncatable = server_truncatable;
foreach(cell, table->options)
{
DefElem *defel = (DefElem *) lfirst(cell);
if (strcmp(defel->defname, "truncatable") == 0)
{
truncatable = defGetBoolean(defel);
break;
}
}
if (!truncatable)
ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("foreign table \"%s\" does not allow truncates",
RelationGetRelationName(rel))));
}
Assert(OidIsValid(serverid));
/*
* Get connection to the foreign server. Connection manager will
* establish new connection if necessary.
*/
conn = sqlite_get_connection(GetForeignServer(serverid), true);
/*
* TRUNCATE does not support in SQLite, so convert into DELETE FROM to
* delete each table.
*/
initStringInfo(&sql);
sqlite_deparse_truncate(&sql, rels);
/* Issue the DELETE statement without WHERE clause to remote server */
sqlite_do_sql_command(conn, sql.data, ERROR, NULL);
pfree(sql.data);
}
#endif
static void
bindJunkColumnValue(SqliteFdwExecState * fmstate,
TupleTableSlot *slot,
TupleTableSlot *planSlot,
Oid foreignTableId,
int bindnum)
{
int i;
/* Bind where condition using junk column */
for (i = 0; i < slot->tts_tupleDescriptor->natts; ++i)
{
Form_pg_attribute att = TupleDescAttr(slot->tts_tupleDescriptor, i);
AttrNumber attrno = att->attnum;
List *options;
ListCell *option;
/* look for the "key" option on this column */
if (fmstate->junk_idx[i] == InvalidAttrNumber)
continue;
options = GetForeignColumnOptions(foreignTableId, attrno);
foreach(option, options)
{
DefElem *def = (DefElem *) lfirst(option);
bool is_null = false;
if (IS_KEY_COLUMN(def))
{
Datum value;
/* Get the id that was passed up as a resjunk column */
value = ExecGetJunkAttribute(planSlot, fmstate->junk_idx[i], &is_null);
/* Bind qual */
sqlite_bind_sql_var(att, bindnum, value, fmstate->stmt, &is_null, foreignTableId);
bindnum++;
}
}
}
}
/*
* sqliteExecForeignUpdate
* Update one row in a foreign table
*/
static TupleTableSlot *
sqliteExecForeignUpdate(EState *estate,
ResultRelInfo *resultRelInfo,
TupleTableSlot *slot,
TupleTableSlot *planSlot)
{
SqliteFdwExecState *fmstate = (SqliteFdwExecState *) resultRelInfo->ri_FdwState;
Relation rel = resultRelInfo->ri_RelationDesc;
Oid foreignTableId = RelationGetRelid(rel);
ListCell *lc = NULL;
int bindnum = 0;
int i = 0;
int rc = 0;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/* Bind the values */
foreach(lc, fmstate->retrieved_attrs)
{
int attnum = lfirst_int(lc);
bool is_null;
Datum value = 0;
Form_pg_attribute bind_att = NULL;
#if PG_VERSION_NUM >= 140000
TupleDesc tupdesc = RelationGetDescr(fmstate->rel);
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1);
/* Ignore generated columns and skip bind value */
if (attr->attgenerated)
continue;
#endif
/* first attribute cannot be in target list attribute */
bind_att = TupleDescAttr(slot->tts_tupleDescriptor, attnum - 1);
value = slot_getattr(slot, attnum, &is_null);
sqlite_bind_sql_var(bind_att, bindnum, value, fmstate->stmt, &is_null, foreignTableId);
bindnum++;
i++;
}
bindJunkColumnValue(fmstate, slot, planSlot, foreignTableId, bindnum);
/* Execute the query */
rc = sqlite3_step(fmstate->stmt);
if (rc != SQLITE_DONE)
{
sqlitefdw_report_error(ERROR, fmstate->stmt, fmstate->conn, NULL, rc);
}
sqlite3_reset(fmstate->stmt);
/* Return NULL if nothing was updated on the remote end */
return slot;
}
static TupleTableSlot *
sqliteExecForeignDelete(EState *estate,
ResultRelInfo *resultRelInfo,
TupleTableSlot *slot,
TupleTableSlot *planSlot)
{
SqliteFdwExecState *fmstate = (SqliteFdwExecState *) resultRelInfo->ri_FdwState;
Relation rel = resultRelInfo->ri_RelationDesc;
Oid foreignTableId = RelationGetRelid(rel);
int rc = 0;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
bindJunkColumnValue(fmstate, slot, planSlot, foreignTableId, 0);
/* Execute the query */
rc = sqlite3_step(fmstate->stmt);
if (rc != SQLITE_DONE)
{
sqlitefdw_report_error(ERROR, fmstate->stmt, fmstate->conn, NULL, rc);
}
sqlite3_reset(fmstate->stmt);
/* Return NULL if nothing was updated on the remote end */
return slot;
}
static void
sqliteEndForeignModify(EState *estate,
ResultRelInfo *resultRelInfo)
{
SqliteFdwExecState *fmstate = (SqliteFdwExecState *) resultRelInfo->ri_FdwState;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
if (fmstate && fmstate->stmt)
{
fmstate->stmt = NULL;
}
}
static void
sqliteExplainForeignScan(ForeignScanState *node,
struct ExplainState *es)
{
ForeignScan *plan = castNode(ForeignScan, node->ss.ps.plan);
List *fdw_private = plan->fdw_private;
char *sql = strVal(list_nth(fdw_private, FdwScanPrivateSelectSql));
elog(DEBUG1, "sqlite_fdw : %s", __func__);
if (es->verbose)
{
ExplainPropertyText("SQLite query", sql, es);
}
}
static void
sqliteExplainForeignModify(ModifyTableState *mtstate,
ResultRelInfo *rinfo,
List *fdw_private,
int subplan_index,
struct ExplainState *es)
{
elog(DEBUG1, "sqlite_fdw : %s", __func__);
#if PG_VERSION_NUM >= 140000
if (es->verbose)
{
/*
* For INSERT we should always have batch size >= 1, but UPDATE and
* DELETE don't support batching so don't show the property.
*/
if (rinfo->ri_BatchSize > 0)
ExplainPropertyInteger("Batch Size", NULL, rinfo->ri_BatchSize, es);
}
#endif
}
static bool
sqliteAnalyzeForeignTable(Relation relation,
AcquireSampleRowsFunc *func,
BlockNumber *totalpages)
{
elog(DEBUG1, "sqlite_fdw : %s", __func__);
return false;
}
/*
* Import a foreign schema
*/
static List *
sqliteImportForeignSchema(ImportForeignSchemaStmt *stmt,
Oid serverOid)
{
sqlite3 *volatile db = NULL;
sqlite3_stmt *volatile sql_stmt = NULL;
sqlite3_stmt *volatile pragma_stmt = NULL;
ForeignServer *server;
ListCell *lc;
StringInfoData buf;
List *commands = NIL;
bool import_default = false;
bool import_not_null = true;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/* Parse statement options */
foreach(lc, stmt->options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "import_default") == 0)
import_default = defGetBoolean(def);
else if (strcmp(def->defname, "import_not_null") == 0)
import_not_null = defGetBoolean(def);
else
ereport(ERROR,
(errcode(ERRCODE_FDW_INVALID_OPTION_NAME),
errmsg("invalid option \"%s\"", def->defname)));
}
server = GetForeignServerByName(stmt->server_name, false);
db = sqlite_get_connection(server, false);
PG_TRY();
{
/* You want all tables, except system tables */
initStringInfo(&buf);
appendStringInfo(&buf, "SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%%'");
/* Apply restrictions for LIMIT TO and EXCEPT */
if (stmt->list_type == FDW_IMPORT_SCHEMA_LIMIT_TO ||
stmt->list_type == FDW_IMPORT_SCHEMA_EXCEPT)
{
bool first_item = true;
appendStringInfoString(&buf, " AND name ");
if (stmt->list_type == FDW_IMPORT_SCHEMA_EXCEPT)
appendStringInfoString(&buf, "NOT ");
appendStringInfoString(&buf, "IN (");
foreach(lc, stmt->table_list)
{
RangeVar *rv = (RangeVar *) lfirst(lc);
if (first_item)
first_item = false;
else
appendStringInfoString(&buf, ", ");
appendStringInfoString(&buf, quote_literal_cstr(rv->relname));
}
appendStringInfoChar(&buf, ')');
}
sqlite_prepare_wrapper(server, db, buf.data, (sqlite3_stmt * *) & sql_stmt, NULL, false);
/* Scan all rows for this table */
for (;;)
{
char *table;
char *query;
bool first_item = true;
int rc = sqlite3_step(sql_stmt);
if (rc == SQLITE_DONE)
break;
else if (rc != SQLITE_ROW)
{
/*
* Not pass sql_stmt to sqlitefdw_report_error because it is
* finalized in PG_CATCH
*/
sqlitefdw_report_error(ERROR, NULL, db, sqlite3_sql(sql_stmt), rc);
}
table = (char *) sqlite3_column_text(sql_stmt, 0);
resetStringInfo(&buf);
appendStringInfo(&buf, "CREATE FOREIGN TABLE %s.%s (\n",
quote_identifier(stmt->local_schema), quote_identifier(table));
query = palloc0(strlen(table) + 30);
sprintf(query, "PRAGMA table_info(%s)", quote_identifier(table));
sqlite_prepare_wrapper(server, db, query, (sqlite3_stmt * *) & pragma_stmt, NULL, false);
for (;;)
{
char *col_name;
char *type_name;
bool not_null;
char *default_val;
int primary_key;
rc = sqlite3_step(pragma_stmt);
if (rc == SQLITE_DONE)
break;
else if (rc != SQLITE_ROW)
{
/* Not pass sql_stmt because it is finalized in PG_CATCH */
sqlitefdw_report_error(ERROR, NULL, db, sqlite3_sql(pragma_stmt), rc);
}
col_name = (char *) sqlite3_column_text(pragma_stmt, 1);
type_name = (char *) sqlite3_column_text(pragma_stmt, 2);
not_null = (sqlite3_column_int(pragma_stmt, 3) == 1);
default_val = (char *) sqlite3_column_text(pragma_stmt, 4);
primary_key = sqlite3_column_int(pragma_stmt, 5);
if (first_item)
first_item = false;
else
appendStringInfoString(&buf, ",\n");
appendStringInfo(&buf, "%s ", quote_identifier(col_name));
sqlite_to_pg_type(&buf, type_name);
/* part of the primary key */
if (primary_key)
appendStringInfo(&buf, " OPTIONS (key 'true')");
if (not_null && import_not_null)
appendStringInfo(&buf, " NOT NULL");
if (default_val && import_default)
appendStringInfo(&buf, " DEFAULT %s", default_val);
}
sqlite3_finalize(pragma_stmt);
pragma_stmt = NULL;
appendStringInfo(&buf, "\n) SERVER %s\nOPTIONS (table ",
quote_identifier(stmt->server_name));
sqlite_deparse_string_literal(&buf, table);
appendStringInfoString(&buf, ");");
commands = lappend(commands, pstrdup(buf.data));
elog(DEBUG1, "sqlite_fdw : %s %s", __func__, pstrdup(buf.data));
}
}
PG_CATCH();
{
if (sql_stmt)
sqlite3_finalize(sql_stmt);
if (pragma_stmt)
sqlite3_finalize(pragma_stmt);
PG_RE_THROW();
}
PG_END_TRY();
if (sql_stmt)
sqlite3_finalize(sql_stmt);
if (pragma_stmt)
sqlite3_finalize(pragma_stmt);
return commands;
}
#if PG_VERSION_NUM >= 170000
/*
* Check if reltarget is safe enough to push down semi-join. Reltarget is not
* safe, if it contains references to inner rel relids, which do not belong to
* outer rel.
*/
static bool
sqlite_semijoin_target_ok(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel)
{
List *vars;
ListCell *lc;
bool ok = true;
Assert(joinrel->reltarget);
vars = pull_var_clause((Node *)joinrel->reltarget->exprs, PVC_INCLUDE_PLACEHOLDERS);
foreach (lc, vars)
{
Var *var = (Var *)lfirst(lc);
if (!IsA(var, Var))
continue;
if (bms_is_member(var->varno, innerrel->relids) &&
!bms_is_member(var->varno, outerrel->relids))
{
/*
* The planner can create semi-join, which refers to inner rel
* vars in its target list. However, we deparse semi-join as an
* exists() subquery, so can't handle references to inner rel in
* the target list.
*/
ok = false;
break;
}
}
return ok;
}
#endif
/*
* Assess whether the join between inner and outer relations can be pushed
* down to the foreign server. As a side effect, save information we obtain
* in this function to SqliteFdwRelationInfo passed in.
*/
static bool
sqlite_foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype,
RelOptInfo *outerrel, RelOptInfo *innerrel,
JoinPathExtraData *extra)
{
SqliteFdwRelationInfo *fpinfo;
SqliteFdwRelationInfo *fpinfo_o;
SqliteFdwRelationInfo *fpinfo_i;
ListCell *lc;
List *joinclauses;
#if PG_VERSION_NUM >= 170000
/*
* We support pushing down INNER, LEFT and SEMI joins.
* Constructing queries representing ANTI joins is hard, hence not
* considered right now.
*/
if (jointype != JOIN_INNER && jointype != JOIN_LEFT &&
jointype != JOIN_SEMI)
return false;
/*
* We can't push down semi-join if its reltarget is not safe
*/
if ((jointype == JOIN_SEMI) && !sqlite_semijoin_target_ok(root, joinrel, outerrel, innerrel))
return false;
#else
/*
* We support pushing down INNER and LEFT joins. Constructing queries
* representing SEMI and ANTI joins is hard, hence not considered right
* now.
*/
if (jointype != JOIN_INNER && jointype != JOIN_LEFT)
return false;
#endif
/*
* If either of the joining relations is marked as unsafe to pushdown, the
* join can not be pushed down.
*/
fpinfo = (SqliteFdwRelationInfo *) joinrel->fdw_private;
fpinfo_o = (SqliteFdwRelationInfo *) outerrel->fdw_private;
fpinfo_i = (SqliteFdwRelationInfo *) innerrel->fdw_private;
if (!fpinfo_o || !fpinfo_o->pushdown_safe ||
!fpinfo_i || !fpinfo_i->pushdown_safe)
return false;
/*
* If joining relations have local conditions, those conditions are
* required to be applied before joining the relations. Hence the join can
* not be pushed down.
*/
if (fpinfo_o->local_conds || fpinfo_i->local_conds)
return false;
/*
* Merge FDW options. We might be tempted to do this after we have deemed
* the foreign join to be OK. But we must do this beforehand so that we
* know which quals can be evaluated on the foreign server, which might
* depend on shippable_extensions.
*/
fpinfo->server = fpinfo_o->server;
sqlite_merge_fdw_options(fpinfo, fpinfo_o, fpinfo_i);
/*
* Separate restrict list into join quals and pushed-down (other) quals.
*
* Join quals belonging to an outer join must all be shippable, else we
* cannot execute the join remotely. Add such quals to 'joinclauses'.
*
* Add other quals to fpinfo->remote_conds if they are shippable, else to
* fpinfo->local_conds. In an inner join it's okay to execute conditions
* either locally or remotely; the same is true for pushed-down conditions
* at an outer join.
*
* Note we might return failure after having already scribbled on
* fpinfo->remote_conds and fpinfo->local_conds. That's okay because we
* won't consult those lists again if we deem the join unshippable.
*/
joinclauses = NIL;
foreach(lc, extra->restrictlist)
{
RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
bool is_remote_clause = sqlite_is_foreign_expr(root, joinrel,
rinfo->clause);
if (IS_OUTER_JOIN(jointype) &&
!RINFO_IS_PUSHED_DOWN(rinfo, joinrel->relids))
{
if (!is_remote_clause)
return false;
joinclauses = lappend(joinclauses, rinfo);
}
else
{
if (is_remote_clause)
fpinfo->remote_conds = lappend(fpinfo->remote_conds, rinfo);
else
fpinfo->local_conds = lappend(fpinfo->local_conds, rinfo);
}
}
/*
* sqlite_deparse_explicit_target_list() isn't smart enough to handle
* anything other than a Var. In particular, if there's some
* PlaceHolderVar that would need to be evaluated within this join tree
* (because there's an upper reference to a quantity that may go to NULL
* as a result of an outer join), then we can't try to push the join down
* because we'll fail when we get to
* sqlite_deparse_explicit_target_list(). However, a PlaceHolderVar that
* needs to be evaluated *at the top* of this join tree is OK, because we
* can do that locally after fetching the results from the remote side.
*/
foreach(lc, root->placeholder_list)
{
PlaceHolderInfo *phinfo = lfirst(lc);
Relids relids;
#if (PG_VERSION_NUM >= 100000)
/* PlaceHolderInfo refers to parent relids, not child relids. */
relids = IS_OTHER_REL(joinrel) ?
joinrel->top_parent_relids : joinrel->relids;
#else
relids = joinrel->relids;
#endif
if (bms_is_subset(phinfo->ph_eval_at, relids) &&
bms_nonempty_difference(relids, phinfo->ph_eval_at))
return false;
}
/* Save the join clauses, for later use. */
fpinfo->joinclauses = joinclauses;
fpinfo->outerrel = outerrel;
fpinfo->innerrel = innerrel;
fpinfo->jointype = jointype;
/*
* By default, both the input relations are not required to be deparsed as
* subqueries, but there might be some relations covered by the input
* relations that are required to be deparsed as subqueries, so save the
* relids of those relations for later use by the deparser.
*/
fpinfo->make_outerrel_subquery = false;
fpinfo->make_innerrel_subquery = false;
Assert(bms_is_subset(fpinfo_o->lower_subquery_rels, outerrel->relids));
Assert(bms_is_subset(fpinfo_i->lower_subquery_rels, innerrel->relids));
fpinfo->lower_subquery_rels = bms_union(fpinfo_o->lower_subquery_rels,
fpinfo_i->lower_subquery_rels);
#if PG_VERSION_NUM >= 170000
fpinfo->hidden_subquery_rels = bms_union(fpinfo_o->hidden_subquery_rels,
fpinfo_i->hidden_subquery_rels);
#endif
/*
* Pull the other remote conditions from the joining relations into join
* clauses or other remote clauses (remote_conds) of this relation
* wherever possible. This avoids building subqueries at every join step.
*
* For an inner join, clauses from both the relations are added to the
* other remote clauses. For LEFT and RIGHT OUTER join, the clauses from
* the outer side are added to remote_conds since those can be evaluated
* after the join is evaluated. The clauses from inner side are added to
* the joinclauses, since they need to be evaluated while constructing the
* join.
*
* For SEMI-JOIN clauses from inner relation can not be added to
* remote_conds, but should be treated as join clauses (as they are
* deparsed to EXISTS subquery, where inner relation can be referred). A
* list of relation ids, which can't be referred to from higher levels, is
* preserved as a hidden_subquery_rels list.
*
* For a FULL OUTER JOIN, the other clauses from either relation can not
* be added to the joinclauses or remote_conds, since each relation acts
* as an outer relation for the other.
*
* The joining sides can not have local conditions, thus no need to test
* shippability of the clauses being pulled up.
*/
switch (jointype)
{
case JOIN_INNER:
fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
fpinfo_i->remote_conds);
fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
fpinfo_o->remote_conds);
break;
case JOIN_LEFT:
fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
fpinfo_i->remote_conds);
fpinfo->remote_conds = list_concat(fpinfo->remote_conds,
fpinfo_o->remote_conds);
break;
#if PG_VERSION_NUM >= 170000
case JOIN_SEMI:
fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
fpinfo_i->remote_conds);
fpinfo->joinclauses = list_concat(fpinfo->joinclauses,
fpinfo->remote_conds);
fpinfo->remote_conds = list_copy(fpinfo_o->remote_conds);
fpinfo->hidden_subquery_rels = bms_union(fpinfo->hidden_subquery_rels,
innerrel->relids);
break;
#endif
default:
/* Should not happen, we have just checked this above */
elog(ERROR, "unsupported join type %d", jointype);
}
/*
* For an inner join, all restrictions can be treated alike. Treating the
* pushed down conditions as join conditions allows a top level full outer
* join to be deparsed without requiring subqueries.
*/
if (jointype == JOIN_INNER)
{
Assert(!fpinfo->joinclauses);
fpinfo->joinclauses = fpinfo->remote_conds;
fpinfo->remote_conds = NIL;
}
#if PG_VERSION_NUM >= 170000
else if (jointype == JOIN_LEFT || jointype == JOIN_RIGHT || jointype == JOIN_FULL)
{
/*
* Conditions, generated from semi-joins, should be evaluated before
* LEFT/RIGHT/FULL join.
*/
if (!bms_is_empty(fpinfo_o->hidden_subquery_rels))
{
fpinfo->make_outerrel_subquery = true;
fpinfo->lower_subquery_rels = bms_add_members(fpinfo->lower_subquery_rels, outerrel->relids);
}
if (!bms_is_empty(fpinfo_i->hidden_subquery_rels))
{
fpinfo->make_innerrel_subquery = true;
fpinfo->lower_subquery_rels = bms_add_members(fpinfo->lower_subquery_rels, innerrel->relids);
}
}
#endif
/* Mark that this join can be pushed down safely */
fpinfo->pushdown_safe = true;
/*
* Set # of retrieved rows and cached relation costs to some negative
* value, so that we can detect when they are set to some sensible values,
* during one (usually the first) of the calls to
* sqlite_estimate_path_cost_size.
*/
fpinfo->retrieved_rows = -1;
fpinfo->rel_startup_cost = -1;
fpinfo->rel_total_cost = -1;
/*
* Set the string describing this join relation to be used in EXPLAIN
* output of corresponding ForeignScan. Note that the decoration we add
* to the base relation names mustn't include any digits, or it'll confuse
* sqliteExplainForeignScan.
*/
fpinfo->relation_name = psprintf("(%s) %s JOIN (%s)",
fpinfo_o->relation_name,
sqlite_get_jointype_name(fpinfo->jointype),
fpinfo_i->relation_name);
/*
* Set the relation index. This is defined as the position of this
* joinrel in the join_rel_list list plus the length of the rtable list.
* Note that since this joinrel is at the end of the join_rel_list list
* when we are called, we can get the position by list_length.
*/
Assert(fpinfo->relation_index == 0); /* shouldn't be set yet */
fpinfo->relation_index =
list_length(root->parse->rtable) + list_length(root->join_rel_list);
return true;
}
/*
* Adjust the cost estimates of a foreign grouping path to include the cost
* of generating properly-sorted output.
*/
static void
sqlite_adjust_foreign_grouping_path_cost(PlannerInfo *root,
List *pathkeys,
double retrieved_rows,
double width,
double limit_tuples,
Cost *p_startup_cost,
Cost *p_run_cost)
{
/*
* If the GROUP BY clause isn't sort-able, the plan chosen by the remote
* side is unlikely to generate properly-sorted output, so it would need
* an explicit sort; adjust the given costs with cost_sort(). Likewise,
* if the GROUP BY clause is sort-able but isn't a superset of the given
* pathkeys, adjust the costs with that function. Otherwise, adjust the
* costs by applying the same heuristic as for the scan or join case.
*/
#if PG_VERSION_NUM >= 160000
if (!grouping_is_sortable(root->processed_groupClause) ||
!pathkeys_contained_in(pathkeys, root->group_pathkeys))
#else
if (!grouping_is_sortable(root->parse->groupClause) ||
!pathkeys_contained_in(pathkeys, root->group_pathkeys))
#endif
{
Path sort_path; /* dummy for result of cost_sort */
cost_sort(&sort_path,
root,
pathkeys,
*p_startup_cost + *p_run_cost,
retrieved_rows,
width,
0.0,
work_mem,
limit_tuples);
*p_startup_cost = sort_path.startup_cost;
*p_run_cost = sort_path.total_cost - sort_path.startup_cost;
}
else
{
/*
* The default extra cost seems too large for foreign-grouping cases;
* add 1/4th of that default.
*/
double sort_multiplier = 1.0 + (DEFAULT_FDW_SORT_MULTIPLIER
- 1.0) * 0.25;
*p_startup_cost *= sort_multiplier;
*p_run_cost *= sort_multiplier;
}
}
/*
* sqliteGetForeignJoinPaths Add possible ForeignPath to joinrel, if
* join is safe to push down.
*/
static void
sqliteGetForeignJoinPaths(PlannerInfo *root,
RelOptInfo *joinrel,
RelOptInfo *outerrel,
RelOptInfo *innerrel,
JoinType jointype,
JoinPathExtraData *extra)
{
SqliteFdwRelationInfo *fpinfo;
ForeignPath *joinpath;
double rows;
int width;
Cost startup_cost;
Cost total_cost;
Path *epq_path; /* Path to create plan to be executed when
* EvalPlanQual gets triggered. */
/*
* Skip if this join combination has been considered already.
*/
if (joinrel->fdw_private)
return;
/*
* This code does not work for joins with lateral references, since those
* must have parameterized paths, which we don't generate yet.
*/
if (!bms_is_empty(joinrel->lateral_relids))
return;
/*
* Create unfinished SqliteFdwRelationInfo entry which is used to indicate
* that the join relation is already considered, so that we won't waste
* time in judging safety of join pushdown and adding the same paths again
* if found safe. Once we know that this join can be pushed down, we fill
* the entry.
*/
fpinfo = (SqliteFdwRelationInfo *) palloc0(sizeof(SqliteFdwRelationInfo));
fpinfo->pushdown_safe = false;
joinrel->fdw_private = fpinfo;
/* attrs_used is only for base relations. */
fpinfo->attrs_used = NULL;
/*
* If there is a possibility that EvalPlanQual will be executed, we need
* to be able to reconstruct the row using scans of the base relations.
* GetExistingLocalJoinPath will find a suitable path for this purpose in
* the path list of the joinrel, if one exists. We must be careful to
* call it before adding any ForeignPath, since the ForeignPath might
* dominate the only suitable local path available. We also do it before
* calling sqlite_foreign_join_ok(), since that function updates fpinfo
* and marks it as pushable if the join is found to be pushable.
*/
if (root->parse->commandType == CMD_DELETE ||
root->parse->commandType == CMD_UPDATE ||
root->rowMarks)
{
epq_path = GetExistingLocalJoinPath(joinrel);
if (!epq_path)
{
elog(DEBUG1, "could not push down foreign join because a local path suitable for EPQ checks was not found");
return;
}
}
else
epq_path = NULL;
if (!sqlite_foreign_join_ok(root, joinrel, jointype, outerrel, innerrel, extra))
{
/*
* Free path required for EPQ if we copied one; we don't need it now
*/
if (epq_path)
pfree(epq_path);
return;
}
/*
* Compute the selectivity and cost of the local_conds, so we don't have
* to do it over again for each path. The best we can do for these
* conditions is to estimate selectivity on the basis of local statistics.
* The local conditions are applied after the join has been computed on
* the remote side like quals in WHERE clause, so pass jointype as
* JOIN_INNER.
*/
fpinfo->local_conds_sel = clauselist_selectivity(root,
fpinfo->local_conds,
0,
JOIN_INNER,
NULL);
cost_qual_eval(&fpinfo->local_conds_cost, fpinfo->local_conds, root);
/*
* If we are going to estimate costs locally, estimate the join clause
* selectivity here while we have special join info.
*/
fpinfo->joinclause_sel = clauselist_selectivity(root, fpinfo->joinclauses,
0, fpinfo->jointype,
extra->sjinfo);
/* Estimate costs for bare join relation */
sqlite_estimate_path_cost_size(root, joinrel, NIL, NIL, NULL,
&rows, &width, &startup_cost, &total_cost);
/* Now update this information in the joinrel */
joinrel->rows = rows;
joinrel->reltarget->width = width;
fpinfo->rows = rows;
fpinfo->width = width;
fpinfo->startup_cost = startup_cost;
fpinfo->total_cost = total_cost;
/*
* Create a new join path and add it to the joinrel which represents a
* join between foreign tables.
*/
#if PG_VERSION_NUM >= 120000
joinpath = create_foreign_join_path(root,
#else
joinpath = create_foreignscan_path(root,
#endif
joinrel,
NULL, /* default pathtarget */
rows,
startup_cost,
total_cost,
NIL, /* no pathkeys */
joinrel->lateral_relids,
epq_path,
#if PG_VERSION_NUM >= 170000
extra->restrictlist,
#endif
NIL); /* no fdw_private */
/* Add generated path into joinrel by add_path(). */
add_path(joinrel, (Path *) joinpath);
/* Consider pathkeys for the join relation */
sqlite_add_paths_with_pathkeys_for_rel(root, joinrel, NULL, epq_path
#if PG_VERSION_NUM >= 170000
, extra->restrictlist
#endif
);
}
static void
sqlite_merge_fdw_options(SqliteFdwRelationInfo * fpinfo,
const SqliteFdwRelationInfo * fpinfo_o,
const SqliteFdwRelationInfo * fpinfo_i)
{
/* We must always have fpinfo_o. */
Assert(fpinfo_o);
/* fpinfo_i may be NULL, but if present the servers must both match. */
Assert(!fpinfo_i ||
fpinfo_i->server->serverid == fpinfo_o->server->serverid);
/*
* Copy the server specific FDW options. (For a join, both relations come
* from the same server, so the server options should have the same value
* for both relations.)
*/
fpinfo->fdw_startup_cost = fpinfo_o->fdw_startup_cost;
fpinfo->fdw_tuple_cost = fpinfo_o->fdw_tuple_cost;
fpinfo->fetch_size = fpinfo_o->fetch_size;
/* Merge the table level options from either side of the join. */
if (fpinfo_i)
{
/*
* Set fetch size to maximum of the joining sides, since we are
* expecting the rows returned by the join to be proportional to the
* relation sizes.
*/
fpinfo->fetch_size = Max(fpinfo_o->fetch_size, fpinfo_i->fetch_size);
}
}
/*
* Assess whether the aggregation, grouping and having operations can be pushed
* down to the foreign server. As a side effect, save information we obtain in
* this function to SqliteFdwRelationInfo of the input relation.
*/
static bool
sqlite_foreign_grouping_ok(PlannerInfo *root, RelOptInfo *grouped_rel)
{
Query *query = root->parse;
PathTarget *grouping_target;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) grouped_rel->fdw_private;
SqliteFdwRelationInfo *ofpinfo;
ListCell *lc;
int i;
List *tlist = NIL;
#if PG_VERSION_NUM < 110000
grouping_target = root->upper_targets[UPPERREL_GROUP_AGG];
#else
grouping_target = grouped_rel->reltarget;
#endif
/* Grouping Sets are not pushable */
if (query->groupingSets)
return false;
#if (PG_VERSION_NUM < 100000)
if (root->query_level > 1)
{
if (root->all_baserels != NULL)
{
Query *query = root->parent_root->parse;
int rtindex = bms_next_member(root->all_baserels, -1);
if (rtindex != -2 && list_length(query->rtable) >= rtindex &&
getrelid(rtindex, query->rtable) == 0)
return false;
}
}
#endif
/* Get the fpinfo of the underlying scan relation. */
ofpinfo = (SqliteFdwRelationInfo *) fpinfo->outerrel->fdw_private;
/*
* If underneath input relation has any local conditions, those conditions
* are required to be applied before performing aggregation. Hence the
* aggregate cannot be pushed down.
*/
if (ofpinfo->local_conds)
return false;
i = 0;
foreach(lc, grouping_target->exprs)
{
Expr *expr = (Expr *) lfirst(lc);
Index sgref = get_pathtarget_sortgroupref(grouping_target, i);
ListCell *l;
/*
* Check whether this expression is part of GROUP BY clause. Note we
* check the whole GROUP BY clause not just processed_groupClause,
* because we will ship all of it, cf. appendGroupByClause.
*/
if (sgref && get_sortgroupref_clause_noerr(sgref, query->groupClause))
{
TargetEntry *tle;
/*
* If any of the GROUP BY expression is not shippable we can not
* push down aggregation to the foreign server.
*/
if (!sqlite_is_foreign_expr(root, grouped_rel, expr))
return false;
/*
* If it would be a foreign param, we can't put it into the tlist,
* so we have to fail.
*/
if (sqlite_is_foreign_param(root, grouped_rel, expr))
return false;
/*
* Pushable, so add to tlist. We need to create a TLE for this
* expression and apply the sortgroupref to it. We cannot use
* add_to_flat_tlist() here because that avoids making duplicate
* entries in the tlist. If there are duplicate entries with
* distinct sortgrouprefs, we have to duplicate that situation in
* the output tlist.
*/
tle = makeTargetEntry(expr, list_length(tlist) + 1, NULL, false);
tle->ressortgroupref = sgref;
tlist = lappend(tlist, tle);
}
else
{
/* Check entire expression whether it is pushable or not */
if (sqlite_is_foreign_expr(root, grouped_rel, expr) &&
!sqlite_is_foreign_param(root, grouped_rel, expr))
{
/* Pushable, add to tlist */
tlist = add_to_flat_tlist(tlist, list_make1(expr));
}
else
{
List *aggvars = NIL;
/* Not matched exactly, pull the var with aggregates then */
aggvars = pull_var_clause((Node *) expr,
PVC_INCLUDE_AGGREGATES);
if (!sqlite_is_foreign_expr(root, grouped_rel, (Expr *) aggvars))
return false;
/*
* Add aggregates, if any, into the targetlist. Plain var
* nodes should be either same as some GROUP BY expression or
* part of some GROUP BY expression. In later case, the query
* cannot refer plain var nodes without the surrounding
* expression. In both the cases, they are already part of
* the targetlist and thus no need to add them again. In fact
* adding pulled plain var nodes in SELECT clause will cause
* an error on the foreign server if they are not same as some
* GROUP BY expression.
*/
foreach(l, aggvars)
{
Expr *aggref = (Expr *) lfirst(l);
if (IsA(aggref, Aggref))
tlist = add_to_flat_tlist(tlist, list_make1(aggref));
}
}
}
i++;
}
/*
* Classify the pushable and non-pushable having clauses and save them in
* remote_conds and local_conds of the grouped rel's fpinfo.
*/
if (root->hasHavingQual && query->havingQual)
{
foreach(lc, (List *) query->havingQual)
{
Expr *expr = (Expr *) lfirst(lc);
RestrictInfo *rinfo;
/*
* Currently, the core code doesn't wrap havingQuals in
* RestrictInfos, so we must make our own.
*/
Assert(!IsA(expr, RestrictInfo));
#if (PG_VERSION_NUM >= 100000)
rinfo = make_restrictinfo(
#if PG_VERSION_NUM >= 140000
root,
#endif
expr,
true,
false,
false,
#if (PG_VERSION_NUM >= 160000)
false,
#endif
root->qual_security_level,
grouped_rel->relids,
NULL,
NULL);
#else
rinfo = make_simple_restrictinfo(expr);
#endif
if (sqlite_is_foreign_expr(root, grouped_rel, expr))
fpinfo->remote_conds = lappend(fpinfo->remote_conds, rinfo);
else
fpinfo->local_conds = lappend(fpinfo->local_conds, rinfo);
}
}
/*
* If there are any local conditions, pull Vars and aggregates from it and
* check whether they are safe to pushdown or not.
*/
if (fpinfo->local_conds)
{
List *aggvars = NIL;
foreach(lc, fpinfo->local_conds)
{
RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
aggvars = list_concat(aggvars,
pull_var_clause((Node *) rinfo->clause,
PVC_INCLUDE_AGGREGATES));
}
foreach(lc, aggvars)
{
Expr *expr = (Expr *) lfirst(lc);
/*
* If aggregates within local conditions are not safe to push
* down, then we cannot push down the query. Vars are already
* part of GROUP BY clause which are checked above, so no need to
* access them again here.
*/
if (IsA(expr, Aggref))
{
if (!sqlite_is_foreign_expr(root, grouped_rel, expr))
return false;
tlist = add_to_flat_tlist(tlist, list_make1(expr));
}
}
}
/* Store generated targetlist */
fpinfo->grouped_tlist = tlist;
/* Safe to pushdown */
fpinfo->pushdown_safe = true;
/* Copy startup and tuple cost as is from underneath input rel's fpinfo */
fpinfo->fdw_startup_cost = ofpinfo->fdw_startup_cost;
fpinfo->fdw_tuple_cost = ofpinfo->fdw_tuple_cost;
/*
* Set cached relation costs to some negative value, so that we can detect
* when they are set to some sensible costs, during one (usually the
* first) of the calls to sqlite_estimate_path_cost_size().
*/
fpinfo->rel_startup_cost = -1;
fpinfo->rel_total_cost = -1;
/*
* Set the string describing this grouped relation to be used in EXPLAIN
* output of corresponding ForeignScan.
*/
fpinfo->relation_name = NULL;
return true;
}
/*
* sqliteGetForeignUpperPaths
* Add paths for post-join operations like aggregation, grouping etc. if
* corresponding operations are safe to push down.
*
* Right now, we only support aggregate, grouping and having clause pushdown.
*/
static void
sqliteGetForeignUpperPaths(PlannerInfo *root, UpperRelationKind stage,
RelOptInfo *input_rel, RelOptInfo *output_rel
#if (PG_VERSION_NUM >= 110000)
,void *extra
#endif
)
{
SqliteFdwRelationInfo *fpinfo;
elog(DEBUG1, "sqlite_fdw : %s", __func__);
/*
* If input rel is not safe to pushdown, then simply return as we cannot
* perform any post-join operations on the foreign server.
*/
if (!input_rel->fdw_private ||
!((SqliteFdwRelationInfo *) input_rel->fdw_private)->pushdown_safe)
return;
/* Ignore stages we don't support; and skip any duplicate calls. */
if ((stage != UPPERREL_GROUP_AGG && stage != UPPERREL_ORDERED && stage != UPPERREL_FINAL) || output_rel->fdw_private)
return;
fpinfo = (SqliteFdwRelationInfo *) palloc0(sizeof(SqliteFdwRelationInfo));
fpinfo->pushdown_safe = false;
fpinfo->stage = stage;
output_rel->fdw_private = fpinfo;
switch (stage)
{
case UPPERREL_GROUP_AGG:
sqlite_add_foreign_grouping_paths(root, input_rel, output_rel
#if (PG_VERSION_NUM >= 110000)
,(GroupPathExtraData *) extra
#endif
);
break;
case UPPERREL_ORDERED:
sqlite_add_foreign_ordered_paths(root, input_rel, output_rel);
break;
case UPPERREL_FINAL:
sqlite_add_foreign_final_paths(root, input_rel, output_rel
#if (PG_VERSION_NUM >= 120000)
,(FinalPathExtraData *) extra
#endif
);
break;
default:
elog(ERROR, "unexpected upper relation: %d", (int) stage);
break;
}
}
/*
* sqlite_add_foreign_grouping_paths
* Add foreign path for grouping and/or aggregation.
*
* Given input_rel represents the underlying scan. The paths are added to the
* given grouped_rel.
*/
static void
sqlite_add_foreign_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel,
RelOptInfo *grouped_rel
#if (PG_VERSION_NUM >= 110000)
,GroupPathExtraData *extra
#endif
)
{
Query *parse = root->parse;
SqliteFdwRelationInfo *ifpinfo = input_rel->fdw_private;
SqliteFdwRelationInfo *fpinfo = grouped_rel->fdw_private;
ForeignPath *grouppath;
double rows;
int width;
Cost startup_cost;
Cost total_cost;
/* Nothing to be done, if there is no grouping or aggregation required. */
if (!parse->groupClause && !parse->groupingSets && !parse->hasAggs &&
!root->hasHavingQual)
return;
#if (PG_VERSION_NUM >= 110000)
Assert(extra->patype == PARTITIONWISE_AGGREGATE_NONE ||
extra->patype == PARTITIONWISE_AGGREGATE_FULL);
#endif
/* SQLite does not allow HAVING without GROUP BY */
if (root->hasHavingQual && !parse->groupClause)
return;
/* save the input_rel as outerrel in fpinfo */
fpinfo->outerrel = input_rel;
/*
* Copy foreign table, foreign server
* etc. details from the input relation's fpinfo.
*/
fpinfo->table = ifpinfo->table;
fpinfo->server = ifpinfo->server;
/* Assess if it is safe to push down aggregation and grouping. */
if (!sqlite_foreign_grouping_ok(root, grouped_rel))
return;
/* Use small cost to push down aggregate always */
rows = width = startup_cost = total_cost = 1;
/* Now update this information in the fpinfo */
fpinfo->rows = rows;
fpinfo->width = width;
fpinfo->startup_cost = startup_cost;
fpinfo->total_cost = total_cost;
/* Create and add foreign path to the grouping relation. */
#if PG_VERSION_NUM >= 120000
grouppath = create_foreign_upper_path(root,
grouped_rel,
grouped_rel->reltarget,
rows,
startup_cost,
total_cost,
NIL, /* no pathkeys */
NULL,
#if PG_VERSION_NUM >= 170000
NIL, /* no fdw_restrictinfo list */
#endif
NIL); /* no fdw_private */
#else
grouppath = create_foreignscan_path(root,
grouped_rel,
root->upper_targets[UPPERREL_GROUP_AGG],
rows,
startup_cost,
total_cost,
NIL, /* no pathkeys */
NULL, /* no required_outer */
NULL,
NIL); /* no fdw_private */
#endif
/* Add generated path into grouped_rel by add_path(). */
add_path(grouped_rel, (Path *) grouppath);
}
/*
* sqlite_add_foreign_ordered_paths
* Add foreign paths for performing the final sort remotely.
*
* Given input_rel contains the source-data Paths. The paths are added to the
* given ordered_rel.
*/
static void
sqlite_add_foreign_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel,
RelOptInfo *ordered_rel)
{
Query *parse = root->parse;
SqliteFdwRelationInfo *ifpinfo = input_rel->fdw_private;
SqliteFdwRelationInfo *fpinfo = ordered_rel->fdw_private;
double rows;
int width;
Cost startup_cost;
Cost total_cost;
List *fdw_private;
ForeignPath *ordered_path;
ListCell *lc;
/* Shouldn't get here unless the query has ORDER BY */
Assert(parse->sortClause);
#if (PG_VERSION_NUM >= 100000)
/* We don't support cases where there are any SRFs in the targetlist */
if (parse->hasTargetSRFs)
return;
#else
/*
* We don't support cases where there are any SRFs in the targetlist (PG
* Version >10)
*/
if (expression_returns_set((Node *) parse->targetList))
return;
#endif
/* Save the input_rel as outerrel in fpinfo */
fpinfo->outerrel = input_rel;
/*
* Copy foreign table, foreign server, FDW options etc.
* details from the input relation's fpinfo.
*/
fpinfo->table = ifpinfo->table;
fpinfo->server = ifpinfo->server;
/*
* If the input_rel is a base or join relation, we would already have
* considered pushing down the final sort to the remote server when
* creating pre-sorted foreign paths for that relation, because the
* query_pathkeys is set to the root->sort_pathkeys in that case (see
* standard_qp_callback()).
*/
if (input_rel->reloptkind == RELOPT_BASEREL ||
input_rel->reloptkind == RELOPT_JOINREL)
{
Assert(root->query_pathkeys == root->sort_pathkeys);
/* Safe to push down if the query_pathkeys is safe to push down */
fpinfo->pushdown_safe = ifpinfo->qp_is_pushdown_safe;
return;
}
/* The input_rel should be a grouping relation */
Assert(input_rel->reloptkind == RELOPT_UPPER_REL &&
ifpinfo->stage == UPPERREL_GROUP_AGG);
/*
* We try to create a path below by extending a simple foreign path for
* the underlying grouping relation to perform the final sort remotely,
* which is stored into the fdw_private list of the resulting path.
*/
/* Assess if it is safe to push down the final sort */
foreach(lc, root->sort_pathkeys)
{
PathKey *pathkey = (PathKey *) lfirst(lc);
EquivalenceClass *pathkey_ec = pathkey->pk_eclass;
/*
* is_foreign_expr would detect volatile expressions as well, but
* checking ec_has_volatile here saves some cycles.
*/
if (pathkey_ec->ec_has_volatile)
return;
/*
* Can't push down the sort if pathkey's opfamily is not built-in.
*/
if (!sqlite_is_builtin(pathkey->pk_opfamily))
return;
/*
* The EC must contain a shippable EM that is computed in input_rel's
* reltarget, else we can't push down the sort.
*/
if (sqlite_find_em_for_rel_target(root,
pathkey_ec,
input_rel) == NULL)
return;
}
/* Safe to push down */
fpinfo->pushdown_safe = true;
/* Use small cost to push down aggregate always */
rows = width = startup_cost = total_cost = 1;
/* Now update this information in the fpinfo */
fpinfo->rows = rows;
fpinfo->width = width;
fpinfo->startup_cost = startup_cost;
fpinfo->total_cost = total_cost;
/*
* Build the fdw_private list that will be used by sqliteGetForeignPlan.
* Items in the list must match order in enum FdwPathPrivateIndex.
*/
#if (PG_VERSION_NUM >= 150000)
fdw_private = list_make2(makeBoolean(true), makeBoolean(false));
#else
fdw_private = list_make2(makeInteger(true), makeInteger(false));
#endif
#if (PG_VERSION_NUM >= 120000)
/* Create foreign ordering path */
ordered_path = create_foreign_upper_path(root,
input_rel,
root->upper_targets[UPPERREL_ORDERED],
rows,
startup_cost,
total_cost,
root->sort_pathkeys,
NULL, /* no extra plan */
#if PG_VERSION_NUM >= 170000
NIL, /* no fdw_restrictinfo list */
#endif
fdw_private);
#else
/*
* We use root->upper_targets[UPERREL_FINAL] because until PG12,
* upper_targets[UPPERREL_ORDERED] is not filled. Anyways, in PG12
* root->upper_targets[UPPERREL_FINAL] and
* root->upper_targets[UPPERREL_ORDERED] have the same value. More info:
* backend/optimizer/plan/planner.c (Line 2189)
*/
/* Create foreign ordering path */
ordered_path = create_foreignscan_path(root,
input_rel,
root->upper_targets[UPPERREL_FINAL],
rows,
startup_cost,
total_cost,
root->sort_pathkeys,
NULL,
NULL, /* no extra plan */
fdw_private);
#endif
/* and add it to the ordered_rel */
add_path(ordered_rel, (Path *) ordered_path);
}
/*
* sqlite_add_foreign_final_paths
* Add foreign paths for performing the final processing remotely.
*
* Given input_rel contains the source-data Paths. The paths are added to the
* given final_rel.
*/
static void
sqlite_add_foreign_final_paths(PlannerInfo *root, RelOptInfo *input_rel,
RelOptInfo *final_rel
#if (PG_VERSION_NUM >= 120000)
,FinalPathExtraData *extra
#endif
)
{
Query *parse = root->parse;
SqliteFdwRelationInfo *ifpinfo = (SqliteFdwRelationInfo *) input_rel->fdw_private;
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) final_rel->fdw_private;
bool has_final_sort = false;
List *pathkeys = NIL;
double rows;
int width;
Cost startup_cost;
Cost total_cost;
List *fdw_private;
ForeignPath *final_path;
#if (PG_VERSION_NUM < 120000)
bool has_limit = limit_needed(parse);
#endif
/*
* Currently, we only support this for SELECT commands
*/
if (parse->commandType != CMD_SELECT)
return;
/*
* No work if there is FOR UPDATE/SHARE clause and if there is no need to
* add a LIMIT node. We DONT support FOR UPDATE pushdown because SQLITE
* has no implemented yet, that's why we dont do nothing.
*/
if (parse->rowMarks
#if (PG_VERSION_NUM >= 120000)
|| !extra->limit_needed
#else
|| !has_limit
#endif
)
return;
#if (PG_VERSION_NUM >= 100000)
/* We don't support cases where there are any SRFs in the targetlist */
if (parse->hasTargetSRFs)
return;
#else
/*
* We don't support cases where there are any SRFs in the targetlist (PG
* Version >10)
*/
if (expression_returns_set((Node *) parse->targetList))
return;
#endif
/* Save the input_rel as outerrel in fpinfo */
fpinfo->outerrel = input_rel;
/*
* Copy foreign table, foreign server, FDW options etc.
* details from the input relation's fpinfo.
*/
fpinfo->table = ifpinfo->table;
fpinfo->server = ifpinfo->server;
#if (PG_VERSION_NUM >= 120000)
Assert(extra->limit_needed);
#else
Assert(has_limit);
#endif
/*
* If the input_rel is an ordered relation, replace the input_rel with its
* input relation
*/
if (input_rel->reloptkind == RELOPT_UPPER_REL &&
ifpinfo->stage == UPPERREL_ORDERED)
{
input_rel = ifpinfo->outerrel;
ifpinfo = (SqliteFdwRelationInfo *) input_rel->fdw_private;
has_final_sort = true;
pathkeys = root->sort_pathkeys;
}
/* The input_rel should be a base, join, or grouping relation */
Assert(input_rel->reloptkind == RELOPT_BASEREL ||
input_rel->reloptkind == RELOPT_JOINREL ||
(input_rel->reloptkind == RELOPT_UPPER_REL &&
ifpinfo->stage == UPPERREL_GROUP_AGG));
/*
* We try to create a path below by extending a simple foreign path for
* the underlying base, join, or grouping relation to perform the final
* sort (if has_final_sort) and the LIMIT restriction remotely, which is
* stored into the fdw_private list of the resulting path. (We
* re-estimate the costs of sorting the underlying relation, if
* has_final_sort.)
*/
/*
* Assess if it is safe to push down the LIMIT and OFFSET to the remote
* server
*/
/*
* If the underlying relation has any local conditions, the LIMIT/OFFSET
* cannot be pushed down.
*/
if (ifpinfo->local_conds)
return;
#if PG_VERSION_NUM >= 130000
/*
* If the query has FETCH FIRST .. WITH TIES, 1) it must have ORDER BY as
* well, which is used to determine which additional rows tie for the last
* place in the result set, and 2) ORDER BY must already have been
* determined to be safe to push down before we get here. Since sqlite_fdw
* does not support FETCH FIRST ... WITH TIES, disable pushing this option.
*/
if (parse->limitOption == LIMIT_OPTION_WITH_TIES)
return;
#endif
/*
* Also, the LIMIT/OFFSET cannot be pushed down, if their expressions are
* not safe to remote.
*/
if (!sqlite_is_foreign_expr(root, input_rel, (Expr *) parse->limitOffset) ||
!sqlite_is_foreign_expr(root, input_rel, (Expr *) parse->limitCount))
return;
/* Safe to push down */
fpinfo->pushdown_safe = true;
/* Use small cost to push down limit always */
rows = width = startup_cost = total_cost = 1;
/* Now update this information in the fpinfo */
fpinfo->rows = rows;
fpinfo->width = width;
fpinfo->startup_cost = startup_cost;
fpinfo->total_cost = total_cost;
/*
* Build the fdw_private list that will be used by sqliteGetForeignPlan.
* Items in the list must match order in enum FdwPathPrivateIndex.
*/
#if (PG_VERSION_NUM >= 150000)
fdw_private = list_make2(makeBoolean(has_final_sort),
makeBoolean(extra->limit_needed));
#elif (PG_VERSION_NUM >= 120000)
fdw_private = list_make2(makeInteger(has_final_sort),
makeInteger(extra->limit_needed));
#else
fdw_private = list_make2(makeInteger(has_final_sort),
makeInteger(has_limit));
#endif
/*
* Create foreign final path; this gets rid of a no-longer-needed outer
* plan (if any), which makes the EXPLAIN output look cleaner
*/
#if (PG_VERSION_NUM >= 120000)
final_path = create_foreign_upper_path(root,
input_rel,
root->upper_targets[UPPERREL_FINAL],
rows,
startup_cost,
total_cost,
pathkeys,
NULL, /* no extra plan */
#if PG_VERSION_NUM >= 170000
NIL, /* no fdw_restrictinfo list */
#endif
fdw_private);
#else
final_path = create_foreignscan_path(root,
input_rel,
root->upper_targets[UPPERREL_FINAL],
rows,
startup_cost,
total_cost,
pathkeys,
NULL, /* no required_outer */
NULL, /* no extra plan */
fdw_private);
#endif
/* and add it to the final_rel */
add_path(final_rel, (Path *) final_path);
}
/*
* sqlite_estimate_path_cost_size Get cost and size estimates for a foreign scan on
* given foreign relation either a base relation or a join between foreign
* relations or an upper relation containing foreign relations.
*
* param_join_conds are the parameterization clauses with outer relations.
* pathkeys specify the expected sort order if any for given path being
* costed. fpextra specifies additional post-scan/join-processing steps such
* as the final sort and the LIMIT restriction.
*
* The function returns the cost and size estimates in p_rows, p_width,
* p_startup_cost and p_total_cost variables.
*/
static void
sqlite_estimate_path_cost_size(PlannerInfo *root,
RelOptInfo *foreignrel,
List *param_join_conds,
List *pathkeys,
SqliteFdwPathExtraData * fpextra,
double *p_rows, int *p_width,
Cost *p_startup_cost, Cost *p_total_cost)
{
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) foreignrel->fdw_private;
double rows;
double retrieved_rows;
int width;
Cost startup_cost;
Cost total_cost;
Cost run_cost = 0;
/* Make sure the core code has set up the relation's reltarget */
Assert(foreignrel->reltarget);
/*
* We don't support join conditions in this mode (hence, no
* parameterized paths can be made).
*/
Assert(param_join_conds == NIL);
/*
* We will come here again and again with different set of pathkeys or
* additional post-scan/join-processing steps that caller wants to
* cost. We don't need to calculate the cost/size estimates for the
* underlying scan, join, or grouping each time. Instead, use those
* estimates if we have cached them already.
*/
if (fpinfo->rel_startup_cost >= 0 && fpinfo->rel_total_cost >= 0)
{
Assert(fpinfo->retrieved_rows >= 1);
rows = fpinfo->rows;
retrieved_rows = fpinfo->retrieved_rows;
width = fpinfo->width;
startup_cost = fpinfo->rel_startup_cost;
run_cost = fpinfo->rel_total_cost - fpinfo->rel_startup_cost;
/*
* If we estimate the costs of a foreign scan or a foreign join
* with additional post-scan/join-processing steps, the scan or
* join costs obtained from the cache wouldn't yet contain the
* eval costs for the final scan/join target, which would've been
* updated by apply_scanjoin_target_to_paths(); add the eval costs
* now.
*/
if (fpextra && !IS_UPPER_REL(foreignrel))
{
/* Shouldn't get here unless we have LIMIT */
Assert(fpextra->has_limit);
Assert(foreignrel->reloptkind == RELOPT_BASEREL ||
foreignrel->reloptkind == RELOPT_JOINREL);
startup_cost += foreignrel->reltarget->cost.startup;
run_cost += foreignrel->reltarget->cost.per_tuple * rows;
}
}
else if (IS_JOIN_REL(foreignrel))
{
SqliteFdwRelationInfo *fpinfo_i;
SqliteFdwRelationInfo *fpinfo_o;
QualCost join_cost;
QualCost remote_conds_cost;
double nrows;
/* Use rows/width estimates made by the core code. */
rows = foreignrel->rows;
width = foreignrel->reltarget->width;
/* For join we expect inner and outer relations set */
Assert(fpinfo->innerrel && fpinfo->outerrel);
fpinfo_i = (SqliteFdwRelationInfo *)fpinfo->innerrel->fdw_private;
fpinfo_o = (SqliteFdwRelationInfo *)fpinfo->outerrel->fdw_private;
/* Estimate of number of rows in cross product */
nrows = fpinfo_i->rows * fpinfo_o->rows;
/*
* Back into an estimate of the number of retrieved rows. Just in
* case this is nuts, clamp to at most nrows.
*/
retrieved_rows = clamp_row_est(rows / fpinfo->local_conds_sel);
retrieved_rows = Min(retrieved_rows, nrows);
/*
* The cost of foreign join is estimated as cost of generating
* rows for the joining relations + cost for applying quals on the
* rows.
*/
/*
* Calculate the cost of clauses pushed down to the foreign server
*/
cost_qual_eval(&remote_conds_cost, fpinfo->remote_conds, root);
/* Calculate the cost of applying join clauses */
cost_qual_eval(&join_cost, fpinfo->joinclauses, root);
/*
* Startup cost includes startup cost of joining relations and the
* startup cost for join and other clauses. We do not include the
* startup cost specific to join strategy (e.g. setting up hash
* tables) since we do not know what strategy the foreign server
* is going to use.
*/
startup_cost = fpinfo_i->rel_startup_cost + fpinfo_o->rel_startup_cost;
startup_cost += join_cost.startup;
startup_cost += remote_conds_cost.startup;
startup_cost += fpinfo->local_conds_cost.startup;
/*
* Run time cost includes:
*
* 1. Run time cost (total_cost - startup_cost) of relations being
* joined
*
* 2. Run time cost of applying join clauses on the cross product
* of the joining relations.
*
* 3. Run time cost of applying pushed down other clauses on the
* result of join
*
* 4. Run time cost of applying nonpushable other clauses locally
* on the result fetched from the foreign server.
*/
run_cost = fpinfo_i->rel_total_cost - fpinfo_i->rel_startup_cost;
run_cost += fpinfo_o->rel_total_cost - fpinfo_o->rel_startup_cost;
run_cost += nrows * join_cost.per_tuple;
nrows = clamp_row_est(nrows * fpinfo->joinclause_sel);
run_cost += nrows * remote_conds_cost.per_tuple;
run_cost += fpinfo->local_conds_cost.per_tuple * retrieved_rows;
/* Add in tlist eval cost for each output row */
startup_cost += foreignrel->reltarget->cost.startup;
run_cost += foreignrel->reltarget->cost.per_tuple * rows;
}
else if (IS_UPPER_REL(foreignrel))
{
RelOptInfo *outerrel = fpinfo->outerrel;
SqliteFdwRelationInfo *ofpinfo;
AggClauseCosts aggcosts;
double input_rows;
int numGroupCols;
double numGroups = 1;
/*
* The upper relation should have its outer relation set
*/
Assert(outerrel);
/*
* and that outer relation should have its reltarget set
*/
Assert(outerrel->reltarget);
/*
* This cost model is mixture of costing done for sorted and
* hashed aggregates in cost_agg(). We are not sure which
* strategy will be considered at remote side, thus for
* simplicity, we put all startup related costs in startup_cost
* and all finalization and run cost are added in total_cost.
*/
ofpinfo = (SqliteFdwRelationInfo *)outerrel->fdw_private;
/* Get rows from input rel */
input_rows = ofpinfo->rows;
/*
* Collect statistics about aggregates for estimating costs.
*/
MemSet(&aggcosts, 0, sizeof(AggClauseCosts));
if (root->parse->hasAggs)
{
#if PG_VERSION_NUM >= 140000
get_agg_clause_costs(root, AGGSPLIT_SIMPLE, &aggcosts);
#else
get_agg_clause_costs(root, (Node *)fpinfo->grouped_tlist,
AGGSPLIT_SIMPLE, &aggcosts);
/*
* The cost of aggregates in the HAVING qual will be the same
* for each child as it is for the parent, so there's no need
* to use a translated version of havingQual.
*/
get_agg_clause_costs(root, (Node *)root->parse->havingQual,
AGGSPLIT_SIMPLE, &aggcosts);
#endif
}
/*
* Get number of grouping columns and possible number of groups
*/
#if PG_VERSION_NUM >= 160000
numGroupCols = list_length(root->processed_groupClause);
numGroups = estimate_num_groups(root,
get_sortgrouplist_exprs(root->processed_groupClause,
fpinfo->grouped_tlist),
#else
numGroupCols = list_length(root->parse->groupClause);
numGroups = estimate_num_groups(root,
get_sortgrouplist_exprs(root->parse->groupClause,
fpinfo->grouped_tlist),
#endif
input_rows, NULL
#if PG_VERSION_NUM >= 140000
, NULL
#endif
);
/*
* Get the retrieved_rows and rows estimates. If there are HAVING
* quals, account for their selectivity.
*/
#if PG_VERSION_NUM >= 160000
if (root->hasHavingQual)
#else
if (root->parse->havingQual)
#endif
{
/*
* Factor in the selectivity of the remotely-checked quals
*/
retrieved_rows =
clamp_row_est(numGroups *
clauselist_selectivity(root,
fpinfo->remote_conds,
0,
JOIN_INNER,
NULL));
/*
* Factor in the selectivity of the locally-checked quals
*/
rows = clamp_row_est(retrieved_rows * fpinfo->local_conds_sel);
}
else
{
rows = retrieved_rows = numGroups;
}
/* Use width estimate made by the core code. */
width = foreignrel->reltarget->width;
/*-----
* Startup cost includes:
* 1. Startup cost for underneath input relation, adjusted for
* tlist replacement by apply_scanjoin_target_to_paths()
* 2. Cost of performing aggregation, per cost_agg()
*-----
*/
startup_cost = ofpinfo->rel_startup_cost;
startup_cost += outerrel->reltarget->cost.startup;
startup_cost += aggcosts.transCost.startup;
startup_cost += aggcosts.transCost.per_tuple * input_rows;
#if PG_VERSION_NUM >= 120000
startup_cost += aggcosts.finalCost.startup;
#else
startup_cost += aggcosts.finalCost;
#endif
startup_cost += (cpu_operator_cost * numGroupCols) * input_rows;
/*-----
* Run time cost includes:
* 1. Run time cost of underneath input relation, adjusted for
* tlist replacement by apply_scanjoin_target_to_paths()
* 2. Run time cost of performing aggregation, per cost_agg()
*-----
*/
run_cost = ofpinfo->rel_total_cost - ofpinfo->rel_startup_cost;
run_cost += outerrel->reltarget->cost.per_tuple * input_rows;
#if PG_VERSION_NUM >= 120000
run_cost += aggcosts.finalCost.per_tuple * numGroups;
#else
run_cost += aggcosts.finalCost * numGroups;
#endif
run_cost += cpu_tuple_cost * numGroups;
/* Account for the eval cost of HAVING quals, if any */
#if PG_VERSION_NUM >= 160000
if (root->hasHavingQual)
#else
if (root->parse->havingQual)
#endif
{
QualCost remote_cost;
/*
* Add in the eval cost of the remotely-checked quals
*/
cost_qual_eval(&remote_cost, fpinfo->remote_conds, root);
startup_cost += remote_cost.startup;
run_cost += remote_cost.per_tuple * numGroups;
/*
* Add in the eval cost of the locally-checked quals
*/
startup_cost += fpinfo->local_conds_cost.startup;
run_cost += fpinfo->local_conds_cost.per_tuple * retrieved_rows;
}
/* Add in tlist eval cost for each output row */
startup_cost += foreignrel->reltarget->cost.startup;
run_cost += foreignrel->reltarget->cost.per_tuple * rows;
}
else
{
Cost cpu_per_tuple;
/*
* Use rows/width estimates made by set_baserel_size_estimates.
*/
rows = foreignrel->rows;
width = foreignrel->reltarget->width;
/*
* Back into an estimate of the number of retrieved rows. Just in
* case this is nuts, clamp to at most foreignrel->tuples.
*/
retrieved_rows = clamp_row_est(rows / fpinfo->local_conds_sel);
retrieved_rows = Min(retrieved_rows, foreignrel->tuples);
/*
* Cost as though this were a seqscan, which is pessimistic. We
* effectively imagine the local_conds are being evaluated
* remotely, too.
*/
startup_cost = 0;
run_cost = 0;
run_cost += seq_page_cost * foreignrel->pages;
startup_cost += foreignrel->baserestrictcost.startup;
cpu_per_tuple = cpu_tuple_cost + foreignrel->baserestrictcost.per_tuple;
run_cost += cpu_per_tuple * foreignrel->tuples;
/* Add in tlist eval cost for each output row */
startup_cost += foreignrel->reltarget->cost.startup;
run_cost += foreignrel->reltarget->cost.per_tuple * rows;
}
/*
* Without remote estimates, we have no real way to estimate the cost
* of generating sorted output. It could be free if the query plan
* the remote side would have chosen generates properly-sorted output
* anyway, but in most cases it will cost something. Estimate a value
* high enough that we won't pick the sorted path when the ordering
* isn't locally useful, but low enough that we'll err on the side of
* pushing down the ORDER BY clause when it's useful to do so.
*/
if (pathkeys != NIL)
{
if (IS_UPPER_REL(foreignrel))
{
Assert(foreignrel->reloptkind == RELOPT_UPPER_REL &&
fpinfo->stage == UPPERREL_GROUP_AGG);
sqlite_adjust_foreign_grouping_path_cost(root, pathkeys,
retrieved_rows, width,
fpextra->limit_tuples,
&startup_cost, &run_cost);
}
else
{
startup_cost *= DEFAULT_FDW_SORT_MULTIPLIER;
run_cost *= DEFAULT_FDW_SORT_MULTIPLIER;
}
}
total_cost = startup_cost + run_cost;
#if PG_VERSION_NUM >= 120000
/* Adjust the cost estimates if we have LIMIT */
if (fpextra && fpextra->has_limit)
{
adjust_limit_rows_costs(&rows, &startup_cost, &total_cost,
fpextra->offset_est, fpextra->count_est);
retrieved_rows = rows;
}
#endif
/*
* If this includes the final sort step, the given target, which will be
* applied to the resulting path, might have different expressions from
* the foreignrel's reltarget (see make_sort_input_target()); adjust tlist
* eval costs.
*/
if (fpextra && fpextra->has_final_sort &&
fpextra->target != foreignrel->reltarget)
{
QualCost oldcost = foreignrel->reltarget->cost;
QualCost newcost = fpextra->target->cost;
startup_cost += newcost.startup - oldcost.startup;
total_cost += newcost.startup - oldcost.startup;
total_cost += (newcost.per_tuple - oldcost.per_tuple) * rows;
}
/*
* Cache the retrieved rows and cost estimates for scans, joins, or
* groupings without any parameterization, pathkeys, or additional
* post-scan/join-processing steps, before adding the costs for
* transferring data from the foreign server. These estimates are useful
* for costing remote joins involving this relation or costing other
* remote operations on this relation such as remote sorts and remote
* LIMIT restrictions, when the costs can not be obtained from the foreign
* server. This function will be called at least once for every foreign
* relation without any parameterization, pathkeys, or additional
* post-scan/join-processing steps.
*/
if (pathkeys == NIL && param_join_conds == NIL && fpextra == NULL)
{
fpinfo->retrieved_rows = retrieved_rows;
fpinfo->rel_startup_cost = startup_cost;
fpinfo->rel_total_cost = total_cost;
}
/*
* Add some additional cost factors to account for connection overhead
* (fdw_startup_cost), transferring data across the network
* (fdw_tuple_cost per retrieved row), and local manipulation of the data
* (cpu_tuple_cost per retrieved row).
*/
startup_cost += fpinfo->fdw_startup_cost;
total_cost += fpinfo->fdw_startup_cost;
total_cost += fpinfo->fdw_tuple_cost * retrieved_rows;
total_cost += cpu_tuple_cost * retrieved_rows;
/*
* If we have LIMIT, we should prefer performing the restriction remotely
* rather than locally, as the former avoids extra row fetches from the
* remote that the latter might cause. But since the core code doesn't
* account for such fetches when estimating the costs of the local
* restriction (see create_limit_path()), there would be no difference
* between the costs of the local restriction and the costs of the remote
* restriction estimated above if we don't use remote estimates (except
* for the case where the foreignrel is a grouping relation, the given
* pathkeys is not NIL, and the effects of a bounded sort for that rel is
* accounted for in costing the remote restriction). Tweak the costs of
* the remote restriction to ensure we'll prefer it if LIMIT is a useful
* one.
*/
if (fpextra && fpextra->has_limit &&
fpextra->limit_tuples > 0 &&
fpextra->limit_tuples < fpinfo->rows)
{
Assert(fpinfo->rows > 0);
total_cost -= (total_cost - startup_cost) * 0.05 *
(fpinfo->rows - fpextra->limit_tuples) / fpinfo->rows;
}
/* Return results. */
*p_rows = rows;
*p_width = width;
*p_startup_cost = startup_cost;
*p_total_cost = total_cost;
}
static void
sqlite_to_pg_type(StringInfo str, char *type)
{
int i;
/*
* type conversion based on SQLite affiniy
* https://www.sqlite.org/datatype3.html
*/
static const char *affinity[][2] = {
{"int", "bigint"},
{"char", "text"},
{"clob", "text"},
{"text", "text"},
{"blob", "bytea"},
{"real", "double precision"},
{"floa", "double precision"},
{"doub", "double precision"},
{NULL, NULL}};
static const char *pg_type[][2] = {
{"datetime", "timestamp"},
{"time"},
{"date"},
{"bit"}, /* bit(n) and bit varying(n) */
{"boolean"},
{"varchar"},
{"char"},
{"uuid"},
{"macaddr"},
{"macaddr8"},
{"geometry"},
{"geography"},
{"jsonb"},
{"json"},
{NULL}
};
if (type == NULL || type[0] == '\0')
{
/* If no type, use blob affinity */
appendStringInfoString(str, "bytea");
return;
}
type = str_tolower(type, strlen(type), C_COLLATION_OID);
for (i = 0; pg_type[i][0] != NULL; i++)
{
const char *t0 = pg_type[i][0];
if (strncmp(type, t0, strlen(t0)) == 0)
{
/* Pass type to PostgreSQL as it is */
if (pg_type[i][1] == NULL)
{
#ifdef SQLITE_FDW_GIS_ENABLE
appendStringInfoString(str, type);
#else
/*
* Without GIS support.
* Columns with listed data type names treated just as bytea
*/
bool postgis = false;
int j;
for (j = 0; postGisSQLiteCompatibleTypes[j] != NULL; j++)
{
const char *pgt = postGisSQLiteCompatibleTypes[j];
if (strncmp(type, pgt, strlen(pgt)) == 0)
{
postgis = true;
break;
}
}
if (postgis)
appendStringInfoString(str, "bytea");
else
appendStringInfoString(str, type);
#endif
}
else
appendStringInfoString(str, pg_type[i][1]);
pfree(type);
return;
}
}
for (i = 0; affinity[i][0] != NULL; i++)
{
if (strstr(type, affinity[i][0]) != 0)
{
appendStringInfoString(str, affinity[i][1]);
pfree(type);
return;
}
}
/* decimal for numeric affinity */
appendStringInfoString(str, "decimal");
pfree(type);
}
/*
* Force assorted GUC parameters to settings that ensure that we'll output
* data values in a form that is unambiguous to the remote server.
*
* This is rather expensive and annoying to do once per row, but there's
* little choice if we want to be sure values are transmitted accurately;
* we can't leave the settings in place between rows for fear of affecting
* user-visible computations.
*
* We use the equivalent of a function SET option to allow the settings to
* persist only until the caller calls reset_transmission_modes(). If an
* error is thrown in between, guc.c will take care of undoing the settings.
*
* The return value is the nestlevel that must be passed to
* reset_transmission_modes() to undo things.
*/
int
sqlite_set_transmission_modes(void)
{
int nestlevel = NewGUCNestLevel();
/*
* The values set here should match what pg_dump does. See also
* configure_remote_session in connection.c.
*/
if (DateStyle != USE_ISO_DATES)
(void) set_config_option("datestyle", "ISO",
PGC_USERSET, PGC_S_SESSION,
GUC_ACTION_SAVE, true, 0, false);
if (IntervalStyle != INTSTYLE_POSTGRES)
(void) set_config_option("intervalstyle", "postgres",
PGC_USERSET, PGC_S_SESSION,
GUC_ACTION_SAVE, true, 0, false);
if (extra_float_digits < 3)
(void) set_config_option("extra_float_digits", "3",
PGC_USERSET, PGC_S_SESSION,
GUC_ACTION_SAVE, true, 0, false);
/*
* In addition force restrictive search_path, in case there are any
* regproc or similar constants to be printed.
*/
(void) set_config_option("search_path", "pg_catalog",
PGC_USERSET, PGC_S_SESSION,
GUC_ACTION_SAVE, true, 0, false);
return nestlevel;
}
/*
* Undo the effects of set_transmission_modes().
*/
void
sqlite_reset_transmission_modes(int nestlevel)
{
AtEOXact_GUC(true, nestlevel);
}
/*
* sqlite_execute_insert
* Perform execute sqliteExecForeignInsert, sqliteExecForeignBatchInsert
*/
static TupleTableSlot **
sqlite_execute_insert(EState *estate,
ResultRelInfo *resultRelInfo,
CmdType operation,
TupleTableSlot **slots,
TupleTableSlot **planSlots,
int *numSlots)
{
SqliteFdwExecState *fmstate = (SqliteFdwExecState *) resultRelInfo->ri_FdwState;
ListCell *lc;
Datum value = 0;
MemoryContext oldcontext;
int rc = SQLITE_OK;
int nestlevel;
int bindnum = 0;
int i;
Relation rel = resultRelInfo->ri_RelationDesc;
Oid foreignTableId = RelationGetRelid(rel);
#if PG_VERSION_NUM >= 140000
TupleDesc tupdesc = RelationGetDescr(rel);
#endif
elog(DEBUG1, "sqlite_fdw : %s for RelId %u", __func__, foreignTableId);
oldcontext = MemoryContextSwitchTo(fmstate->temp_cxt);
nestlevel = sqlite_set_transmission_modes();
Assert(operation == CMD_INSERT);
#if PG_VERSION_NUM >= 140000
if (fmstate->num_slots != *numSlots)
{
StringInfoData sql;
fmstate->table = GetForeignTable(RelationGetRelid(fmstate->rel));
fmstate->server = GetForeignServer(fmstate->table->serverid);
fmstate->stmt = NULL;
initStringInfo(&sql);
sqlite_rebuild_insert(&sql, fmstate->rel, fmstate->orig_query,
fmstate->target_attrs, fmstate->values_end,
fmstate->p_nums, *numSlots - 1);
fmstate->query = sql.data;
fmstate->num_slots = *numSlots;
sqlite_prepare_wrapper(fmstate->server, fmstate->conn, fmstate->query, &fmstate->stmt, NULL, true);
}
#endif
for (i = 0; i < *numSlots; i++)
{
foreach(lc, fmstate->retrieved_attrs)
{
int attnum = lfirst_int(lc) - 1;
Form_pg_attribute att = TupleDescAttr(slots[i]->tts_tupleDescriptor, attnum);
bool isnull;
#if PG_VERSION_NUM >= 140000
Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum);
/* Ignore generated columns and skip bind value */
if (attr->attgenerated)
continue;
#endif
value = slot_getattr(slots[i], attnum + 1, &isnull);
sqlite_bind_sql_var(att, bindnum, value, fmstate->stmt, &isnull, foreignTableId);
bindnum++;
}
}
sqlite_reset_transmission_modes(nestlevel);
/* Execute the query */
rc = sqlite3_step(fmstate->stmt);
if (rc != SQLITE_DONE)
{
sqlitefdw_report_error(ERROR, fmstate->stmt, fmstate->conn, NULL, rc);
}
sqlite3_reset(fmstate->stmt);
MemoryContextSwitchTo(oldcontext);
MemoryContextReset(fmstate->temp_cxt);
return slots;
}
/*
* Prepare for processing of parameters used in remote query.
*/
static void
sqlite_prepare_query_params(PlanState *node,
List *fdw_exprs,
int numParams,
FmgrInfo **param_flinfo,
List **param_exprs,
const char ***param_values,
Oid **param_types)
{
int i;
ListCell *lc;
Assert(numParams > 0);
/* Prepare for output conversion of parameters used in remote query. */
*param_flinfo = (FmgrInfo *) palloc0(sizeof(FmgrInfo) * numParams);
*param_types = (Oid *) palloc0(sizeof(Oid) * numParams);
i = 0;
foreach(lc, fdw_exprs)
{
Node *param_expr = (Node *) lfirst(lc);
Oid typefnoid;
bool isvarlena;
(*param_types)[i] = exprType(param_expr);
getTypeOutputInfo(exprType(param_expr), &typefnoid, &isvarlena);
fmgr_info(typefnoid, &(*param_flinfo)[i]);
i++;
}
/*
* Prepare remote-parameter expressions for evaluation. (Note: in
* practice, we expect that all these expressions will be just Params, so
* we could possibly do something more efficient than using the full
* expression-eval machinery for this. But probably there would be little
* benefit, and it'd require sqlite_fdw to know more than is desirable
* about Param evaluation.)
*/
#if PG_VERSION_NUM >= 100000
*param_exprs = (List *) ExecInitExprList(fdw_exprs, node);
#else
*param_exprs = (List *) ExecInitExpr((Expr *) fdw_exprs, node);
#endif
/* Allocate buffer for text form of query parameters. */
*param_values = (const char **) palloc0(numParams * sizeof(char *));
}
/*
* Construct array of query parameter values and bind parameters
*
*/
static void
sqlite_process_query_params(ExprContext *econtext,
FmgrInfo *param_flinfo,
List *param_exprs,
const char **param_values,
sqlite3_stmt * *stmt,
Oid *param_types,
Oid foreignTableId
)
{
int i;
ListCell *lc;
int nestlevel;
nestlevel = sqlite_set_transmission_modes();
i = 0;
foreach(lc, param_exprs)
{
ExprState *expr_state = (ExprState *) lfirst(lc);
Datum expr_value;
bool isNull;
/* fake structure, bind function usually works with attribute, but just typid in our case */
Form_pg_attribute att = NULL;
/* Evaluate the parameter expression */
#if PG_VERSION_NUM >= 100000
expr_value = ExecEvalExpr(expr_state, econtext, &isNull);
#else
expr_value = ExecEvalExpr(expr_state, econtext, &isNull, NULL);
#endif
/* Bind parameters */
att = palloc(sizeof(FormData_pg_attribute));
att->atttypid = param_types[i];
att->atttypmod = -1;
sqlite_bind_sql_var(att, i, expr_value, *stmt, &isNull, foreignTableId);
pfree(att);
/*
* Get string sentation of each parameter value by invoking
* type-specific output function, unless the value is null.
*/
if (isNull)
param_values[i] = NULL;
else
param_values[i] = OutputFunctionCall(¶m_flinfo[i], expr_value);
i++;
}
sqlite_reset_transmission_modes(nestlevel);
}
/*
* Create cursor for node's query with current parameter values.
*/
static void
sqlite_create_cursor(ForeignScanState *node)
{
SqliteFdwExecState *festate = (SqliteFdwExecState *) node->fdw_state;
ExprContext *econtext = node->ss.ps.ps_ExprContext;
int numParams = festate->numParams;
const char **values = festate->param_values;
/*
* Construct array of query parameter values in text format. We do the
* conversions in the short-lived per-tuple context, so as not to cause a
* memory leak over repeated scans.
*/
if (numParams > 0)
{
Oid foreignTableId = (festate->rel != NULL) ? RelationGetRelid(festate->rel) : 0;
MemoryContext oldcontext;
oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory);
sqlite_process_query_params(econtext,
festate->param_flinfo,
festate->param_exprs,
values,
&festate->stmt,
festate->param_types,
foreignTableId);
MemoryContextSwitchTo(oldcontext);
}
/* Mark the cursor as created, and show no tuples have been retrieved */
festate->cursor_exists = true;
}
/*
* Execute a direct UPDATE/DELETE statement.
*/
static void
sqlite_execute_dml_stmt(ForeignScanState *node)
{
SqliteFdwDirectModifyState *dmstate = (SqliteFdwDirectModifyState *) node->fdw_state;
ExprContext *econtext = node->ss.ps.ps_ExprContext;
int numParams = dmstate->numParams;
const char **values = dmstate->param_values;
Oid foreignTableId = RelationGetRelid(dmstate->rel);
int rc;
/*
* Construct array of query parameter values in text format.
*/
if (numParams > 0)
sqlite_process_query_params(econtext,
dmstate->param_flinfo,
dmstate->param_exprs,
values,
&dmstate->stmt,
dmstate->param_types,
foreignTableId);
/*
* Notice that we pass NULL for paramTypes, thus forcing the remote server
* to infer types for all parameters. Since we explicitly cast every
* parameter (see deparse.c), the "inference" is trivial and will produce
* the desired result. This allows us to avoid assuming that the remote
* server has the same OIDs we do for the parameters' types.
*/
rc = sqlite3_step(dmstate->stmt);
if (rc != SQLITE_DONE)
{
sqlitefdw_report_error(ERROR, dmstate->stmt, dmstate->conn, NULL, rc);
}
/* Get the number of rows affected. */
dmstate->num_tuples = sqlite3_changes(dmstate->conn);
}
/*
* Given an EquivalenceClass and a foreign relation, find an EC member
* that can be used to sort the relation remotely according to a pathkey
* using this EC.
*
* If there is more than one suitable candidate, return an arbitrary
* one of them. If there is none, return NULL.
*
* This checks that the EC member expression uses only Vars from the given
* rel and is shippable. Caller must separately verify that the pathkey's
* ordering operator is shippable.
*/
EquivalenceMember *
sqlite_find_em_for_rel(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel)
{
ListCell *lc;
#if PG_VERSION_NUM >= 170000
SqliteFdwRelationInfo *fpinfo = (SqliteFdwRelationInfo *) rel->fdw_private;
#endif
foreach(lc, ec->ec_members)
{
EquivalenceMember *em = (EquivalenceMember *) lfirst(lc);
/*
* Note we require !bms_is_empty, else we'd accept constant
* expressions which are not suitable for the purpose.
*/
if (bms_is_subset(em->em_relids, rel->relids) &&
!bms_is_empty(em->em_relids) &&
#if PG_VERSION_NUM >= 170000
bms_is_empty(bms_intersect(em->em_relids, fpinfo->hidden_subquery_rels)) &&
#endif
sqlite_is_foreign_expr(root, rel, em->em_expr))
return em;
}
return NULL;
}
/*
* Find an EquivalenceClass member that is to be computed as a sort column
* in the given rel's reltarget, and is shippable.
*
* If there is more than one suitable candidate, return an arbitrary
* one of them. If there is none, return NULL.
*
* This checks that the EC member expression uses only Vars from the given
* rel and is shippable. Caller must separately verify that the pathkey's
* ordering operator is shippable.
*/
EquivalenceMember *
sqlite_find_em_for_rel_target(PlannerInfo *root, EquivalenceClass *ec,
RelOptInfo *rel)
{
PathTarget *target = rel->reltarget;
ListCell *lc1;
int i;
i = 0;
foreach(lc1, target->exprs)
{
Expr *expr = (Expr *) lfirst(lc1);
Index sgref = get_pathtarget_sortgroupref(target, i);
ListCell *lc2;
/* Ignore non-sort expressions */
if (sgref == 0 ||
get_sortgroupref_clause_noerr(sgref,
root->parse->sortClause) == NULL)
{
i++;
continue;
}
/* We ignore binary-compatible relabeling on both ends */
while (expr && IsA(expr, RelabelType))
expr = ((RelabelType *) expr)->arg;
/* Locate an EquivalenceClass member matching this expr, if any */
foreach(lc2, ec->ec_members)
{
EquivalenceMember *em = (EquivalenceMember *) lfirst(lc2);
Expr *em_expr;
/* Don't match constants */
if (em->em_is_const)
continue;
/* Ignore child members */
if (em->em_is_child)
continue;
/* Match if same expression (after stripping relabel) */
em_expr = em->em_expr;
while (em_expr && IsA(em_expr, RelabelType))
em_expr = ((RelabelType *) em_expr)->arg;
if (!equal(em_expr, expr))
continue;
/* Check that expression (including relabels!) is shippable */
if (sqlite_is_foreign_expr(root, rel, em->em_expr))
return em;
}
i++;
}
return NULL;
}
#if PG_VERSION_NUM >= 140000
/*
* Determine batch size for a given foreign table. The option specified for
* a table has precedence.
*/
static int
sqlite_get_batch_size_option(Relation rel)
{
Oid foreigntableid = RelationGetRelid(rel);
ForeignTable *table;
ForeignServer *server;
List *options;
ListCell *lc;
/* we use 1 by default, which means "no batching" */
int batch_size = 1;
/*
* Load options for table and server. We append server options after table
* options, because table options take precedence.
*/
table = GetForeignTable(foreigntableid);
server = GetForeignServer(table->serverid);
options = NIL;
options = list_concat(options, table->options);
options = list_concat(options, server->options);
/* See if either table or server specifies batch_size. */
foreach(lc, options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "batch_size") == 0)
{
(void) parse_int(defGetString(def), &batch_size, 0, NULL);
break;
}
}
return batch_size;
}
#endif
/*
* sqliteIsForeignRelUpdatable
* Determine whether a foreign table supports INSERT, UPDATE and/or
* DELETE.
*/
static int
sqliteIsForeignRelUpdatable(Relation rel)
{
bool updatable;
bool readonly_db_file;
ForeignTable *table;
ForeignServer *server;
ListCell *lc;
/*
* By default, all sqlite_fdw foreign tables are assumed updatable.
* If force_readonly option is set, foreign server option 'updatable'
* is ignored, table option 'updatable' is also ignored
*/
updatable = true;
readonly_db_file = false;
table = GetForeignTable(RelationGetRelid(rel));
server = GetForeignServer(table->serverid);
foreach(lc, server->options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "force_readonly") == 0)
readonly_db_file = defGetBoolean(def);
else if (strcmp(def->defname, "updatable") == 0)
updatable = defGetBoolean(def);
}
if (readonly_db_file)
updatable = false;
else
{
foreach(lc, table->options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, "updatable") == 0)
updatable = defGetBoolean(def);
}
}
/*
* Currently "updatable" means support for INSERT, UPDATE and DELETE.
*/
return updatable ?
(1 << CMD_INSERT) | (1 << CMD_UPDATE) | (1 << CMD_DELETE) : 0;
}
/*
* sqlite_affinity_eqv_to_pgtype:
* Give nearest SQLite data affinity for PostgreSQL data type
*/
static int32
sqlite_affinity_eqv_to_pgtype(Oid type)
{
switch (type)
{
/* some popular first */
case VARCHAROID:
case TEXTOID:
case JSONOID:
case NAMEOID:
case DATEOID:
case TIMEOID:
case TIMESTAMPOID:
case TIMESTAMPTZOID:
case BPCHAROID:
return SQLITE3_TEXT;
case INT4OID:
case BOOLOID:
case INT8OID:
case INT2OID:
case BITOID:
case VARBITOID:
return SQLITE_INTEGER;
case FLOAT4OID:
case FLOAT8OID:
case NUMERICOID:
return SQLITE_FLOAT;
case BYTEAOID:
case UUIDOID:
case MACADDROID:
case MACADDR8OID:
case JSONBOID:
return SQLITE_BLOB;
default:
if (listed_datatype_oid(type, -1, postGisSQLiteCompatibleTypes))
return SQLITE_BLOB; /* SpatiaLite GIS data */
else
return SQLITE3_TEXT;
}
}
/*
* sqlite_datatype
* Give equivalent string for SQLite data affinity by int from enum
* SQLITE_INTEGER etc.
*/
const char*
sqlite_datatype(int t)
{
switch (t)
{
case SQLITE_INTEGER:
return azType[1];
case SQLITE_FLOAT:
return azType[2];
case SQLITE3_TEXT:
return azType[3];
case SQLITE_BLOB:
return azType[4];
case SQLITE_NULL:
return azType[5];
default:
return azType[0];
}
}
/*
* Give SQLite affinity enum int for SQLite data affinity string
*/
const int
sqlite_affinity_code(char* t)
{
if ( t == NULL )
return SQLITE_NULL;
if (strcasecmp(t, azType[1]) == 0 || strcasecmp(t, "int") == 0)
return SQLITE_INTEGER;
if (strcasecmp(t, azType[2]) == 0)
return SQLITE_FLOAT;
if (strcasecmp(t, azType[3]) == 0)
return SQLITE_TEXT;
if (strcasecmp(t, azType[4]) == 0)
return SQLITE_BLOB;
return SQLITE_NULL;
}
/*
* Callback function which is called when error occurs during column value
* conversion. Print names of column and relation, SQLite value details.
*
* Note that this function mustn't do any catalog lookups, since we are in
* an already-failed transaction. Fortunately, we can get the needed info
* from the relation or the query's rangetable instead.
*/
static void
conversion_error_callback(void *arg)
{
ConversionLocation *errpos = (ConversionLocation *) arg;
Relation rel = errpos->rel;
ForeignScanState *fsstate = errpos->fsstate;
const char *attname = NULL;
const char *relname = NULL;
bool is_wholerow = false;
Form_pg_attribute att = errpos->att;
Oid pgtyp = att->atttypid;
int32 pgtypmod = att->atttypmod;
NameData pgColND = att->attname;
const char *pg_dataTypeName = NULL;
const char *sqlite_affinity = NULL;
const char *pg_good_affinity = NULL;
const int max_logged_byte_length = NAMEDATALEN * 2;
int value_byte_size_blob_or_utf8 = sqlite3_value_bytes (errpos->val);
int value_aff = sqlite3_value_type(errpos->val);
int affinity_for_pg_column = sqlite_affinity_eqv_to_pgtype(pgtyp);
pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(pgtyp, pgtypmod));
sqlite_affinity = sqlite_datatype(value_aff);
pg_good_affinity = sqlite_datatype(affinity_for_pg_column);
/*
* If we're in a scan node, always use aliases from the rangetable, for
* consistency between the simple-relation and remote-join cases. Look at
* the relation's tupdesc only if we're not in a scan node.
*/
if (fsstate)
{
/* ForeignScan case */
ForeignScan *fsplan = castNode(ForeignScan, fsstate->ss.ps.plan);
int varno = 0;
AttrNumber colno = 0;
if (fsplan->scan.scanrelid > 0)
{
/* error occurred in a scan against a foreign table */
varno = fsplan->scan.scanrelid;
colno = errpos->cur_attno;
}
else
{
/* error occurred in a scan against a foreign join */
TargetEntry *tle;
tle = list_nth_node(TargetEntry, fsplan->fdw_scan_tlist,
errpos->cur_attno - 1);
/*
* Target list can have Vars and expressions. For Vars, we can
* get some information, however for expressions we can't. Thus
* for expressions, just show generic context message.
*/
if (IsA(tle->expr, Var))
{
Var *var = (Var *) tle->expr;
varno = var->varno;
colno = var->varattno;
}
}
if (varno > 0)
{
EState *estate = fsstate->ss.ps.state;
RangeTblEntry *rte = exec_rt_fetch(varno, estate);
relname = rte->eref->aliasname;
if (colno == 0)
is_wholerow = true;
else if (colno > 0 && colno <= list_length(rte->eref->colnames))
attname = strVal(list_nth(rte->eref->colnames, colno - 1));
else if (colno == SelfItemPointerAttributeNumber)
attname = "ctid";
}
}
else if (rel)
{
/* Non-ForeignScan case (we should always have a rel here) */
TupleDesc tupdesc = RelationGetDescr(rel);
relname = RelationGetRelationName(rel);
if (errpos->cur_attno > 0 && errpos->cur_attno <= tupdesc->natts)
{
Form_pg_attribute attr = TupleDescAttr(tupdesc,
errpos->cur_attno - 1);
attname = NameStr(attr->attname);
}
else if (errpos->cur_attno == SelfItemPointerAttributeNumber)
attname = "ctid";
}
{
/*
* Error HINT block
*/
char *err_hint_mess0 = palloc(max_logged_byte_length * 2 + 1024); /* The longest hint message */
char *err_hint_mess;
char *value_text = NULL;
bool sqlite_value_as_hex_code = value_byte_size_blob_or_utf8 < max_logged_byte_length && ((GetDatabaseEncoding() != PG_UTF8 && value_aff == SQLITE3_TEXT) || (value_aff == SQLITE_BLOB));
/* Print problem SQLite value only for
* - integer,
* - float,
* - short BLOBs,
* - short text if database encoding is UTF-8
* incorrect output otherwise possible: UTF-8 in SQLite, but not supported charcters in PostgreSQL
*/
if ((value_byte_size_blob_or_utf8 < max_logged_byte_length && GetDatabaseEncoding() == PG_UTF8 && value_aff == SQLITE3_TEXT)
|| value_aff == SQLITE_INTEGER
|| value_aff == SQLITE_FLOAT)
value_text = (char *)sqlite3_value_text(errpos->val);
if (sqlite_value_as_hex_code)
{
const unsigned char *vt = sqlite3_value_text(errpos->val);
value_text = palloc (max_logged_byte_length * 2 + 1);
for (size_t i = 0; i < value_byte_size_blob_or_utf8; ++i)
sprintf(value_text + i * 2, "%02x", vt[i]);
}
err_hint_mess = err_hint_mess0;
err_hint_mess += sprintf(
err_hint_mess,
"SQLite value with \"%s\" affinity ",
sqlite_affinity
);
if (value_aff == SQLITE3_TEXT || value_aff == SQLITE_BLOB )
err_hint_mess += sprintf(
err_hint_mess,
"(%d bytes) ",
value_byte_size_blob_or_utf8 );
if (value_text != NULL)
{
if (sqlite_value_as_hex_code)
err_hint_mess += sprintf(
err_hint_mess,
"in hex : %s",
value_text );
else if (value_aff != SQLITE_INTEGER && value_aff != SQLITE_FLOAT)
err_hint_mess += sprintf(
err_hint_mess,
": '%s'",
value_text );
else
err_hint_mess += sprintf(
err_hint_mess,
": %s",
value_text );
}
err_hint_mess[1] = '\0';
errhint("%s", err_hint_mess0);
pfree(err_hint_mess0);
if (sqlite_value_as_hex_code)
pfree((char *)value_text);
}
{
/*
* Error CONTEXT block
*/
char *err_cont_mess0 = palloc(4 * NAMEDATALEN + 64); /* The longest context message */
char *err_cont_mess;
err_cont_mess = err_cont_mess0;
err_cont_mess = err_cont_mess + sprintf(
err_cont_mess,
"foreign table \"%s\" foreign column \"%.*s\" have data type \"%s\" (usual affinity \"%s\"), ",
relname,
(int)sizeof(pgColND.data),
pgColND.data,
pg_dataTypeName,
pg_good_affinity
);
if (relname && is_wholerow)
{
err_cont_mess = err_cont_mess + sprintf(
err_cont_mess,
"in query there is whole-row reference to foreign table"
);
}
else if (relname && attname)
{
err_cont_mess = err_cont_mess + sprintf(
err_cont_mess,
"in query there is reference to foreign column"
);
}
else
{
err_cont_mess = err_cont_mess + sprintf(
err_cont_mess,
"processing expression at position %d in select list",
errpos->cur_attno
);
}
err_cont_mess[1] = '\0';
errcontext("%s", err_cont_mess0);
pfree(err_cont_mess0);
}
}
================================================
FILE: sqlite_fdw.control
================================================
# sqlite FDW
comment = 'SQLite Foreign Data Wrapper'
default_version = '1.1'
module_pathname = '$libdir/sqlite_fdw'
relocatable = true
================================================
FILE: sqlite_fdw.h
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* Portions Copyright (c) 2018, TOSHIBA CORPORATION
*
* IDENTIFICATION
* sqlite_fdw.h
*
*-------------------------------------------------------------------------
*/
#ifndef SQLITE_FDW_H
#define SQLITE_FDW_H
#include "sqlite3.h"
#if (PG_VERSION_NUM >= 120000)
#include "nodes/pathnodes.h"
#include "access/table.h"
#include "utils/float.h"
#include "optimizer/optimizer.h"
#else
#include "nodes/relation.h"
#include "optimizer/var.h"
#endif
#include "funcapi.h"
#include "fmgr.h"
#include "foreign/foreign.h"
#include "lib/stringinfo.h"
#include "utils/rel.h"
#include "funcapi.h"
#define SQLITE_PREFETCH_ROWS 100
#define SQLITE_BLKSIZ (1024 * 4)
#define SQLITE_PORT 3306
#define MAXDATALEN 1024 * 64
#define WAIT_TIMEOUT 0
#define INTERACTIVE_TIMEOUT 0
#define CR_NO_ERROR 0
#define SQLITE_FDW_BIT_DATATYPE_BUF_SIZE sizeof(sqlite3_int64) * CHAR_BIT + 1
#define MACADDR_LEN 6
#define MACADDR8_LEN 8
#if (PG_VERSION_NUM < 120000)
#define table_close(rel, lock) heap_close(rel, lock)
#define table_open(rel, lock) heap_open(rel, lock)
#define exec_rt_fetch(rtindex, estate) rt_fetch(rtindex, estate->es_range_table)
#endif
/* Code version is updated at new release. */
#define CODE_VERSION 20500
#if (PG_VERSION_NUM < 100000)
/*
* Is the given relation a simple relation i.e a base or "other" member
* relation?
*/
#define IS_SIMPLE_REL(rel) \
((rel)->reloptkind == RELOPT_BASEREL || \
(rel)->reloptkind == RELOPT_OTHER_MEMBER_REL)
/* Is the given relation a join relation? */
#define IS_JOIN_REL(rel) \
((rel)->reloptkind == RELOPT_JOINREL)
/* Is the given relation an upper relation? */
#define IS_UPPER_REL(rel) \
((rel)->reloptkind == RELOPT_UPPER_REL)
/* Is the given relation an "other" relation? */
#define IS_OTHER_REL(rel) \
((rel)->reloptkind == RELOPT_OTHER_MEMBER_REL)
#endif
#if PG_VERSION_NUM < 130000
#define list_concat(X, Y) list_concat(X, list_copy(Y))
#endif
#if PG_VERSION_NUM < 120000
/* NullableDatum is introduced from PG12, we define it here in case of PG11 or earlier. */
typedef struct NullableDatum
{
#define FIELDNO_NULLABLE_DATUM_DATUM 0
Datum value;
#define FIELDNO_NULLABLE_DATUM_ISNULL 1
bool isnull;
/* due to alignment padding this could be used for flags for free */
} NullableDatum;
#endif
/*
* Options structure to store the Sqlite
* server information
*/
typedef struct sqlite_opt
{
int svr_port; /* SQLite port number */
char *svr_address; /* SQLite server ip address */
char *svr_database; /* SQLite database name */
char *svr_table; /* SQLite table name */
char *svr_init_command; /* SQLite SQL statement to execute when
* connecting to the SQLite server. */
unsigned long max_blob_size; /* Max blob size to read without
* truncation */
} sqlite_opt;
/* Struct for extra information passed to sqlite_estimate_path_cost_size() */
typedef struct SqliteFdwPathExtraData
{
PathTarget *target;
bool has_final_sort;
bool has_limit;
double limit_tuples;
int64 count_est;
int64 offset_est;
} SqliteFdwPathExtraData;
/*
* FDW-specific information for ForeignScanState
* fdw_state.
*/
typedef struct SQLiteFdwExecState
{
ForeignServer *server; /* Foreign server handle */
ForeignTable *table; /* Foreign scan deal with this foreign table */
sqlite3 *conn; /* SQLite connection handle */
sqlite3_stmt *stmt; /* SQLite prepared stament handle */
char *query; /* Query string */
Relation rel; /* relcache entry for the foreign table */
TupleDesc tupdesc; /* tuple descriptor of scan */
AttInMetadata *attinmeta; /* attribute datatype conversion */
List *retrieved_attrs; /* list of target attribute numbers */
bool cursor_exists; /* have we created the cursor? */
int numParams; /* number of parameters passed to query */
FmgrInfo *param_flinfo; /* output conversion functions for them */
List *param_exprs; /* executable expressions for param values */
const char **param_values; /* textual values of query parameters */
Oid *param_types; /* type of query parameters */
int p_nums; /* number of parameters to transmit */
FmgrInfo *p_flinfo; /* output conversion functions for them */
/* batch operation stuff */
int num_slots; /* number of slots to insert */
char *orig_query; /* original text of INSERT command */
List *target_attrs; /* list of target attribute numbers */
int values_end; /* length up to the end of VALUES */
sqlite_opt *sqliteFdwOptions; /* SQLite FDW options */
List *attr_list; /* query attribute list */
List *column_list; /* Column list of SQLite Column structures */
int64 row_nums; /* number of rows */
Datum **rows; /* all rows of scan */
int64 rowidx; /* current index of rows */
bool **rows_isnull; /* is null */
bool for_update; /* true if this scan is update target */
int batch_size; /* value of FDW option "batch_size" */
/* working memory context */
MemoryContext temp_cxt; /* context for per-tuple temporary data */
AttrNumber *junk_idx;
} SqliteFdwExecState;
typedef struct SqliteFdwRelationInfo
{
/*
* True means that the relation can be pushed down. Always true for simple
* foreign scan.
*/
bool pushdown_safe;
/* baserestrictinfo clauses, broken down into safe and unsafe subsets. */
List *remote_conds;
List *local_conds;
/* Actual remote restriction clauses for scan (sans RestrictInfos) */
List *final_remote_exprs;
/* Estimated size and cost for a scan or join. */
double rows;
int width;
Cost startup_cost;
Cost total_cost;
/* Costs excluding costs for transferring data from the foreign server */
double retrieved_rows;
Cost rel_startup_cost;
Cost rel_total_cost;
/* Options extracted from catalogs. */
Cost fdw_startup_cost;
Cost fdw_tuple_cost;
/* Bitmap of attr numbers we need to fetch from the remote server. */
Bitmapset *attrs_used;
/* True means that the query_pathkeys is safe to push down */
bool qp_is_pushdown_safe;
/* Cost and selectivity of local_conds. */
QualCost local_conds_cost;
Selectivity local_conds_sel;
/* Selectivity of join conditions */
Selectivity joinclause_sel;
/* Join information */
RelOptInfo *outerrel;
RelOptInfo *innerrel;
JoinType jointype;
List *joinclauses;
/* Upper relation information */
UpperRelationKind stage;
/* Cached catalog information. */
ForeignTable *table;
ForeignServer *server;
int fetch_size; /* fetch size for this remote table */
/*
* Name of the relation while EXPLAINing ForeignScan. It is used for join
* relations but is set for all relations. For join relation, the name
* indicates which foreign tables are being joined and the join type used.
*/
char *relation_name;
/* Grouping information */
List *grouped_tlist;
/* Subquery information */
bool make_outerrel_subquery; /* do we deparse outerrel as a
* subquery? */
bool make_innerrel_subquery; /* do we deparse innerrel as a
* subquery? */
Relids lower_subquery_rels; /* all relids appearing in lower
* subqueries */
#if (PG_VERSION_NUM >= 170000)
Relids hidden_subquery_rels; /* relids, which can't be referred to
* from upper relations, used
* internally for equivalence member
* search */
#endif
/*
* Index of the relation. It is used to create an alias to a subquery
* representing the relation.
*/
int relation_index;
/* Function pushdown surppot in target list */
bool is_tlist_func_pushdown;
} SqliteFdwRelationInfo;
/*
* Execution state of a foreign scan that modifies a foreign table directly.
*/
typedef struct SqliteFdwDirectModifyState
{
ForeignServer *server; /* Foreign server handle */
ForeignTable *table; /* Foreign scan deal with this foreign table */
Relation rel; /* relcache entry for the foreign table */
AttInMetadata *attinmeta; /* attribute datatype conversion metadata */
/* extracted fdw_private data */
char *query; /* text of UPDATE/DELETE command */
bool has_returning; /* is there a RETURNING clause? */
List *retrieved_attrs; /* attr numbers retrieved by RETURNING */
bool set_processed; /* do we set the command es_processed? */
/* for remote query execution */
sqlite3 *conn; /* connection for the update */
sqlite3_stmt *stmt; /* SQLite prepared stament handle */
int numParams; /* number of parameters passed to query */
FmgrInfo *param_flinfo; /* output conversion functions for them */
List *param_exprs; /* executable expressions for param values */
const char **param_values; /* textual values of query parameters */
Oid *param_types; /* type of query parameters */
/* for storing result tuples */
int num_tuples; /* # of result tuples */
int next_tuple; /* index of next one to return */
Relation resultRel; /* relcache entry for the target relation */
AttrNumber *attnoMap; /* array of attnums of input user columns */
AttrNumber ctidAttno; /* attnum of input ctid column */
AttrNumber oidAttno; /* attnum of input oid column */
bool hasSystemCols; /* are there system columns of resultRel? */
/* working memory context */
MemoryContext temp_cxt; /* context for per-tuple temporary data */
} SqliteFdwDirectModifyState;
typedef struct blobOutput
{
const char* dat;
int len;
} blobOutput;
extern bool sqlite_is_foreign_expr(PlannerInfo *root,
RelOptInfo *baserel,
Expr *expr);
extern bool sqlite_is_foreign_param(PlannerInfo *root,
RelOptInfo *baserel,
Expr *expr);
extern bool sqlite_is_foreign_pathkey(PlannerInfo *root,
RelOptInfo *baserel,
PathKey *pathkey);
extern bool sqlite_is_foreign_function_tlist(PlannerInfo *root,
RelOptInfo *baserel,
List *tlist);
extern bool sqlite_is_builtin(Oid objectId);
extern EquivalenceMember *sqlite_find_em_for_rel(PlannerInfo *root,
EquivalenceClass *ec,
RelOptInfo *rel);
extern EquivalenceMember *sqlite_find_em_for_rel_target(PlannerInfo *root,
EquivalenceClass *ec,
RelOptInfo *fallbackRel);
/* Base ∞ constants */
extern const char * infs;
extern const char * infl;
extern const char hex_dig[];
/* in sqlite_fdw.c */
extern int sqlite_set_transmission_modes(void);
extern void sqlite_reset_transmission_modes(int nestlevel);
extern const int sqlite_affinity_code(char* t);
/* option.c headers */
extern sqlite_opt * sqlite_get_options(Oid foreigntableid);
/* depare.c headers */
extern void sqlite_deparse_select_stmt_for_rel(StringInfo buf, PlannerInfo *root, RelOptInfo *rel,
List *tlist, List *remote_conds, List *pathkeys,
bool has_final_sort, bool has_limit, bool is_subquery,
List **retrieved_attrs, List **params_list);
extern void sqlite_deparse_insert(StringInfo buf, PlannerInfo *root, Index rtindex, Relation rel, List *targetAttrs, bool doNothing, int *values_end_len);
#if PG_VERSION_NUM >= 140000
extern void sqlite_rebuild_insert(StringInfo buf, Relation rel, char *orig_query, List *target_attrs, int values_end_len, int num_params, int num_rows);
extern void sqlite_deparse_truncate(StringInfo buf, List *rels);
#endif
extern void sqlite_deparse_update(StringInfo buf, PlannerInfo *root, Index rtindex, Relation rel, List *targetAttrs, List *attname);
extern void sqlite_deparse_direct_update_sql(StringInfo buf, PlannerInfo *root,
Index rtindex, Relation rel,
RelOptInfo *foreignrel,
List *targetlist,
List *targetAttrs,
List *remote_conds,
List **params_list,
List **retrieved_attrs);
extern void sqlite_deparse_delete(StringInfo buf, PlannerInfo *root, Index rtindex, Relation rel, List *name);
extern void sqlite_deparse_direct_delete_sql(StringInfo buf, PlannerInfo *root,
Index rtindex, Relation rel,
RelOptInfo *foreignrel,
List *remote_conds,
List **params_list,
List **retrieved_attrs);
extern void sqlite_deparse_analyze(StringInfo buf, char *dbname, char *relname);
extern void sqlite_deparse_string_literal(StringInfo buf, const char *val);
extern List *sqlite_build_tlist_to_deparse(RelOptInfo *foreignrel);
int sqlite_set_transmission_modes(void);
void sqlite_reset_transmission_modes(int nestlevel);
extern const char *sqlite_get_jointype_name(JoinType jointype);
extern void sqlite_classify_conditions(PlannerInfo *root,
RelOptInfo *baserel,
List *input_conds,
List **remote_conds,
List **local_conds);
/* connection.c headers */
sqlite3 *sqlite_get_connection(ForeignServer *server, bool truncatable);
sqlite3 *sqlite_connect(char *svr_address, char *svr_username, char *svr_password, char *svr_database,
int svr_port, bool svr_sa, char *svr_init_command,
char *ssl_key, char *ssl_cert, char *ssl_ca, char *ssl_capath,
char *ssl_cipher);
void sqlite_cleanup_connection(void);
void sqlite_rel_connection(sqlite3 * conn);
void sqlitefdw_report_error(int elevel, sqlite3_stmt * stmt, sqlite3 * conn, const char *sql, int rc);
void sqlite_cache_stmt(ForeignServer *server, sqlite3_stmt * *stmt);
NullableDatum sqlite_convert_to_pg(Form_pg_attribute att, sqlite3_value * val, AttInMetadata *attinmeta, AttrNumber attnum, int sqlite_value_affinity, int AffinityBehaviourFlags);
void sqlite_bind_sql_var(Form_pg_attribute att, int attnum, Datum value, sqlite3_stmt * stmt, bool *isnull, Oid relid);
extern void sqlite_do_sql_command(sqlite3 * conn, const char *sql, int level, List **busy_connection);
void sqlite_fdw_data_norm_functs_init(sqlite3* db);
/* sqlite_query.c headers */
sqlite3_int64 binstr2int64(const char *s);
bool listed_datatype (const char * tn, const char ** arr);
blobOutput sqlite_datum_to_blob (Datum value);
bool listed_datatype_oid (Oid atttypid, int32 atttypmod, const char **arr);
/* sqlite_gis.c headers */
extern const char *postGisSpecificTypes[];
extern const char *postGisSQLiteCompatibleTypes[];
#ifdef SQLITE_FDW_GIS_ENABLE
char* SpatiaLiteAsPostGISgeom (blobOutput spatiaLiteBlob, Form_pg_attribute att);
blobOutput PostGISgeomAsSpatiaLite (Datum value, Form_pg_attribute att);
void sqlite_deparse_PostGIS_value(StringInfo buf, char *extval);
#endif
#endif /* SQLITE_FDW_H */
================================================
FILE: sqlite_fdw.vcxproj
================================================
Debug
Win32
Release
Win32
Debug
x64
Release
x64
15.0
Win32Proj
{C874C880-ED35-4F64-A9EF-D6F6B41935B6}
DynamicLibrary
v141
8.1
$(ProgramFiles)
$(ProgramW6432)
12
$(pf)\PostgreSQL\$(pgversion)
true
$(pgroot)\include;$(pgroot)\include\server;$(pgroot)\include\server\port\win32;$(pgroot)\include\server\port\win32_msvc;$(IncludePath)
$(pgroot)\lib;$(LibraryPath)
true
x86-windows-static
x64-windows-static
CompileAsC
postgres.lib;sqlite3.lib;%(AdditionalDependencies)
USE_ASSERT_CHECKING
MultiThreadedDebug
ProgramDatabase
Disabled
EnableFastChecks
Guard
MultiThreaded
true
true
UseLinkTimeCodeGeneration
================================================
FILE: sqlite_gis.c
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* Portions Copyright (c) 2018, TOSHIBA CORPORATION
*
* IDENTIFICATION
* sqlite_gis.c
*
* Routines that convert between SpatiaLite BLOB storage form and PostGIS EWKB
* and constants for detecting data type names from PostGIS set
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "sqlite_fdw.h"
#ifdef SQLITE_FDW_GIS_ENABLE
#include
#endif
#include
#include "nodes/makefuncs.h"
#include "parser/parse_type.h"
#include "utils/lsyscache.h"
#ifdef SQLITE_FDW_GIS_ENABLE
static void
common_EWKB_error (Form_pg_attribute att, int len, const char* data, bool direction_to_pg);
static char*
getHexFormOfBlob(blobOutput b);
#endif
/*
* Byte length of PostGIS/GEOS copyed image
* of geoobject initial data for testing or
* extracting SRID data
*/
#define EWKB_SRID_TEST_PREFIX_LEN 12
/*
* This is data types from PostGIS 3.4. For a newer version use the following query
* select pt.typname, pt."oid", pd.description,
* pt.typinput, pt.typoutput
* from pg_catalog.pg_type pt
* inner join pg_catalog.pg_description pd
* on pt."oid" = pd.objoid
* where pd.description like 'postgis %'
*/
const char *postGisSpecificTypes[] =
{
"addbandarg", "box2d", "box3d", "geometry_dump", "geomval",
"getfaceedges_returntype", "rastbandarg", "raster", "reclassarg",
"summarystats", "topoelement", "topoelementarray", "topogeometry",
"unionarg", "validatetopology_returntype", NULL
};
const char *postGisSQLiteCompatibleTypes[] = { "geometry", "geography", NULL };
#ifdef SQLITE_FDW_GIS_ENABLE
/*
* SpatiaLiteAsPostGISgeom
* Converts SpatiaLite BLOB to hex value string for PostGIS/GEOS input function
*/
char *
SpatiaLiteAsPostGISgeom (blobOutput spatiaLiteBlob, Form_pg_attribute att)
{
gaiaOutBuffer out_buf;
gaiaGeomCollPtr geo = NULL;
int gpkg_amphibious = 0;
int gpkg_mode = 0;
int res_len = 0;
char *res = NULL;
geo = gaiaFromSpatiaLiteBlobWkbEx ((unsigned char *)spatiaLiteBlob.dat,
spatiaLiteBlob.len,
gpkg_mode,
gpkg_amphibious);
if (geo == NULL)
{
common_EWKB_error (att,
spatiaLiteBlob.len,
getHexFormOfBlob(spatiaLiteBlob),
true);
}
else
{
gaiaOutBufferInitialize (&out_buf);
gaiaToEWKB (&out_buf, geo);
gaiaFreeGeomColl (geo);
if (out_buf.Error || out_buf.Buffer == NULL)
{
gaiaOutBufferReset (&out_buf);
common_EWKB_error (att,
spatiaLiteBlob.len,
getHexFormOfBlob(spatiaLiteBlob),
true);
}
else
{
res_len = out_buf.WriteOffset + 1; /* Include \0 on the end */
res = (char*) palloc(res_len*sizeof(char));
strcpy(res, out_buf.Buffer);
gaiaOutBufferReset (&out_buf);
return res;
}
}
return NULL;
}
/*
* getHexFormOfBlob
* Return normal ASCII hex string for a bytes of input data BLOB
*/
static char*
getHexFormOfBlob(blobOutput b)
{
const char *bstr = b.dat;
char* hstr = (char*)palloc(b.len * 2 + 1);
unsigned char *phstr = (unsigned char *)hstr;
for (int i = 0; i < b.len; i++)
{
if (bstr[i] == -128)
{
*phstr++ = '0';
*phstr++ = '0';
} else {
*phstr++ = hex_dig[((bstr[i] >> 4) & 0x0F)];
*phstr++ = hex_dig[((bstr[i]) & 0x0F)];
}
}
*phstr++ = '\0';
return hstr;
}
/*
* hasSRID
* Returns true if there is any SRID data in hex input of EWKB
* in other cases, including damaged input data, returns false
*/
static inline bool hasSRID (char *hexEWKB)
{
unsigned char *blob = NULL;
int blob_size;
const int wkbSRID = 0x20000000; /* See PostGIS file doc/ZMSgeoms.txt */
int endian;
int endian_arch = gaiaEndianArch ();
int srid;
char hexPrefix[EWKB_SRID_TEST_PREFIX_LEN + 1]; /* also reserved for \0 */
int i;
/* Copy only some initial hex byte images to get SRID flag and SRID value */
for (i = 0; i < EWKB_SRID_TEST_PREFIX_LEN && hexEWKB[i] != '\0'; i++) {
hexPrefix[i] = hexEWKB[i];
}
hexPrefix[i] = '\0'; /* Null-terminate the substring */
blob = gaiaParseHexEWKB ((const unsigned char *)hexPrefix, &blob_size);
if (blob == NULL)
return false;
endian = (*(blob + 0) == 0x01);
/* wkbSRID flag bytes 1-5. PostGIS doc/ZMSgeoms.txt */
srid = gaiaImport32 (blob + 1, endian, endian_arch);
free(blob);
return (srid & wkbSRID) == wkbSRID;
}
/*
* EWKB2SpatiaLiteBlobImage
* Uses char* and len struncture for SQLite BLOB binding from
* input hex string with possible EWKB presentation
*/
static inline blobOutput
EWKB2SpatiaLiteBlobImage (char *hexEWKB, Form_pg_attribute att)
{
gaiaGeomCollPtr geo = NULL;
int gpkg_mode = 0;
int tiny_point = 0;
unsigned char *spatialite_blob = NULL;
int len = strlen(hexEWKB);
char *src = NULL;
int shift = 0;
/* Ignore leading '\x' in hex data */
if (hexEWKB[0] == '\\' && hexEWKB[1] == 'x')
shift = 2;
src = hexEWKB + shift;
if (!hasSRID(src))
{
if (att != NULL)
{
char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(att->atttypid, att->atttypmod));
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("SpatiaLite doesn't accept GIS data without SRID"),
errhint("In column \"%.*s\" with data type \"%s\" there is incorrect value in %d bytes", (int)sizeof(att->attname.data), att->attname.data, pg_dataTypeName, len),
errcontext("Hex data: %s", hexEWKB)));
}
else
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("SpatiaLite doesn't accept GIS data without SRID"),
errhint("Not deparsable value for SpatiaLite in %d bytes", len),
errcontext("Hex data: %s", hexEWKB)));
pfree(hexEWKB);
return (struct blobOutput){NULL, 0};
}
geo = gaiaFromEWKB ((const unsigned char *)src);
if (NULL == geo)
{
common_EWKB_error(att, len/2, hexEWKB, false);
}
elog(DEBUG4, "sqlite_fdw : PostGIS -> SpatiaLite %s", hexEWKB);
gaiaToSpatiaLiteBlobWkbEx2 (geo, &spatialite_blob, &len, gpkg_mode, tiny_point);
gaiaFreeGeomColl (geo);
pfree(hexEWKB);
return (struct blobOutput){(char *)spatialite_blob, len};
}
/*
* PostGISgeomAsSpatiaLite
* Converts PostGIS/GEOS BLOB as Datum + attribute metadata to SpatiaLite BLOB
*/
blobOutput
PostGISgeomAsSpatiaLite (Datum d, Form_pg_attribute att)
{
char *pgHexOutput = NULL;
Oid outputFunctionId = InvalidOid;
bool typeVarLength = false;
getTypeOutputInfo(att->atttypid, &outputFunctionId, &typeVarLength);
pgHexOutput = OidOutputFunctionCall(outputFunctionId, d);
return EWKB2SpatiaLiteBlobImage (pgHexOutput, att);
}
/*
* common_EWKB_error
* Message about error inside of both PostGIS/GEOS<->SpatiaLite transformations
*/
static void
common_EWKB_error (Form_pg_attribute att, int len, const char* data, bool direction_to_pg)
{
Oid pgtyp = att->atttypid;
int32 pgtypmod = att->atttypmod;
NameData pgColND = att->attname;
char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(pgtyp, pgtypmod));
if (direction_to_pg)
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("GIS data transformation error SpatiaLite->GEOS/PostGIS"),
errhint("In column \"%.*s\" with data type \"%s\" there is incorrect value in %d bytes", (int)sizeof(pgColND.data), pgColND.data, pg_dataTypeName, len),
errcontext("Hex data: %s", data)));
else
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("GIS data transformation error GEOS/PostGIS->SpatiaLite"),
((att != NULL) ? (errhint("In column \"%.*s\" with data type \"%s\" there is incorrect value in %d bytes", (int)sizeof(pgColND.data), pgColND.data, pg_dataTypeName, len)): (errhint("Not deparsable value for SpatiaLite in %d bytes", len))),
errcontext("Hex data: %s", data)));
}
/*
* sqlite_deparse_PostGIS_value
* Transform PostGIS/GEOS value from extval to SpatiaLite hex constant
* for a SQLite query. SQLite constant format is EWKB.
*/
void
sqlite_deparse_PostGIS_value(StringInfo buf, char *extval)
{
blobOutput bO = EWKB2SpatiaLiteBlobImage (extval, NULL);
char* hexform = getHexFormOfBlob(bO);
appendStringInfo(buf, "X\'%s\'", hexform);
elog(DEBUG4, "sqlite_fdw : SpatiaLiteData %s", hexform);
pfree(hexform);
}
#endif
================================================
FILE: sqlite_query.c
================================================
/*-------------------------------------------------------------------------
*
* SQLite Foreign Data Wrapper for PostgreSQL
*
* Portions Copyright (c) 2018, TOSHIBA CORPORATION
*
* IDENTIFICATION
* sqlite_query.c
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "sqlite_fdw.h"
#ifdef SQLITE_FDW_GIS_ENABLE
#include
#endif
#include
#include "catalog/pg_type_d.h"
#include "commands/defrem.h"
#include "mb/pg_wchar.h"
#include "nodes/makefuncs.h"
#include "parser/parse_type.h"
#include "utils/builtins.h"
#include "utils/inet.h"
#include "utils/jsonb.h"
#include "utils/lsyscache.h"
#include "utils/timestamp.h"
#include "utils/uuid.h"
static char *
get_column_option_string(Oid relid, int varattno, char *optionname);
static char *
sqlite_text_value_to_pg_db_encoding(sqlite3_value *val);
static char *
int642binstr(sqlite3_int64 num, char *s, size_t len);
static inline blobOutput
sqlite_make_JSONb (char* s);
/*
* sqlite_value_to_pg_error
* Human readable message about disallowed combination of PostgreSQL columnn
* data type and SQLite data value affinity
*/
static void
sqlite_value_to_pg_error()
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("SQLite value is not compatible with PostgreSQL column data type")));
}
/*
* pg_column_void_text_error
* Human readable message about disallowed void text for the PostgreSQL columnn
*/
static void
pg_column_void_text_error()
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("Void text disallowed this column")));
}
/*
* convert_sqlite_to_pg
* Converts SQLite value into PostgreSQL's Datum
*/
NullableDatum
sqlite_convert_to_pg(Form_pg_attribute att, sqlite3_value * val, AttInMetadata *attinmeta, AttrNumber attnum, int sqlite_value_affinity, int AffinityBehaviourFlags)
{
Oid pgtyp = att->atttypid;
Datum value_datum = 0;
char *valstr = NULL;
/* Compute always, void text and void BLOB is special cases */
int value_byte_size_blob_or_utf8 = sqlite3_value_bytes(val);
switch (pgtyp)
{
/* popular first */
case VARCHAROID:
case CHAROID:
case TEXTOID:
case DATEOID:
case TIMEOID:
case NAMEOID:
case BPCHAROID:
{
valstr = sqlite_text_value_to_pg_db_encoding(val);
/* use valstr after switch */
break;
}
case BOOLOID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
int value = sqlite3_value_int(val);
return (struct NullableDatum){BoolGetDatum(value), false};
}
case SQLITE_FLOAT:
case SQLITE_BLOB:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
sqlite_value_to_pg_error();
else
pg_column_void_text_error();
break;
}
default:
{
sqlite_value_to_pg_error();
break;
}
}
break;
}
case BYTEAOID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER:
case SQLITE_FLOAT:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE_BLOB: /* <-- proper and recommended SQLite affinity of value for pgtyp */
case SQLITE3_TEXT: /* treated as UTF-8 text BLOB */
{
value_datum = (Datum) palloc0(value_byte_size_blob_or_utf8 + VARHDRSZ);
memcpy(VARDATA(value_datum), sqlite3_value_blob(val), value_byte_size_blob_or_utf8);
SET_VARSIZE(value_datum, value_byte_size_blob_or_utf8 + VARHDRSZ);
return (struct NullableDatum) {PointerGetDatum((const void *)value_datum), false};
}
}
break;
}
case INT2OID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
sqlite_int64 i64v = sqlite3_value_int64(val);
Datum d = DirectFunctionCall1(int82, Int64GetDatum((int64) i64v));
return (struct NullableDatum) {d, false};
}
case SQLITE_FLOAT:
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
sqlite_value_to_pg_error();
else
pg_column_void_text_error();
break;
}
}
break;
}
case INT4OID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
sqlite_int64 i64v = sqlite3_value_int64(val);
Datum d = DirectFunctionCall1(int84, Int64GetDatum((int64) i64v));
return (struct NullableDatum) {d, false};
}
case SQLITE_FLOAT: /* TODO: This code is untill mod() pushdowning fix here */
{
int value = sqlite3_value_int(val);
elog(DEBUG2, "sqlite_fdw : real aff. was readed for pg int32");
return (struct NullableDatum) {Int32GetDatum(value), false};
}
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
sqlite_value_to_pg_error();
else
pg_column_void_text_error();
break;
}
}
break;
}
case INT8OID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
sqlite3_int64 value = sqlite3_value_int64(val);
return (struct NullableDatum) {Int64GetDatum(value), false};
}
case SQLITE_FLOAT: /* TODO: This code is untill mod() pushdowning fix here */
{
double value = sqlite3_value_double(val);
Datum d = DirectFunctionCall1(dtoi8, Float8GetDatum((float8) value));
elog(DEBUG2, "sqlite_fdw : real aff. was readed for pg int64");
return (struct NullableDatum) {d, false};
}
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
sqlite_value_to_pg_error();
else
pg_column_void_text_error();
break;
}
}
break;
}
case FLOAT4OID:
{
switch (sqlite_value_affinity)
{
case SQLITE_FLOAT: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
double value = sqlite3_value_double(val);
Datum d = DirectFunctionCall1(dtof, Float8GetDatum((float8)value));
return (struct NullableDatum) {d, false};
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
{
const char* text_value = (const char*) sqlite3_value_text(val);
if (strcasecmp(text_value, "NaN") == 0)
return (struct NullableDatum) {Float8GetDatum(NAN), false};
else
sqlite_value_to_pg_error();
}
else
pg_column_void_text_error();
break;
}
case SQLITE_INTEGER:
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
}
break;
}
case FLOAT8OID:
{
switch (sqlite_value_affinity)
{
case SQLITE_FLOAT: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
double value = sqlite3_value_double(val);
return (struct NullableDatum) {Float8GetDatum((float8) value), false};
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
{
const char* text_value = (const char*) sqlite3_value_text(val);
if (strcasecmp(text_value, "NaN") == 0)
return (struct NullableDatum) {Float8GetDatum(NAN), false};
else
sqlite_value_to_pg_error();
}
else
pg_column_void_text_error();
break;
}
case SQLITE_INTEGER:
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
}
break;
}
case TIMESTAMPOID:
case TIMESTAMPTZOID:
{
/*
* We add this conversion to allow add INTEGER/FLOAT SQLite
* Columns be added as TimeStamp in PostgreSQL. We just
* calling PostgreSQL function "to_timestamp(double value)""
* to convert each registry returned from INT/FLOAT value to
* TimeStamp string, so PosgtreSQL can handle/show without
* problems. If it's a TEXT SQLite column...we let them to the
* "regular" process because its already implemented and
* working properly.
*/
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER:
{
Timestamp value = (Timestamp)sqlite3_value_int64(val);
return (struct NullableDatum) {TimestampGetDatum(value), false};
}
case SQLITE_FLOAT:
{
double value = sqlite3_value_double(val);
Datum d = DirectFunctionCall1(float8_timestamptz, Float8GetDatum((float8) value));
return (struct NullableDatum) {d, false};
}
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
valstr = sqlite_text_value_to_pg_db_encoding(val);
/* !!! use valstr later! */
else
pg_column_void_text_error();
break;
}
}
break;
}
case NUMERICOID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER:
case SQLITE_FLOAT: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
double value = sqlite3_value_double(val);
valstr = DatumGetCString(DirectFunctionCall1(float8out, Float8GetDatum((float8) value)));
break; /* !!! use valstr later! */
}
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
{
const char* text_value = (const char*) sqlite3_value_text(val);
if (strcasecmp(text_value, "NaN") == 0)
return (struct NullableDatum) {Float8GetDatum(NAN), false};
else
sqlite_value_to_pg_error();
}
else
pg_column_void_text_error();
break;
}
}
break;
}
case UUIDOID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER:
case SQLITE_FLOAT:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE_BLOB: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
if (value_byte_size_blob_or_utf8 != UUID_LEN)
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("PostgreSQL uuid data type allows only %d bytes SQLite blob value", UUID_LEN)));
break;
}
else
{
const unsigned char * sqlite_blob = 0;
pg_uuid_t *retval = (pg_uuid_t *) palloc0(sizeof(pg_uuid_t));
sqlite_blob = sqlite3_value_blob(val);
memcpy(retval->data, sqlite_blob, UUID_LEN);
return (struct NullableDatum){UUIDPGetDatum(retval), false};
break;
}
}
/*
* SQLite UUID output always normalized to blob.
* In sqlite_data_norm.c there is special additional C function.
*/
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
sqlite_value_to_pg_error();
else
pg_column_void_text_error();
break;
}
default:
{
sqlite_value_to_pg_error();
break;
}
}
break;
}
case MACADDROID:
case MACADDR8OID:
{
switch (sqlite_value_affinity)
{
/*
* SQLite MAC address output always normalized to int64.
* In sqlite_data_norm.c there is special additional C function.
*/
case SQLITE_INTEGER: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
sqlite3_int64 value = sqlite3_value_int64(val);
if (pgtyp == MACADDROID)
{
macaddr* retval;
/* maximal int64 for macaddr 6b */
const sqlite3_uint64 max = (1ULL << (6 * CHAR_BIT)) - 1ULL;
if (value > max )
ereport(ERROR,
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
errmsg("int64 for macaddr out of range")));
retval = (macaddr *) palloc(sizeof(macaddr));
retval->a = (value >> (CHAR_BIT * 5)) & 0xFF;
retval->b = (value >> (CHAR_BIT * 4)) & 0xFF;
retval->c = (value >> (CHAR_BIT * 3)) & 0xFF;
retval->d = (value >> (CHAR_BIT * 2)) & 0xFF;
retval->e = (value >> (CHAR_BIT * 1)) & 0xFF;
retval->f = (value >> (CHAR_BIT * 0)) & 0xFF;
return (struct NullableDatum){MacaddrPGetDatum(retval), false};
}
else
{
macaddr8 * retval = (macaddr8 *) palloc(sizeof(macaddr8));
retval->a = (value >> (CHAR_BIT * 7)) & 0xFF;
retval->b = (value >> (CHAR_BIT * 6)) & 0xFF;
retval->c = (value >> (CHAR_BIT * 5)) & 0xFF;
retval->d = (value >> (CHAR_BIT * 4)) & 0xFF;
retval->e = (value >> (CHAR_BIT * 3)) & 0xFF;
retval->f = (value >> (CHAR_BIT * 2)) & 0xFF;
retval->g = (value >> (CHAR_BIT * 1)) & 0xFF;
retval->h = (value >> (CHAR_BIT * 0)) & 0xFF;
return (struct NullableDatum){Macaddr8PGetDatum(retval), false};
}
}
case SQLITE_FLOAT:
case SQLITE_BLOB:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
sqlite_value_to_pg_error();
else
pg_column_void_text_error();
break;
}
default:
{
sqlite_value_to_pg_error();
break;
}
}
break;
}
case VARBITOID:
case BITOID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
char * buffer = (char *) palloc0(SQLITE_FDW_BIT_DATATYPE_BUF_SIZE);
sqlite3_int64 sqlti = sqlite3_value_int64(val);
buffer = int642binstr(sqlti, buffer, SQLITE_FDW_BIT_DATATYPE_BUF_SIZE);
valstr = buffer;
elog(DEBUG4, "sqlite_fdw : BIT buf l=%ld v = %s", SQLITE_FDW_BIT_DATATYPE_BUF_SIZE, buffer);
break;
}
case SQLITE_FLOAT:
case SQLITE_BLOB:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:
{
if (value_byte_size_blob_or_utf8)
sqlite_value_to_pg_error();
else
pg_column_void_text_error();
break;
}
}
break;
}
case JSONOID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER:
case SQLITE_FLOAT:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE_BLOB:
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("you should disable column_type = text for this column, because there is possible jsonb value")));
break;
}
case SQLITE3_TEXT:/* <-- proper and recommended SQLite affinity of value for pgtyp */
{
if (value_byte_size_blob_or_utf8)
{
valstr = sqlite_text_value_to_pg_db_encoding(val);
/* use valstr after switch */
break;
}
else
pg_column_void_text_error();
break;
}
default:
{
sqlite_value_to_pg_error();
break;
}
}
break;
}
case JSONBOID:
{
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER:
case SQLITE_FLOAT:
case SQLITE_BLOB:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE3_TEXT:/* <-- there is normalization function for text affinity only output */
{
if (value_byte_size_blob_or_utf8)
{
valstr = sqlite_text_value_to_pg_db_encoding(val);
/* use valstr after switch */
break;
}
else
pg_column_void_text_error();
break;
}
default:
{
sqlite_value_to_pg_error();
break;
}
}
break;
}
default:
{
/*
* PostGIS data types can be supported only by name
* This is very rare and not fast algorythm branch
*/
char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(att->atttypid, att->atttypmod));
NameData pgColND = att->attname;
if (listed_datatype(pg_dataTypeName, postGisSpecificTypes))
{
elog(DEBUG4, "sqlite_fdw : is postGisSpecificType %s", pg_dataTypeName);
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("This data type is PostGIS specific and is not supported by SpatiaLite or sqlite_fdw"),
errhint("Data type: \"%s\" in column \"%.*s\"", pg_dataTypeName, (int)sizeof(pgColND.data), pgColND.data)));
}
if (listed_datatype(pg_dataTypeName, postGisSQLiteCompatibleTypes))
{
elog(DEBUG4, "sqlite_fdw : is postGisSQLiteCompatibleType");
switch (sqlite_value_affinity)
{
case SQLITE_INTEGER:
case SQLITE_FLOAT:
default:
{
sqlite_value_to_pg_error();
break;
}
case SQLITE_BLOB: /* <-- proper and recommended SQLite affinity of value for pgtyp */
{
#ifdef SQLITE_FDW_GIS_ENABLE
unsigned const char * p_blob = sqlite3_value_blob(val);
valstr = SpatiaLiteAsPostGISgeom (
(struct blobOutput){(const char *)p_blob, value_byte_size_blob_or_utf8},
att
);
/* !!! use valstr later! Hex Input */
#else
Oid atttypid = att->atttypid;
int32 atttypmod = att->atttypmod;
/*
* If a domain has been declared as bytea, it can support PostGIS data type
*/
atttypid = getBaseTypeAndTypmod(atttypid, &atttypmod);
if (atttypid == BYTEAOID)
{
value_datum = (Datum) palloc0(value_byte_size_blob_or_utf8 + VARHDRSZ);
memcpy(VARDATA(value_datum), sqlite3_value_blob(val), value_byte_size_blob_or_utf8);
SET_VARSIZE(value_datum, value_byte_size_blob_or_utf8 + VARHDRSZ);
return (struct NullableDatum) {PointerGetDatum((const void *)value_datum), false};
}
else
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("This PostGIS data type is supported by SpatiaLite, but FDW compiled without GIS data support"),
errhint("Data type: \"%s\" in column \"%.*s\"", pg_dataTypeName, (int)sizeof(pgColND.data), pgColND.data)));
#endif
break;
}
case SQLITE3_TEXT:
{
/* WKT data transport is not implemented */
sqlite_value_to_pg_error();
break;
}
}
}
else
{
/* common, not PostGIS case */
valstr = sqlite_text_value_to_pg_db_encoding(val);
}
}
break;
}
/* convert string value to appropriate type value */
value_datum = InputFunctionCall(&attinmeta->attinfuncs[attnum],
valstr,
attinmeta->attioparams[attnum],
attinmeta->atttypmods[attnum]);
return (struct NullableDatum){value_datum, false};
}
/*
* sqlite_datum_to_blob
* Common part of extracting and preparing PostgreSQL bytea data
* for SQLite binding as blob
*/
blobOutput
sqlite_datum_to_blob (Datum value)
{
int len;
char *dat = NULL;
char *result = DatumGetPointer(value);
if (VARATT_IS_1B(result))
{
len = VARSIZE_1B(result) - VARHDRSZ_SHORT;
dat = VARDATA_1B(result);
}
else
{
len = VARSIZE_4B(result) - VARHDRSZ;
dat = VARDATA_4B(result);
}
return (struct blobOutput){dat, len};
}
/*
* get_column_option_string
* By Oid of relation and varattno returns value of requested option
* of foreign table
*/
static char *
get_column_option_string(Oid relid, int varattno, char *optionname)
{
char *coloptionvalue = NULL;
List *options;
ListCell *lc;
options = GetForeignColumnOptions(relid, varattno);
foreach(lc, options)
{
DefElem *def = (DefElem *) lfirst(lc);
if (strcmp(def->defname, optionname) == 0)
{
coloptionvalue = defGetString(def);
break;
}
}
return coloptionvalue;
}
/*
* bind_sql_var
* Bind the values provided as DatumBind the values and nulls
* to modify the target table (INSERT/UPDATE)
*/
void
sqlite_bind_sql_var(Form_pg_attribute att, int attnum, Datum value, sqlite3_stmt * stmt, bool *isnull, Oid relid)
{
int ret = SQLITE_OK;
Oid type = att->atttypid;
int32 pgtypmod = att->atttypmod;
attnum++;
elog(DEBUG2, "sqlite_fdw : %s %d type=%u relid=%u typmod=%d ", __func__, attnum, type, relid, pgtypmod);
if (*isnull)
{
ret = sqlite3_bind_null(stmt, attnum);
if (ret != SQLITE_OK)
elog(ERROR, "sqlite3_bind_null failed with rc=%d", ret);
return;
}
switch (type)
{
/* popular first */
case TEXTOID:
case VARCHAROID:
case JSONOID:
case TIMESTAMPTZOID:
case DATEOID:
case NAMEOID:
case TIMEOID:
case TIMESTAMPOID:
case BPCHAROID:
{
/* Bind as text because SQLite does not have these types */
char *outputString = NULL;
Oid outputFunctionId = InvalidOid;
bool typeVarLength = false;
int pg_database_encoding = GetDatabaseEncoding(); /* very fast call, see PostgreSQL mbutils.c */
char *utf8_text_value = NULL;
getTypeOutputInfo(type, &outputFunctionId, &typeVarLength);
outputString = OidOutputFunctionCall(outputFunctionId, value);
if (pg_database_encoding == PG_UTF8)
utf8_text_value = outputString;
else
utf8_text_value = (char *) pg_do_encoding_conversion((unsigned char *) outputString, strlen(outputString), pg_database_encoding, PG_UTF8);
ret = sqlite3_bind_text(stmt, attnum, utf8_text_value, -1, SQLITE_TRANSIENT);
break;
}
case INT2OID:
{
int16 dat = DatumGetInt16(value);
ret = sqlite3_bind_int(stmt, attnum, dat);
break;
}
case INT4OID:
{
int32 dat = DatumGetInt32(value);
ret = sqlite3_bind_int(stmt, attnum, dat);
break;
}
case INT8OID:
{
int64 dat = DatumGetInt64(value);
ret = sqlite3_bind_int64(stmt, attnum, dat);
break;
}
case FLOAT4OID:
{
float4 dat = DatumGetFloat4(value);
ret = sqlite3_bind_double(stmt, attnum, (double) dat);
break;
}
case FLOAT8OID:
{
float8 dat = DatumGetFloat8(value);
ret = sqlite3_bind_double(stmt, attnum, dat);
break;
}
case NUMERICOID:
{
Datum value_datum = DirectFunctionCall1(numeric_float8, value);
float8 dat = DatumGetFloat8(value_datum);
ret = sqlite3_bind_double(stmt, attnum, dat);
break;
}
case BOOLOID:
{
int32 dat = DatumGetInt32(value);
ret = sqlite3_bind_int(stmt, attnum, dat);
break;
}
case BYTEAOID:
{
blobOutput b = sqlite_datum_to_blob(value);
ret = sqlite3_bind_blob(stmt, attnum, b.dat, b.len, SQLITE_TRANSIENT);
break;
}
case UUIDOID:
{
int sqlite_aff = SQLITE_NULL;
if (relid)
{
char * optv = get_column_option_string (relid, attnum, "column_type");
elog(DEBUG3, "sqlite_fdw : col type %s ", optv);
sqlite_aff = sqlite_affinity_code(optv);
}
if (sqlite_aff == SQLITE_BLOB)
{
unsigned char *dat = palloc0(UUID_LEN);
pg_uuid_t* pg_uuid = DatumGetUUIDP(value);
elog(DEBUG2, "sqlite_fdw : bind uuid as blob");
memcpy(dat, pg_uuid->data, UUID_LEN);
ret = sqlite3_bind_blob(stmt, attnum, dat, UUID_LEN, SQLITE_TRANSIENT);
}
else
{
/* uuid as text */
char *outputString = NULL;
Oid outputFunctionId = InvalidOid;
bool typeVarLength = false;
getTypeOutputInfo(type, &outputFunctionId, &typeVarLength);
outputString = OidOutputFunctionCall(outputFunctionId, value);
/* uuid text belongs to ASCII subset, no need to translate encoding */
ret = sqlite3_bind_text(stmt, attnum, outputString, -1, SQLITE_TRANSIENT);
}
break;
}
case MACADDROID:
case MACADDR8OID:
{
int sqlite_aff = SQLITE_INTEGER; /* default mac addr affinity */
if (relid)
{
char * optv = get_column_option_string (relid, attnum, "column_type");
elog(DEBUG3, "sqlite_fdw : column_type affinity %s ", optv);
sqlite_aff = sqlite_affinity_code(optv);
}
if (sqlite_aff == SQLITE3_TEXT)
{
char *outputString = NULL;
Oid outputFunctionId = InvalidOid;
bool typeVarLength = false;
elog(DEBUG2, "sqlite_fdw : bind mac as text");
getTypeOutputInfo(type, &outputFunctionId, &typeVarLength);
outputString = OidOutputFunctionCall(outputFunctionId, value);
/* MAC text belongs to ASCII subset, no need to translate encoding */
ret = sqlite3_bind_text(stmt, attnum, outputString, -1, SQLITE_TRANSIENT);
}
else if (sqlite_aff == SQLITE_BLOB)
{
if (type == MACADDROID)
{
unsigned char *mca = palloc0(MACADDR_LEN);
macaddr *m = DatumGetMacaddrP(value);
elog(DEBUG2, "sqlite_fdw : bind mac as blob");
mca[0] = m->a;
mca[1] = m->b;
mca[2] = m->c;
mca[3] = m->d;
mca[4] = m->e;
mca[5] = m->f;
ret = sqlite3_bind_blob(stmt, attnum, mca, MACADDR_LEN, SQLITE_TRANSIENT);
}
else
{
unsigned char *mca = palloc0(MACADDR8_LEN);
macaddr8 *m = DatumGetMacaddr8P(value);
elog(DEBUG2, "sqlite_fdw : bind mac8 as blob");
mca[0] = m->a;
mca[1] = m->b;
mca[2] = m->c;
mca[3] = m->d;
mca[4] = m->e;
mca[5] = m->f;
mca[6] = m->g;
mca[7] = m->h;
ret = sqlite3_bind_blob(stmt, attnum, mca, MACADDR8_LEN, SQLITE_TRANSIENT);
}
}
else /* default, INTEGER */
{
sqlite3_uint64 dat = 0;
if (type == MACADDROID)
{
macaddr *m = DatumGetMacaddrP(value);
dat = ((sqlite3_int64)(m->a) << (CHAR_BIT*5))
+ ((sqlite3_int64)(m->b) << (CHAR_BIT*4))
+ ((sqlite3_int64)(m->c) << (CHAR_BIT*3))
+ ((sqlite3_int64)(m->d) << (CHAR_BIT*2))
+ ((sqlite3_int64)(m->e) << (CHAR_BIT*1))
+ ((sqlite3_int64)(m->f) << (CHAR_BIT*0));
elog(DEBUG2, "sqlite_fdw : bind mac6 as integer %lld", dat);
}
else
{
macaddr8 *m = DatumGetMacaddr8P(value);
dat = ((sqlite3_int64)(m->a) << (CHAR_BIT*7))
+ ((sqlite3_int64)(m->b) << (CHAR_BIT*6))
+ ((sqlite3_int64)(m->c) << (CHAR_BIT*5))
+ ((sqlite3_int64)(m->d) << (CHAR_BIT*4))
+ ((sqlite3_int64)(m->e) << (CHAR_BIT*3))
+ ((sqlite3_int64)(m->f) << (CHAR_BIT*2))
+ ((sqlite3_int64)(m->g) << (CHAR_BIT*1))
+ ((sqlite3_int64)(m->h) << (CHAR_BIT*0));
elog(DEBUG2, "sqlite_fdw : bind mac8 as integer %lld", dat);
}
ret = sqlite3_bind_int64(stmt, attnum, dat);
}
break;
}
case VARBITOID:
case BITOID:
{
sqlite3_int64 dat;
char *outputString = NULL;
Oid outputFunctionId = InvalidOid;
bool typeVarLength = false;
getTypeOutputInfo(type, &outputFunctionId, &typeVarLength);
outputString = OidOutputFunctionCall(outputFunctionId, value);
elog(DEBUG4, "sqlite_fdw : BIT bind %s", outputString);
if (strlen(outputString) > SQLITE_FDW_BIT_DATATYPE_BUF_SIZE - 1 )
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("SQLite FDW dosens't support very long bit/varbit data"),
errhint("bit length %ld, maximum %ld", strlen(outputString), SQLITE_FDW_BIT_DATATYPE_BUF_SIZE - 1)));
}
dat = binstr2int64(outputString);
ret = sqlite3_bind_int64(stmt, attnum, dat);
break;
}
case JSONBOID:
{
/* Bind as text because there are different JSONb presentation formats in PostgreSQL and SQLite */
int pg_database_encoding = GetDatabaseEncoding(); /* very fast call, see PostgreSQL mbutils.c */
char *utf8_text_value = NULL;
Datum d = DirectFunctionCall1(jsonb_out, JsonbPGetDatum((const Jsonb *) value));
char *outputString = DatumGetCString(d);
blobOutput jsonb;
if (pg_database_encoding == PG_UTF8)
utf8_text_value = outputString;
else
utf8_text_value = (char *)pg_do_encoding_conversion((unsigned char *) outputString, strlen(outputString), pg_database_encoding, PG_UTF8);
jsonb = sqlite_make_JSONb(utf8_text_value);
ret = sqlite3_bind_blob(stmt, attnum, jsonb.dat, jsonb.len, SQLITE_TRANSIENT);
pfree((char *)jsonb.dat);
break;
}
default:
{
NameData pgColND = att->attname;
char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(type, pgtypmod));
/*
* PostGIS data types can be supported only by name
* This is very rare and not fast algorythm branch
*/
if (listed_datatype(pg_dataTypeName, postGisSQLiteCompatibleTypes))
{
#ifdef SQLITE_FDW_GIS_ENABLE
blobOutput b = PostGISgeomAsSpatiaLite(value, att);
ret = sqlite3_bind_blob(stmt, attnum, b.dat, b.len, SQLITE_TRANSIENT);
#else
Oid atttypid = att->atttypid;
int32 atttypmod = att->atttypmod;
/*
* If a domain has been declared as bytea,
* it can support PostGIS data type
*/
atttypid = getBaseTypeAndTypmod(atttypid, &atttypmod);
if (atttypid == BYTEAOID)
{
blobOutput b = sqlite_datum_to_blob(value);
ret = sqlite3_bind_blob(stmt, attnum, b.dat, b.len, SQLITE_TRANSIENT);
}
else
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("This PostGIS data type is supported by SpatiaLite, but FDW compiled without GIS data support"),
errhint("Data type: \"%s\" in column \"%.*s\"", pg_dataTypeName, (int)sizeof(pgColND.data), pgColND.data)));
#endif
break;
}
else if (listed_datatype(pg_dataTypeName, postGisSpecificTypes))
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("This data type is PostGIS specific and have not any SpatiaLite value"),
errhint("Data type: \"%s\" in column \"%.*s\"", pg_dataTypeName, (int)sizeof(pgColND.data), pgColND.data)));
else
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("cannot convert constant value to SQLite value"),
errhint("Constant value data type: \"%s\" in column \"%.*s\"", pg_dataTypeName, (int)sizeof(pgColND.data), pgColND.data)));
break;
}
}
if (ret != SQLITE_OK)
{
char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(type, pgtypmod));
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("Can't convert constant value to SQLite: %s",
sqlite3_errmsg(sqlite3_db_handle(stmt))),
errhint("Constant value data type: %s", pg_dataTypeName)));
}
}
/*
* sqlite_text_value_to_pg_db_encoding
* Converts SQLite text to PostgreSQL text with database encoding
*/
static char *
sqlite_text_value_to_pg_db_encoding(sqlite3_value *val)
{
int pg_database_encoding = GetDatabaseEncoding(); /* very fast call, see PostgreSQL mbutils.c */
char *utf8_text_value;
/* Text from this SQLite function is always UTF-8,
* see https://www.sqlite.org/c3ref/column_blob.html
*/
utf8_text_value = (char *) sqlite3_value_text(val);
if (pg_database_encoding == PG_UTF8)
return utf8_text_value;
else
{
/* There is no UTF16 in PostgreSQL for fast sqlite3_value_text16, hence always convert */
char * res = (char *) pg_do_encoding_conversion((unsigned char *) utf8_text_value, strlen(utf8_text_value), PG_UTF8, pg_database_encoding);
return res;
}
}
/*
* int642binstr
* Converts int64 from SQLite to PostgreSQL string from 0 and 1 only
* s must be allocated with length not less than len + 1 bytes
*/
static char *
int642binstr(sqlite3_int64 num, char *s, size_t len)
{
s[--len] = '\0';
do
s[--len] = ((num & 1) ? '1' : '0');
while ((num >>= 1) != 0);
return s + len;
}
/*
* binstr2int64
* Converts PostgreSQL string from 0 and 1 only to int64 for SQLite
*/
sqlite3_int64
binstr2int64(const char *s)
{
sqlite3_int64 rc = 0;
char *bs = (char *)s;
for (; '\0' != *bs; bs++)
{
if ('1' == *bs)
{
rc = (rc * 2) + 1;
}
else if ('0' == *bs)
{
rc *= 2;
}
else
{
ereport(ERROR, (errcode(ERRCODE_FDW_INVALID_DATA_TYPE),
errmsg("Not 0 or 1 in bit string"),
errhint("value: %s", s)));
}
}
return rc;
}
/*
* listed_datatype
* Checks if a name of data type belongs to array of special data type names
* used for PostGIS data type which have not stable Oid
*/
bool
listed_datatype (const char * tn, const char ** arr)
{
int i = 0;
char * n = strchr(tn, '.');
if ( n != NULL )
n = n + sizeof(char);
else
n = (char *)tn;
while(arr[i])
{
if(!strcmp(arr[i], n))
{
elog(DEBUG4, "sqlite_fdw : %s \"%s\" = \"%s\" ", __func__, tn, arr[i]);
return true;
}
i++;
}
return false;
}
/*
* listed_datatype_oid
* Checks if Oid of data type is one of Oids of listed data types
* listed in given array.
*/
bool
listed_datatype_oid(Oid atttypid, int32 atttypmod, const char** arr)
{
const char *pg_dataTypeName = TypeNameToString(makeTypeNameFromOid(atttypid, atttypmod));
bool listed = listed_datatype(pg_dataTypeName, arr);
elog(DEBUG2, "sqlite_fdw : %s : unusual data type %s, listed = %d", __func__, pg_dataTypeName, listed);
return listed;
}
static inline blobOutput
sqlite_make_JSONb (char* s)
{
int len = 0;
char *dat = NULL;
sqlite3 *conn = NULL;
const char *err;
sqlite3_stmt *res;
char *query;
int rc = sqlite3_open_v2("", &conn, SQLITE_OPEN_MEMORY|SQLITE_OPEN_READONLY, NULL);
if (rc != SQLITE_OK) {
sqlite3_close(conn);
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION),
errmsg("Failed to open in-memory SQLite for JSONB creating, result code %d", rc)));
}
query = psprintf("select jsonb('%s') j;", s);
rc = sqlite3_prepare_v2(conn, query, -1, &res, 0);
if (rc != SQLITE_OK) {
err = sqlite3_errmsg(conn);
sqlite3_close(conn);
pfree(query);
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION),
errmsg("Failed to fetch JSONb, result code %d, error %s", rc, err)));
}
rc = sqlite3_step(res);
if (rc == SQLITE_ROW) {
sqlite3_value *val = sqlite3_column_value(res, 0);
int sqlite_value_affinity = sqlite3_value_type(val);
const char *dat1 = sqlite3_value_blob(val);
if(sqlite_value_affinity != SQLITE_BLOB)
{
sqlite3_finalize(res);
pfree(query);
sqlite3_close(conn);
ereport(ERROR,
(errcode(ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION),
errmsg("Failed to fetch JSONb, not a BLOB result, affinity code %d, %s", sqlite_value_affinity, query)));
}
len = sqlite3_column_bytes(res, 0);
dat = palloc(len + 1);
memcpy(dat, dat1, len);
}
sqlite3_finalize(res);
pfree(query);
sqlite3_close(conn);
return (struct blobOutput){dat, len};
}
================================================
FILE: test.sh
================================================
#!/bin/bash
# Usage:
# ./test.sh -- test without GIS support
# ./test.sh ENABLE_GIS -- test with GIS support
testdir='/tmp/sqlite_fdw_test';
rm -rf "$testdir";
mkdir "$testdir";
cp -a sql/init_data/*.data "$testdir";
if [ -z "$SQLITE_FOR_TESTING_DIR" ]; then
sqlite3=sqlite3;
else
sqlite3="$SQLITE_FOR_TESTING_DIR/bin/sqlite3";
fi
"$sqlite3" "$testdir/post.db" < sql/init_data/init_post.sql;
"$sqlite3" "$testdir/core.db" < sql/init_data/init_core.sql;
"$sqlite3" "$testdir/common.db" < sql/init_data/init.sql;
"$sqlite3" "$testdir/selectfunc.db" < sql/init_data/init_selectfunc.sql;
# full test sequence,
# you can put your own test sequence here by following example
# undefined REGRESS environment variable will cause full test sequence from Makefile
#export REGRESS="extra/sqlite_fdw_post extra/test2 test3 types/test4 .... ";
make clean $@;
make $@;
make check $@ | tee make_check.out;